mirror of
https://github.com/WhitestormJS/whs.js.git
synced 2025-12-08 20:26:23 +00:00
47956 lines
4.2 MiB
47956 lines
4.2 MiB
/* Built for whs v2.2.0-beta.0 */
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
typeof define === 'function' && define.amd ? define(factory) :
|
|
(global.DatGUIModule = factory());
|
|
}(this, (function () { 'use strict';
|
|
|
|
function createCommonjsModule(fn, module) {
|
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
|
}
|
|
|
|
var dat_gui = createCommonjsModule(function (module) {
|
|
/**
|
|
* dat-gui JavaScript Controller Library
|
|
* http://code.google.com/p/dat-gui
|
|
*
|
|
* Copyright 2011 Data Arts Team, Google Creative Lab
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*/
|
|
|
|
/** @namespace */
|
|
var dat = module.exports = dat || {};
|
|
|
|
/** @namespace */
|
|
dat.gui = dat.gui || {};
|
|
|
|
/** @namespace */
|
|
dat.utils = dat.utils || {};
|
|
|
|
/** @namespace */
|
|
dat.controllers = dat.controllers || {};
|
|
|
|
/** @namespace */
|
|
dat.dom = dat.dom || {};
|
|
|
|
/** @namespace */
|
|
dat.color = dat.color || {};
|
|
|
|
dat.utils.css = (function () {
|
|
return {
|
|
load: function (url, doc) {
|
|
doc = doc || document;
|
|
var link = doc.createElement('link');
|
|
link.type = 'text/css';
|
|
link.rel = 'stylesheet';
|
|
link.href = url;
|
|
doc.getElementsByTagName('head')[0].appendChild(link);
|
|
},
|
|
inject: function(css, doc) {
|
|
doc = doc || document;
|
|
var injected = document.createElement('style');
|
|
injected.type = 'text/css';
|
|
injected.innerHTML = css;
|
|
doc.getElementsByTagName('head')[0].appendChild(injected);
|
|
}
|
|
}
|
|
})();
|
|
|
|
|
|
dat.utils.common = (function () {
|
|
|
|
var ARR_EACH = Array.prototype.forEach;
|
|
var ARR_SLICE = Array.prototype.slice;
|
|
|
|
/**
|
|
* Band-aid methods for things that should be a lot easier in JavaScript.
|
|
* Implementation and structure inspired by underscore.js
|
|
* http://documentcloud.github.com/underscore/
|
|
*/
|
|
|
|
return {
|
|
|
|
BREAK: {},
|
|
|
|
extend: function(target) {
|
|
|
|
this.each(ARR_SLICE.call(arguments, 1), function(obj) {
|
|
|
|
for (var key in obj)
|
|
if (!this.isUndefined(obj[key]))
|
|
target[key] = obj[key];
|
|
|
|
}, this);
|
|
|
|
return target;
|
|
|
|
},
|
|
|
|
defaults: function(target) {
|
|
|
|
this.each(ARR_SLICE.call(arguments, 1), function(obj) {
|
|
|
|
for (var key in obj)
|
|
if (this.isUndefined(target[key]))
|
|
target[key] = obj[key];
|
|
|
|
}, this);
|
|
|
|
return target;
|
|
|
|
},
|
|
|
|
compose: function() {
|
|
var toCall = ARR_SLICE.call(arguments);
|
|
return function() {
|
|
var args = ARR_SLICE.call(arguments);
|
|
for (var i = toCall.length -1; i >= 0; i--) {
|
|
args = [toCall[i].apply(this, args)];
|
|
}
|
|
return args[0];
|
|
}
|
|
},
|
|
|
|
each: function(obj, itr, scope) {
|
|
|
|
|
|
if (ARR_EACH && obj.forEach === ARR_EACH) {
|
|
|
|
obj.forEach(itr, scope);
|
|
|
|
} else if (obj.length === obj.length + 0) { // Is number but not NaN
|
|
|
|
for (var key = 0, l = obj.length; key < l; key++)
|
|
if (key in obj && itr.call(scope, obj[key], key) === this.BREAK)
|
|
return;
|
|
|
|
} else {
|
|
|
|
for (var key in obj)
|
|
if (itr.call(scope, obj[key], key) === this.BREAK)
|
|
return;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
defer: function(fnc) {
|
|
setTimeout(fnc, 0);
|
|
},
|
|
|
|
toArray: function(obj) {
|
|
if (obj.toArray) return obj.toArray();
|
|
return ARR_SLICE.call(obj);
|
|
},
|
|
|
|
isUndefined: function(obj) {
|
|
return obj === undefined;
|
|
},
|
|
|
|
isNull: function(obj) {
|
|
return obj === null;
|
|
},
|
|
|
|
isNaN: function(obj) {
|
|
return obj !== obj;
|
|
},
|
|
|
|
isArray: Array.isArray || function(obj) {
|
|
return obj.constructor === Array;
|
|
},
|
|
|
|
isObject: function(obj) {
|
|
return obj === Object(obj);
|
|
},
|
|
|
|
isNumber: function(obj) {
|
|
return obj === obj+0;
|
|
},
|
|
|
|
isString: function(obj) {
|
|
return obj === obj+'';
|
|
},
|
|
|
|
isBoolean: function(obj) {
|
|
return obj === false || obj === true;
|
|
},
|
|
|
|
isFunction: function(obj) {
|
|
return Object.prototype.toString.call(obj) === '[object Function]';
|
|
}
|
|
|
|
};
|
|
|
|
})();
|
|
|
|
|
|
dat.controllers.Controller = (function (common) {
|
|
|
|
/**
|
|
* @class An "abstract" class that represents a given property of an object.
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var Controller = function(object, property) {
|
|
|
|
this.initialValue = object[property];
|
|
|
|
/**
|
|
* Those who extend this class will put their DOM elements in here.
|
|
* @type {DOMElement}
|
|
*/
|
|
this.domElement = document.createElement('div');
|
|
|
|
/**
|
|
* The object to manipulate
|
|
* @type {Object}
|
|
*/
|
|
this.object = object;
|
|
|
|
/**
|
|
* The name of the property to manipulate
|
|
* @type {String}
|
|
*/
|
|
this.property = property;
|
|
|
|
/**
|
|
* The function to be called on change.
|
|
* @type {Function}
|
|
* @ignore
|
|
*/
|
|
this.__onChange = undefined;
|
|
|
|
/**
|
|
* The function to be called on finishing change.
|
|
* @type {Function}
|
|
* @ignore
|
|
*/
|
|
this.__onFinishChange = undefined;
|
|
|
|
};
|
|
|
|
common.extend(
|
|
|
|
Controller.prototype,
|
|
|
|
/** @lends dat.controllers.Controller.prototype */
|
|
{
|
|
|
|
/**
|
|
* Specify that a function fire every time someone changes the value with
|
|
* this Controller.
|
|
*
|
|
* @param {Function} fnc This function will be called whenever the value
|
|
* is modified via this Controller.
|
|
* @returns {dat.controllers.Controller} this
|
|
*/
|
|
onChange: function(fnc) {
|
|
this.__onChange = fnc;
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Specify that a function fire every time someone "finishes" changing
|
|
* the value wih this Controller. Useful for values that change
|
|
* incrementally like numbers or strings.
|
|
*
|
|
* @param {Function} fnc This function will be called whenever
|
|
* someone "finishes" changing the value via this Controller.
|
|
* @returns {dat.controllers.Controller} this
|
|
*/
|
|
onFinishChange: function(fnc) {
|
|
this.__onFinishChange = fnc;
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Change the value of <code>object[property]</code>
|
|
*
|
|
* @param {Object} newValue The new value of <code>object[property]</code>
|
|
*/
|
|
setValue: function(newValue) {
|
|
this.object[this.property] = newValue;
|
|
if (this.__onChange) {
|
|
this.__onChange.call(this, newValue);
|
|
}
|
|
this.updateDisplay();
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Gets the value of <code>object[property]</code>
|
|
*
|
|
* @returns {Object} The current value of <code>object[property]</code>
|
|
*/
|
|
getValue: function() {
|
|
return this.object[this.property];
|
|
},
|
|
|
|
/**
|
|
* Refreshes the visual display of a Controller in order to keep sync
|
|
* with the object's current value.
|
|
* @returns {dat.controllers.Controller} this
|
|
*/
|
|
updateDisplay: function() {
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* @returns {Boolean} true if the value has deviated from initialValue
|
|
*/
|
|
isModified: function() {
|
|
return this.initialValue !== this.getValue()
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
return Controller;
|
|
|
|
|
|
})(dat.utils.common);
|
|
|
|
|
|
dat.dom.dom = (function (common) {
|
|
|
|
var EVENT_MAP = {
|
|
'HTMLEvents': ['change'],
|
|
'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],
|
|
'KeyboardEvents': ['keydown']
|
|
};
|
|
|
|
var EVENT_MAP_INV = {};
|
|
common.each(EVENT_MAP, function(v, k) {
|
|
common.each(v, function(e) {
|
|
EVENT_MAP_INV[e] = k;
|
|
});
|
|
});
|
|
|
|
var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/;
|
|
|
|
function cssValueToPixels(val) {
|
|
|
|
if (val === '0' || common.isUndefined(val)) return 0;
|
|
|
|
var match = val.match(CSS_VALUE_PIXELS);
|
|
|
|
if (!common.isNull(match)) {
|
|
return parseFloat(match[1]);
|
|
}
|
|
|
|
// TODO ...ems? %?
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/**
|
|
* @namespace
|
|
* @member dat.dom
|
|
*/
|
|
var dom = {
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param selectable
|
|
*/
|
|
makeSelectable: function(elem, selectable) {
|
|
|
|
if (elem === undefined || elem.style === undefined) return;
|
|
|
|
elem.onselectstart = selectable ? function() {
|
|
return false;
|
|
} : function() {
|
|
};
|
|
|
|
elem.style.MozUserSelect = selectable ? 'auto' : 'none';
|
|
elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';
|
|
elem.unselectable = selectable ? 'on' : 'off';
|
|
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param horizontal
|
|
* @param vertical
|
|
*/
|
|
makeFullscreen: function(elem, horizontal, vertical) {
|
|
|
|
if (common.isUndefined(horizontal)) horizontal = true;
|
|
if (common.isUndefined(vertical)) vertical = true;
|
|
|
|
elem.style.position = 'absolute';
|
|
|
|
if (horizontal) {
|
|
elem.style.left = 0;
|
|
elem.style.right = 0;
|
|
}
|
|
if (vertical) {
|
|
elem.style.top = 0;
|
|
elem.style.bottom = 0;
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param eventType
|
|
* @param params
|
|
*/
|
|
fakeEvent: function(elem, eventType, params, aux) {
|
|
params = params || {};
|
|
var className = EVENT_MAP_INV[eventType];
|
|
if (!className) {
|
|
throw new Error('Event type ' + eventType + ' not supported.');
|
|
}
|
|
var evt = document.createEvent(className);
|
|
switch (className) {
|
|
case 'MouseEvents':
|
|
var clientX = params.x || params.clientX || 0;
|
|
var clientY = params.y || params.clientY || 0;
|
|
evt.initMouseEvent(eventType, params.bubbles || false,
|
|
params.cancelable || true, window, params.clickCount || 1,
|
|
0, //screen X
|
|
0, //screen Y
|
|
clientX, //client X
|
|
clientY, //client Y
|
|
false, false, false, false, 0, null);
|
|
break;
|
|
case 'KeyboardEvents':
|
|
var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz
|
|
common.defaults(params, {
|
|
cancelable: true,
|
|
ctrlKey: false,
|
|
altKey: false,
|
|
shiftKey: false,
|
|
metaKey: false,
|
|
keyCode: undefined,
|
|
charCode: undefined
|
|
});
|
|
init(eventType, params.bubbles || false,
|
|
params.cancelable, window,
|
|
params.ctrlKey, params.altKey,
|
|
params.shiftKey, params.metaKey,
|
|
params.keyCode, params.charCode);
|
|
break;
|
|
default:
|
|
evt.initEvent(eventType, params.bubbles || false,
|
|
params.cancelable || true);
|
|
break;
|
|
}
|
|
common.defaults(evt, aux);
|
|
elem.dispatchEvent(evt);
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param event
|
|
* @param func
|
|
* @param bool
|
|
*/
|
|
bind: function(elem, event, func, bool) {
|
|
bool = bool || false;
|
|
if (elem.addEventListener)
|
|
elem.addEventListener(event, func, bool);
|
|
else if (elem.attachEvent)
|
|
elem.attachEvent('on' + event, func);
|
|
return dom;
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param event
|
|
* @param func
|
|
* @param bool
|
|
*/
|
|
unbind: function(elem, event, func, bool) {
|
|
bool = bool || false;
|
|
if (elem.removeEventListener)
|
|
elem.removeEventListener(event, func, bool);
|
|
else if (elem.detachEvent)
|
|
elem.detachEvent('on' + event, func);
|
|
return dom;
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param className
|
|
*/
|
|
addClass: function(elem, className) {
|
|
if (elem.className === undefined) {
|
|
elem.className = className;
|
|
} else if (elem.className !== className) {
|
|
var classes = elem.className.split(/ +/);
|
|
if (classes.indexOf(className) == -1) {
|
|
classes.push(className);
|
|
elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, '');
|
|
}
|
|
}
|
|
return dom;
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
* @param className
|
|
*/
|
|
removeClass: function(elem, className) {
|
|
if (className) {
|
|
if (elem.className === undefined) ; else if (elem.className === className) {
|
|
elem.removeAttribute('class');
|
|
} else {
|
|
var classes = elem.className.split(/ +/);
|
|
var index = classes.indexOf(className);
|
|
if (index != -1) {
|
|
classes.splice(index, 1);
|
|
elem.className = classes.join(' ');
|
|
}
|
|
}
|
|
} else {
|
|
elem.className = undefined;
|
|
}
|
|
return dom;
|
|
},
|
|
|
|
hasClass: function(elem, className) {
|
|
return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false;
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
*/
|
|
getWidth: function(elem) {
|
|
|
|
var style = getComputedStyle(elem);
|
|
|
|
return cssValueToPixels(style['border-left-width']) +
|
|
cssValueToPixels(style['border-right-width']) +
|
|
cssValueToPixels(style['padding-left']) +
|
|
cssValueToPixels(style['padding-right']) +
|
|
cssValueToPixels(style['width']);
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
*/
|
|
getHeight: function(elem) {
|
|
|
|
var style = getComputedStyle(elem);
|
|
|
|
return cssValueToPixels(style['border-top-width']) +
|
|
cssValueToPixels(style['border-bottom-width']) +
|
|
cssValueToPixels(style['padding-top']) +
|
|
cssValueToPixels(style['padding-bottom']) +
|
|
cssValueToPixels(style['height']);
|
|
},
|
|
|
|
/**
|
|
*
|
|
* @param elem
|
|
*/
|
|
getOffset: function(elem) {
|
|
var offset = {left: 0, top:0};
|
|
if (elem.offsetParent) {
|
|
do {
|
|
offset.left += elem.offsetLeft;
|
|
offset.top += elem.offsetTop;
|
|
} while (elem = elem.offsetParent);
|
|
}
|
|
return offset;
|
|
},
|
|
|
|
// http://stackoverflow.com/posts/2684561/revisions
|
|
/**
|
|
*
|
|
* @param elem
|
|
*/
|
|
isActive: function(elem) {
|
|
return elem === document.activeElement && ( elem.type || elem.href );
|
|
}
|
|
|
|
};
|
|
|
|
return dom;
|
|
|
|
})(dat.utils.common);
|
|
|
|
|
|
dat.controllers.OptionController = (function (Controller, dom, common) {
|
|
|
|
/**
|
|
* @class Provides a select input to alter the property of an object, using a
|
|
* list of accepted values.
|
|
*
|
|
* @extends dat.controllers.Controller
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
* @param {Object|string[]} options A map of labels to acceptable values, or
|
|
* a list of acceptable string values.
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var OptionController = function(object, property, options) {
|
|
|
|
OptionController.superclass.call(this, object, property);
|
|
|
|
var _this = this;
|
|
|
|
/**
|
|
* The drop down menu
|
|
* @ignore
|
|
*/
|
|
this.__select = document.createElement('select');
|
|
|
|
if (common.isArray(options)) {
|
|
var map = {};
|
|
common.each(options, function(element) {
|
|
map[element] = element;
|
|
});
|
|
options = map;
|
|
}
|
|
|
|
common.each(options, function(value, key) {
|
|
|
|
var opt = document.createElement('option');
|
|
opt.innerHTML = key;
|
|
opt.setAttribute('value', value);
|
|
_this.__select.appendChild(opt);
|
|
|
|
});
|
|
|
|
// Acknowledge original value
|
|
this.updateDisplay();
|
|
|
|
dom.bind(this.__select, 'change', function() {
|
|
var desiredValue = this.options[this.selectedIndex].value;
|
|
_this.setValue(desiredValue);
|
|
});
|
|
|
|
this.domElement.appendChild(this.__select);
|
|
|
|
};
|
|
|
|
OptionController.superclass = Controller;
|
|
|
|
common.extend(
|
|
|
|
OptionController.prototype,
|
|
Controller.prototype,
|
|
|
|
{
|
|
|
|
setValue: function(v) {
|
|
var toReturn = OptionController.superclass.prototype.setValue.call(this, v);
|
|
if (this.__onFinishChange) {
|
|
this.__onFinishChange.call(this, this.getValue());
|
|
}
|
|
return toReturn;
|
|
},
|
|
|
|
updateDisplay: function() {
|
|
this.__select.value = this.getValue();
|
|
return OptionController.superclass.prototype.updateDisplay.call(this);
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
return OptionController;
|
|
|
|
})(dat.controllers.Controller,
|
|
dat.dom.dom,
|
|
dat.utils.common);
|
|
|
|
|
|
dat.controllers.NumberController = (function (Controller, common) {
|
|
|
|
/**
|
|
* @class Represents a given property of an object that is a number.
|
|
*
|
|
* @extends dat.controllers.Controller
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
* @param {Object} [params] Optional parameters
|
|
* @param {Number} [params.min] Minimum allowed value
|
|
* @param {Number} [params.max] Maximum allowed value
|
|
* @param {Number} [params.step] Increment by which to change value
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var NumberController = function(object, property, params) {
|
|
|
|
NumberController.superclass.call(this, object, property);
|
|
|
|
params = params || {};
|
|
|
|
this.__min = params.min;
|
|
this.__max = params.max;
|
|
this.__step = params.step;
|
|
|
|
if (common.isUndefined(this.__step)) {
|
|
|
|
if (this.initialValue == 0) {
|
|
this.__impliedStep = 1; // What are we, psychics?
|
|
} else {
|
|
// Hey Doug, check this out.
|
|
this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;
|
|
}
|
|
|
|
} else {
|
|
|
|
this.__impliedStep = this.__step;
|
|
|
|
}
|
|
|
|
this.__precision = numDecimals(this.__impliedStep);
|
|
|
|
|
|
};
|
|
|
|
NumberController.superclass = Controller;
|
|
|
|
common.extend(
|
|
|
|
NumberController.prototype,
|
|
Controller.prototype,
|
|
|
|
/** @lends dat.controllers.NumberController.prototype */
|
|
{
|
|
|
|
setValue: function(v) {
|
|
|
|
if (this.__min !== undefined && v < this.__min) {
|
|
v = this.__min;
|
|
} else if (this.__max !== undefined && v > this.__max) {
|
|
v = this.__max;
|
|
}
|
|
|
|
if (this.__step !== undefined && v % this.__step != 0) {
|
|
v = Math.round(v / this.__step) * this.__step;
|
|
}
|
|
|
|
return NumberController.superclass.prototype.setValue.call(this, v);
|
|
|
|
},
|
|
|
|
/**
|
|
* Specify a minimum value for <code>object[property]</code>.
|
|
*
|
|
* @param {Number} minValue The minimum value for
|
|
* <code>object[property]</code>
|
|
* @returns {dat.controllers.NumberController} this
|
|
*/
|
|
min: function(v) {
|
|
this.__min = v;
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Specify a maximum value for <code>object[property]</code>.
|
|
*
|
|
* @param {Number} maxValue The maximum value for
|
|
* <code>object[property]</code>
|
|
* @returns {dat.controllers.NumberController} this
|
|
*/
|
|
max: function(v) {
|
|
this.__max = v;
|
|
return this;
|
|
},
|
|
|
|
/**
|
|
* Specify a step value that dat.controllers.NumberController
|
|
* increments by.
|
|
*
|
|
* @param {Number} stepValue The step value for
|
|
* dat.controllers.NumberController
|
|
* @default if minimum and maximum specified increment is 1% of the
|
|
* difference otherwise stepValue is 1
|
|
* @returns {dat.controllers.NumberController} this
|
|
*/
|
|
step: function(v) {
|
|
this.__step = v;
|
|
return this;
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
function numDecimals(x) {
|
|
x = x.toString();
|
|
if (x.indexOf('.') > -1) {
|
|
return x.length - x.indexOf('.') - 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return NumberController;
|
|
|
|
})(dat.controllers.Controller,
|
|
dat.utils.common);
|
|
|
|
|
|
dat.controllers.NumberControllerBox = (function (NumberController, dom, common) {
|
|
|
|
/**
|
|
* @class Represents a given property of an object that is a number and
|
|
* provides an input element with which to manipulate it.
|
|
*
|
|
* @extends dat.controllers.Controller
|
|
* @extends dat.controllers.NumberController
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
* @param {Object} [params] Optional parameters
|
|
* @param {Number} [params.min] Minimum allowed value
|
|
* @param {Number} [params.max] Maximum allowed value
|
|
* @param {Number} [params.step] Increment by which to change value
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var NumberControllerBox = function(object, property, params) {
|
|
|
|
this.__truncationSuspended = false;
|
|
|
|
NumberControllerBox.superclass.call(this, object, property, params);
|
|
|
|
var _this = this;
|
|
|
|
/**
|
|
* {Number} Previous mouse y position
|
|
* @ignore
|
|
*/
|
|
var prev_y;
|
|
|
|
this.__input = document.createElement('input');
|
|
this.__input.setAttribute('type', 'text');
|
|
|
|
// Makes it so manually specified values are not truncated.
|
|
|
|
dom.bind(this.__input, 'change', onChange);
|
|
dom.bind(this.__input, 'blur', onBlur);
|
|
dom.bind(this.__input, 'mousedown', onMouseDown);
|
|
dom.bind(this.__input, 'keydown', function(e) {
|
|
|
|
// When pressing entire, you can be as precise as you want.
|
|
if (e.keyCode === 13) {
|
|
_this.__truncationSuspended = true;
|
|
this.blur();
|
|
_this.__truncationSuspended = false;
|
|
}
|
|
|
|
});
|
|
|
|
function onChange() {
|
|
var attempted = parseFloat(_this.__input.value);
|
|
if (!common.isNaN(attempted)) _this.setValue(attempted);
|
|
}
|
|
|
|
function onBlur() {
|
|
onChange();
|
|
if (_this.__onFinishChange) {
|
|
_this.__onFinishChange.call(_this, _this.getValue());
|
|
}
|
|
}
|
|
|
|
function onMouseDown(e) {
|
|
dom.bind(window, 'mousemove', onMouseDrag);
|
|
dom.bind(window, 'mouseup', onMouseUp);
|
|
prev_y = e.clientY;
|
|
}
|
|
|
|
function onMouseDrag(e) {
|
|
|
|
var diff = prev_y - e.clientY;
|
|
_this.setValue(_this.getValue() + diff * _this.__impliedStep);
|
|
|
|
prev_y = e.clientY;
|
|
|
|
}
|
|
|
|
function onMouseUp() {
|
|
dom.unbind(window, 'mousemove', onMouseDrag);
|
|
dom.unbind(window, 'mouseup', onMouseUp);
|
|
}
|
|
|
|
this.updateDisplay();
|
|
|
|
this.domElement.appendChild(this.__input);
|
|
|
|
};
|
|
|
|
NumberControllerBox.superclass = NumberController;
|
|
|
|
common.extend(
|
|
|
|
NumberControllerBox.prototype,
|
|
NumberController.prototype,
|
|
|
|
{
|
|
|
|
updateDisplay: function() {
|
|
|
|
this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);
|
|
return NumberControllerBox.superclass.prototype.updateDisplay.call(this);
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
function roundToDecimal(value, decimals) {
|
|
var tenTo = Math.pow(10, decimals);
|
|
return Math.round(value * tenTo) / tenTo;
|
|
}
|
|
|
|
return NumberControllerBox;
|
|
|
|
})(dat.controllers.NumberController,
|
|
dat.dom.dom,
|
|
dat.utils.common);
|
|
|
|
|
|
dat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {
|
|
|
|
/**
|
|
* @class Represents a given property of an object that is a number, contains
|
|
* a minimum and maximum, and provides a slider element with which to
|
|
* manipulate it. It should be noted that the slider element is made up of
|
|
* <code><div></code> tags, <strong>not</strong> the html5
|
|
* <code><slider></code> element.
|
|
*
|
|
* @extends dat.controllers.Controller
|
|
* @extends dat.controllers.NumberController
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
* @param {Number} minValue Minimum allowed value
|
|
* @param {Number} maxValue Maximum allowed value
|
|
* @param {Number} stepValue Increment by which to change value
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var NumberControllerSlider = function(object, property, min, max, step) {
|
|
|
|
NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });
|
|
|
|
var _this = this;
|
|
|
|
this.__background = document.createElement('div');
|
|
this.__foreground = document.createElement('div');
|
|
|
|
|
|
|
|
dom.bind(this.__background, 'mousedown', onMouseDown);
|
|
|
|
dom.addClass(this.__background, 'slider');
|
|
dom.addClass(this.__foreground, 'slider-fg');
|
|
|
|
function onMouseDown(e) {
|
|
|
|
dom.bind(window, 'mousemove', onMouseDrag);
|
|
dom.bind(window, 'mouseup', onMouseUp);
|
|
|
|
onMouseDrag(e);
|
|
}
|
|
|
|
function onMouseDrag(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var offset = dom.getOffset(_this.__background);
|
|
var width = dom.getWidth(_this.__background);
|
|
|
|
_this.setValue(
|
|
map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)
|
|
);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
function onMouseUp() {
|
|
dom.unbind(window, 'mousemove', onMouseDrag);
|
|
dom.unbind(window, 'mouseup', onMouseUp);
|
|
if (_this.__onFinishChange) {
|
|
_this.__onFinishChange.call(_this, _this.getValue());
|
|
}
|
|
}
|
|
|
|
this.updateDisplay();
|
|
|
|
this.__background.appendChild(this.__foreground);
|
|
this.domElement.appendChild(this.__background);
|
|
|
|
};
|
|
|
|
NumberControllerSlider.superclass = NumberController;
|
|
|
|
/**
|
|
* Injects default stylesheet for slider elements.
|
|
*/
|
|
NumberControllerSlider.useDefaultStyles = function() {
|
|
css.inject(styleSheet);
|
|
};
|
|
|
|
common.extend(
|
|
|
|
NumberControllerSlider.prototype,
|
|
NumberController.prototype,
|
|
|
|
{
|
|
|
|
updateDisplay: function() {
|
|
var pct = (this.getValue() - this.__min)/(this.__max - this.__min);
|
|
this.__foreground.style.width = pct*100+'%';
|
|
return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
);
|
|
|
|
function map(v, i1, i2, o1, o2) {
|
|
return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));
|
|
}
|
|
|
|
return NumberControllerSlider;
|
|
|
|
})(dat.controllers.NumberController,
|
|
dat.dom.dom,
|
|
dat.utils.css,
|
|
dat.utils.common,
|
|
".slider {\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\n height: 1em;\n border-radius: 1em;\n background-color: #eee;\n padding: 0 0.5em;\n overflow: hidden;\n}\n\n.slider-fg {\n padding: 1px 0 2px 0;\n background-color: #aaa;\n height: 1em;\n margin-left: -0.5em;\n padding-right: 0.5em;\n border-radius: 1em 0 0 1em;\n}\n\n.slider-fg:after {\n display: inline-block;\n border-radius: 1em;\n background-color: #fff;\n border: 1px solid #aaa;\n content: '';\n float: right;\n margin-right: -1em;\n margin-top: -1px;\n height: 0.9em;\n width: 0.9em;\n}");
|
|
|
|
|
|
dat.controllers.FunctionController = (function (Controller, dom, common) {
|
|
|
|
/**
|
|
* @class Provides a GUI interface to fire a specified method, a property of an object.
|
|
*
|
|
* @extends dat.controllers.Controller
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var FunctionController = function(object, property, text) {
|
|
|
|
FunctionController.superclass.call(this, object, property);
|
|
|
|
var _this = this;
|
|
|
|
this.__button = document.createElement('div');
|
|
this.__button.innerHTML = text === undefined ? 'Fire' : text;
|
|
dom.bind(this.__button, 'click', function(e) {
|
|
e.preventDefault();
|
|
_this.fire();
|
|
return false;
|
|
});
|
|
|
|
dom.addClass(this.__button, 'button');
|
|
|
|
this.domElement.appendChild(this.__button);
|
|
|
|
|
|
};
|
|
|
|
FunctionController.superclass = Controller;
|
|
|
|
common.extend(
|
|
|
|
FunctionController.prototype,
|
|
Controller.prototype,
|
|
{
|
|
|
|
fire: function() {
|
|
if (this.__onChange) {
|
|
this.__onChange.call(this);
|
|
}
|
|
if (this.__onFinishChange) {
|
|
this.__onFinishChange.call(this, this.getValue());
|
|
}
|
|
this.getValue().call(this.object);
|
|
}
|
|
}
|
|
|
|
);
|
|
|
|
return FunctionController;
|
|
|
|
})(dat.controllers.Controller,
|
|
dat.dom.dom,
|
|
dat.utils.common);
|
|
|
|
|
|
dat.controllers.BooleanController = (function (Controller, dom, common) {
|
|
|
|
/**
|
|
* @class Provides a checkbox input to alter the boolean property of an object.
|
|
* @extends dat.controllers.Controller
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var BooleanController = function(object, property) {
|
|
|
|
BooleanController.superclass.call(this, object, property);
|
|
|
|
var _this = this;
|
|
this.__prev = this.getValue();
|
|
|
|
this.__checkbox = document.createElement('input');
|
|
this.__checkbox.setAttribute('type', 'checkbox');
|
|
|
|
|
|
dom.bind(this.__checkbox, 'change', onChange, false);
|
|
|
|
this.domElement.appendChild(this.__checkbox);
|
|
|
|
// Match original value
|
|
this.updateDisplay();
|
|
|
|
function onChange() {
|
|
_this.setValue(!_this.__prev);
|
|
}
|
|
|
|
};
|
|
|
|
BooleanController.superclass = Controller;
|
|
|
|
common.extend(
|
|
|
|
BooleanController.prototype,
|
|
Controller.prototype,
|
|
|
|
{
|
|
|
|
setValue: function(v) {
|
|
var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);
|
|
if (this.__onFinishChange) {
|
|
this.__onFinishChange.call(this, this.getValue());
|
|
}
|
|
this.__prev = this.getValue();
|
|
return toReturn;
|
|
},
|
|
|
|
updateDisplay: function() {
|
|
|
|
if (this.getValue() === true) {
|
|
this.__checkbox.setAttribute('checked', 'checked');
|
|
this.__checkbox.checked = true;
|
|
} else {
|
|
this.__checkbox.checked = false;
|
|
}
|
|
|
|
return BooleanController.superclass.prototype.updateDisplay.call(this);
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
);
|
|
|
|
return BooleanController;
|
|
|
|
})(dat.controllers.Controller,
|
|
dat.dom.dom,
|
|
dat.utils.common);
|
|
|
|
|
|
dat.color.toString = (function (common) {
|
|
|
|
return function(color) {
|
|
|
|
if (color.a == 1 || common.isUndefined(color.a)) {
|
|
|
|
var s = color.hex.toString(16);
|
|
while (s.length < 6) {
|
|
s = '0' + s;
|
|
}
|
|
|
|
return '#' + s;
|
|
|
|
} else {
|
|
|
|
return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})(dat.utils.common);
|
|
|
|
|
|
dat.color.interpret = (function (toString, common) {
|
|
|
|
var result, toReturn;
|
|
|
|
var interpret = function() {
|
|
|
|
toReturn = false;
|
|
|
|
var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];
|
|
|
|
common.each(INTERPRETATIONS, function(family) {
|
|
|
|
if (family.litmus(original)) {
|
|
|
|
common.each(family.conversions, function(conversion, conversionName) {
|
|
|
|
result = conversion.read(original);
|
|
|
|
if (toReturn === false && result !== false) {
|
|
toReturn = result;
|
|
result.conversionName = conversionName;
|
|
result.conversion = conversion;
|
|
return common.BREAK;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return common.BREAK;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return toReturn;
|
|
|
|
};
|
|
|
|
var INTERPRETATIONS = [
|
|
|
|
// Strings
|
|
{
|
|
|
|
litmus: common.isString,
|
|
|
|
conversions: {
|
|
|
|
THREE_CHAR_HEX: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'HEX',
|
|
hex: parseInt(
|
|
'0x' +
|
|
test[1].toString() + test[1].toString() +
|
|
test[2].toString() + test[2].toString() +
|
|
test[3].toString() + test[3].toString())
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
},
|
|
|
|
SIX_CHAR_HEX: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^#([A-F0-9]{6})$/i);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'HEX',
|
|
hex: parseInt('0x' + test[1].toString())
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
},
|
|
|
|
CSS_RGB: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'RGB',
|
|
r: parseFloat(test[1]),
|
|
g: parseFloat(test[2]),
|
|
b: parseFloat(test[3])
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
},
|
|
|
|
CSS_RGBA: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'RGB',
|
|
r: parseFloat(test[1]),
|
|
g: parseFloat(test[2]),
|
|
b: parseFloat(test[3]),
|
|
a: parseFloat(test[4])
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Numbers
|
|
{
|
|
|
|
litmus: common.isNumber,
|
|
|
|
conversions: {
|
|
|
|
HEX: {
|
|
read: function(original) {
|
|
return {
|
|
space: 'HEX',
|
|
hex: original,
|
|
conversionName: 'HEX'
|
|
}
|
|
},
|
|
|
|
write: function(color) {
|
|
return color.hex;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Arrays
|
|
{
|
|
|
|
litmus: common.isArray,
|
|
|
|
conversions: {
|
|
|
|
RGB_ARRAY: {
|
|
read: function(original) {
|
|
if (original.length != 3) return false;
|
|
return {
|
|
space: 'RGB',
|
|
r: original[0],
|
|
g: original[1],
|
|
b: original[2]
|
|
};
|
|
},
|
|
|
|
write: function(color) {
|
|
return [color.r, color.g, color.b];
|
|
}
|
|
|
|
},
|
|
|
|
RGBA_ARRAY: {
|
|
read: function(original) {
|
|
if (original.length != 4) return false;
|
|
return {
|
|
space: 'RGB',
|
|
r: original[0],
|
|
g: original[1],
|
|
b: original[2],
|
|
a: original[3]
|
|
};
|
|
},
|
|
|
|
write: function(color) {
|
|
return [color.r, color.g, color.b, color.a];
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Objects
|
|
{
|
|
|
|
litmus: common.isObject,
|
|
|
|
conversions: {
|
|
|
|
RGBA_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.r) &&
|
|
common.isNumber(original.g) &&
|
|
common.isNumber(original.b) &&
|
|
common.isNumber(original.a)) {
|
|
return {
|
|
space: 'RGB',
|
|
r: original.r,
|
|
g: original.g,
|
|
b: original.b,
|
|
a: original.a
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
r: color.r,
|
|
g: color.g,
|
|
b: color.b,
|
|
a: color.a
|
|
}
|
|
}
|
|
},
|
|
|
|
RGB_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.r) &&
|
|
common.isNumber(original.g) &&
|
|
common.isNumber(original.b)) {
|
|
return {
|
|
space: 'RGB',
|
|
r: original.r,
|
|
g: original.g,
|
|
b: original.b
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
r: color.r,
|
|
g: color.g,
|
|
b: color.b
|
|
}
|
|
}
|
|
},
|
|
|
|
HSVA_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.h) &&
|
|
common.isNumber(original.s) &&
|
|
common.isNumber(original.v) &&
|
|
common.isNumber(original.a)) {
|
|
return {
|
|
space: 'HSV',
|
|
h: original.h,
|
|
s: original.s,
|
|
v: original.v,
|
|
a: original.a
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
h: color.h,
|
|
s: color.s,
|
|
v: color.v,
|
|
a: color.a
|
|
}
|
|
}
|
|
},
|
|
|
|
HSV_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.h) &&
|
|
common.isNumber(original.s) &&
|
|
common.isNumber(original.v)) {
|
|
return {
|
|
space: 'HSV',
|
|
h: original.h,
|
|
s: original.s,
|
|
v: original.v
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
h: color.h,
|
|
s: color.s,
|
|
v: color.v
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
];
|
|
|
|
return interpret;
|
|
|
|
|
|
})(dat.color.toString,
|
|
dat.utils.common);
|
|
|
|
|
|
dat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {
|
|
|
|
css.inject(styleSheet);
|
|
|
|
/** Outer-most className for GUI's */
|
|
var CSS_NAMESPACE = 'dg';
|
|
|
|
var HIDE_KEY_CODE = 72;
|
|
|
|
/** The only value shared between the JS and SCSS. Use caution. */
|
|
var CLOSE_BUTTON_HEIGHT = 20;
|
|
|
|
var DEFAULT_DEFAULT_PRESET_NAME = 'Default';
|
|
|
|
var SUPPORTS_LOCAL_STORAGE = (function() {
|
|
try {
|
|
return 'localStorage' in window && window['localStorage'] !== null;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
})();
|
|
|
|
var SAVE_DIALOGUE;
|
|
|
|
/** Have we yet to create an autoPlace GUI? */
|
|
var auto_place_virgin = true;
|
|
|
|
/** Fixed position div that auto place GUI's go inside */
|
|
var auto_place_container;
|
|
|
|
/** Are we hiding the GUI's ? */
|
|
var hide = false;
|
|
|
|
/** GUI's which should be hidden */
|
|
var hideable_guis = [];
|
|
|
|
/**
|
|
* A lightweight controller library for JavaScript. It allows you to easily
|
|
* manipulate variables and fire functions on the fly.
|
|
* @class
|
|
*
|
|
* @member dat.gui
|
|
*
|
|
* @param {Object} [params]
|
|
* @param {String} [params.name] The name of this GUI.
|
|
* @param {Object} [params.load] JSON object representing the saved state of
|
|
* this GUI.
|
|
* @param {Boolean} [params.auto=true]
|
|
* @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.
|
|
* @param {Boolean} [params.closed] If true, starts closed
|
|
*/
|
|
var GUI = function(params) {
|
|
|
|
var _this = this;
|
|
|
|
/**
|
|
* Outermost DOM Element
|
|
* @type DOMElement
|
|
*/
|
|
this.domElement = document.createElement('div');
|
|
this.__ul = document.createElement('ul');
|
|
this.domElement.appendChild(this.__ul);
|
|
|
|
dom.addClass(this.domElement, CSS_NAMESPACE);
|
|
|
|
/**
|
|
* Nested GUI's by name
|
|
* @ignore
|
|
*/
|
|
this.__folders = {};
|
|
|
|
this.__controllers = [];
|
|
|
|
/**
|
|
* List of objects I'm remembering for save, only used in top level GUI
|
|
* @ignore
|
|
*/
|
|
this.__rememberedObjects = [];
|
|
|
|
/**
|
|
* Maps the index of remembered objects to a map of controllers, only used
|
|
* in top level GUI.
|
|
*
|
|
* @private
|
|
* @ignore
|
|
*
|
|
* @example
|
|
* [
|
|
* {
|
|
* propertyName: Controller,
|
|
* anotherPropertyName: Controller
|
|
* },
|
|
* {
|
|
* propertyName: Controller
|
|
* }
|
|
* ]
|
|
*/
|
|
this.__rememberedObjectIndecesToControllers = [];
|
|
|
|
this.__listening = [];
|
|
|
|
params = params || {};
|
|
|
|
// Default parameters
|
|
params = common.defaults(params, {
|
|
autoPlace: true,
|
|
width: GUI.DEFAULT_WIDTH
|
|
});
|
|
|
|
params = common.defaults(params, {
|
|
resizable: params.autoPlace,
|
|
hideable: params.autoPlace
|
|
});
|
|
|
|
|
|
if (!common.isUndefined(params.load)) {
|
|
|
|
// Explicit preset
|
|
if (params.preset) params.load.preset = params.preset;
|
|
|
|
} else {
|
|
|
|
params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };
|
|
|
|
}
|
|
|
|
if (common.isUndefined(params.parent) && params.hideable) {
|
|
hideable_guis.push(this);
|
|
}
|
|
|
|
// Only root level GUI's are resizable.
|
|
params.resizable = common.isUndefined(params.parent) && params.resizable;
|
|
|
|
|
|
if (params.autoPlace && common.isUndefined(params.scrollable)) {
|
|
params.scrollable = true;
|
|
}
|
|
// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;
|
|
|
|
// Not part of params because I don't want people passing this in via
|
|
// constructor. Should be a 'remembered' value.
|
|
var use_local_storage =
|
|
SUPPORTS_LOCAL_STORAGE &&
|
|
localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';
|
|
|
|
Object.defineProperties(this,
|
|
|
|
/** @lends dat.gui.GUI.prototype */
|
|
{
|
|
|
|
/**
|
|
* The parent <code>GUI</code>
|
|
* @type dat.gui.GUI
|
|
*/
|
|
parent: {
|
|
get: function() {
|
|
return params.parent;
|
|
}
|
|
},
|
|
|
|
scrollable: {
|
|
get: function() {
|
|
return params.scrollable;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Handles <code>GUI</code>'s element placement for you
|
|
* @type Boolean
|
|
*/
|
|
autoPlace: {
|
|
get: function() {
|
|
return params.autoPlace;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* The identifier for a set of saved values
|
|
* @type String
|
|
*/
|
|
preset: {
|
|
|
|
get: function() {
|
|
if (_this.parent) {
|
|
return _this.getRoot().preset;
|
|
} else {
|
|
return params.load.preset;
|
|
}
|
|
},
|
|
|
|
set: function(v) {
|
|
if (_this.parent) {
|
|
_this.getRoot().preset = v;
|
|
} else {
|
|
params.load.preset = v;
|
|
}
|
|
setPresetSelectIndex(this);
|
|
_this.revert();
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* The width of <code>GUI</code> element
|
|
* @type Number
|
|
*/
|
|
width: {
|
|
get: function() {
|
|
return params.width;
|
|
},
|
|
set: function(v) {
|
|
params.width = v;
|
|
setWidth(_this, v);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* The name of <code>GUI</code>. Used for folders. i.e
|
|
* a folder's name
|
|
* @type String
|
|
*/
|
|
name: {
|
|
get: function() {
|
|
return params.name;
|
|
},
|
|
set: function(v) {
|
|
// TODO Check for collisions among sibling folders
|
|
params.name = v;
|
|
if (title_row_name) {
|
|
title_row_name.innerHTML = params.name;
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Whether the <code>GUI</code> is collapsed or not
|
|
* @type Boolean
|
|
*/
|
|
closed: {
|
|
get: function() {
|
|
return params.closed;
|
|
},
|
|
set: function(v) {
|
|
params.closed = v;
|
|
if (params.closed) {
|
|
dom.addClass(_this.__ul, GUI.CLASS_CLOSED);
|
|
} else {
|
|
dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);
|
|
}
|
|
// For browsers that aren't going to respect the CSS transition,
|
|
// Lets just check our height against the window height right off
|
|
// the bat.
|
|
this.onResize();
|
|
|
|
if (_this.__closeButton) {
|
|
_this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Contains all presets
|
|
* @type Object
|
|
*/
|
|
load: {
|
|
get: function() {
|
|
return params.load;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Determines whether or not to use <a href="https://developer.mozilla.org/en/DOM/Storage#localStorage">localStorage</a> as the means for
|
|
* <code>remember</code>ing
|
|
* @type Boolean
|
|
*/
|
|
useLocalStorage: {
|
|
|
|
get: function() {
|
|
return use_local_storage;
|
|
},
|
|
set: function(bool) {
|
|
if (SUPPORTS_LOCAL_STORAGE) {
|
|
use_local_storage = bool;
|
|
if (bool) {
|
|
dom.bind(window, 'unload', saveToLocalStorage);
|
|
} else {
|
|
dom.unbind(window, 'unload', saveToLocalStorage);
|
|
}
|
|
localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// Are we a root level GUI?
|
|
if (common.isUndefined(params.parent)) {
|
|
|
|
params.closed = false;
|
|
|
|
dom.addClass(this.domElement, GUI.CLASS_MAIN);
|
|
dom.makeSelectable(this.domElement, false);
|
|
|
|
// Are we supposed to be loading locally?
|
|
if (SUPPORTS_LOCAL_STORAGE) {
|
|
|
|
if (use_local_storage) {
|
|
|
|
_this.useLocalStorage = true;
|
|
|
|
var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));
|
|
|
|
if (saved_gui) {
|
|
params.load = JSON.parse(saved_gui);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.__closeButton = document.createElement('div');
|
|
this.__closeButton.innerHTML = GUI.TEXT_CLOSED;
|
|
dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);
|
|
this.domElement.appendChild(this.__closeButton);
|
|
|
|
dom.bind(this.__closeButton, 'click', function() {
|
|
|
|
_this.closed = !_this.closed;
|
|
|
|
|
|
});
|
|
|
|
|
|
// Oh, you're a nested GUI!
|
|
} else {
|
|
|
|
if (params.closed === undefined) {
|
|
params.closed = true;
|
|
}
|
|
|
|
var title_row_name = document.createTextNode(params.name);
|
|
dom.addClass(title_row_name, 'controller-name');
|
|
|
|
var title_row = addRow(_this, title_row_name);
|
|
|
|
var on_click_title = function(e) {
|
|
e.preventDefault();
|
|
_this.closed = !_this.closed;
|
|
return false;
|
|
};
|
|
|
|
dom.addClass(this.__ul, GUI.CLASS_CLOSED);
|
|
|
|
dom.addClass(title_row, 'title');
|
|
dom.bind(title_row, 'click', on_click_title);
|
|
|
|
if (!params.closed) {
|
|
this.closed = false;
|
|
}
|
|
|
|
}
|
|
|
|
if (params.autoPlace) {
|
|
|
|
if (common.isUndefined(params.parent)) {
|
|
|
|
if (auto_place_virgin) {
|
|
auto_place_container = document.createElement('div');
|
|
dom.addClass(auto_place_container, CSS_NAMESPACE);
|
|
dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);
|
|
document.body.appendChild(auto_place_container);
|
|
auto_place_virgin = false;
|
|
}
|
|
|
|
// Put it in the dom for you.
|
|
auto_place_container.appendChild(this.domElement);
|
|
|
|
// Apply the auto styles
|
|
dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);
|
|
|
|
}
|
|
|
|
|
|
// Make it not elastic.
|
|
if (!this.parent) setWidth(_this, params.width);
|
|
|
|
}
|
|
|
|
dom.bind(window, 'resize', function() { _this.onResize(); });
|
|
dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });
|
|
dom.bind(this.__ul, 'transitionend', function() { _this.onResize(); });
|
|
dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize(); });
|
|
this.onResize();
|
|
|
|
|
|
if (params.resizable) {
|
|
addResizeHandle(this);
|
|
}
|
|
|
|
function saveToLocalStorage() {
|
|
localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));
|
|
}
|
|
|
|
var root = _this.getRoot();
|
|
function resetWidth() {
|
|
var root = _this.getRoot();
|
|
root.width += 1;
|
|
common.defer(function() {
|
|
root.width -= 1;
|
|
});
|
|
}
|
|
|
|
if (!params.parent) {
|
|
resetWidth();
|
|
}
|
|
|
|
};
|
|
|
|
GUI.toggleHide = function() {
|
|
|
|
hide = !hide;
|
|
common.each(hideable_guis, function(gui) {
|
|
gui.domElement.style.zIndex = hide ? -999 : 999;
|
|
gui.domElement.style.opacity = hide ? 0 : 1;
|
|
});
|
|
};
|
|
|
|
GUI.CLASS_AUTO_PLACE = 'a';
|
|
GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';
|
|
GUI.CLASS_MAIN = 'main';
|
|
GUI.CLASS_CONTROLLER_ROW = 'cr';
|
|
GUI.CLASS_TOO_TALL = 'taller-than-window';
|
|
GUI.CLASS_CLOSED = 'closed';
|
|
GUI.CLASS_CLOSE_BUTTON = 'close-button';
|
|
GUI.CLASS_DRAG = 'drag';
|
|
|
|
GUI.DEFAULT_WIDTH = 245;
|
|
GUI.TEXT_CLOSED = 'Close Controls';
|
|
GUI.TEXT_OPEN = 'Open Controls';
|
|
|
|
dom.bind(window, 'keydown', function(e) {
|
|
|
|
if (document.activeElement.type !== 'text' &&
|
|
(e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {
|
|
GUI.toggleHide();
|
|
}
|
|
|
|
}, false);
|
|
|
|
common.extend(
|
|
|
|
GUI.prototype,
|
|
|
|
/** @lends dat.gui.GUI */
|
|
{
|
|
|
|
/**
|
|
* @param object
|
|
* @param property
|
|
* @returns {dat.controllers.Controller} The new controller that was added.
|
|
* @instance
|
|
*/
|
|
add: function(object, property) {
|
|
|
|
return add(
|
|
this,
|
|
object,
|
|
property,
|
|
{
|
|
factoryArgs: Array.prototype.slice.call(arguments, 2)
|
|
}
|
|
);
|
|
|
|
},
|
|
|
|
/**
|
|
* @param object
|
|
* @param property
|
|
* @returns {dat.controllers.ColorController} The new controller that was added.
|
|
* @instance
|
|
*/
|
|
addColor: function(object, property) {
|
|
|
|
return add(
|
|
this,
|
|
object,
|
|
property,
|
|
{
|
|
color: true
|
|
}
|
|
);
|
|
|
|
},
|
|
|
|
/**
|
|
* @param controller
|
|
* @instance
|
|
*/
|
|
remove: function(controller) {
|
|
|
|
// TODO listening?
|
|
this.__ul.removeChild(controller.__li);
|
|
this.__controllers.slice(this.__controllers.indexOf(controller), 1);
|
|
var _this = this;
|
|
common.defer(function() {
|
|
_this.onResize();
|
|
});
|
|
|
|
},
|
|
|
|
destroy: function() {
|
|
|
|
if (this.autoPlace) {
|
|
auto_place_container.removeChild(this.domElement);
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* @param name
|
|
* @returns {dat.gui.GUI} The new folder.
|
|
* @throws {Error} if this GUI already has a folder by the specified
|
|
* name
|
|
* @instance
|
|
*/
|
|
addFolder: function(name) {
|
|
|
|
// We have to prevent collisions on names in order to have a key
|
|
// by which to remember saved values
|
|
if (this.__folders[name] !== undefined) {
|
|
throw new Error('You already have a folder in this GUI by the' +
|
|
' name "' + name + '"');
|
|
}
|
|
|
|
var new_gui_params = { name: name, parent: this };
|
|
|
|
// We need to pass down the autoPlace trait so that we can
|
|
// attach event listeners to open/close folder actions to
|
|
// ensure that a scrollbar appears if the window is too short.
|
|
new_gui_params.autoPlace = this.autoPlace;
|
|
|
|
// Do we have saved appearance data for this folder?
|
|
|
|
if (this.load && // Anything loaded?
|
|
this.load.folders && // Was my parent a dead-end?
|
|
this.load.folders[name]) { // Did daddy remember me?
|
|
|
|
// Start me closed if I was closed
|
|
new_gui_params.closed = this.load.folders[name].closed;
|
|
|
|
// Pass down the loaded data
|
|
new_gui_params.load = this.load.folders[name];
|
|
|
|
}
|
|
|
|
var gui = new GUI(new_gui_params);
|
|
this.__folders[name] = gui;
|
|
|
|
var li = addRow(this, gui.domElement);
|
|
dom.addClass(li, 'folder');
|
|
return gui;
|
|
|
|
},
|
|
|
|
open: function() {
|
|
this.closed = false;
|
|
},
|
|
|
|
close: function() {
|
|
this.closed = true;
|
|
},
|
|
|
|
onResize: function() {
|
|
|
|
var root = this.getRoot();
|
|
|
|
if (root.scrollable) {
|
|
|
|
var top = dom.getOffset(root.__ul).top;
|
|
var h = 0;
|
|
|
|
common.each(root.__ul.childNodes, function(node) {
|
|
if (! (root.autoPlace && node === root.__save_row))
|
|
h += dom.getHeight(node);
|
|
});
|
|
|
|
if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {
|
|
dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);
|
|
root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';
|
|
} else {
|
|
dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);
|
|
root.__ul.style.height = 'auto';
|
|
}
|
|
|
|
}
|
|
|
|
if (root.__resize_handle) {
|
|
common.defer(function() {
|
|
root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';
|
|
});
|
|
}
|
|
|
|
if (root.__closeButton) {
|
|
root.__closeButton.style.width = root.width + 'px';
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* Mark objects for saving. The order of these objects cannot change as
|
|
* the GUI grows. When remembering new objects, append them to the end
|
|
* of the list.
|
|
*
|
|
* @param {Object...} objects
|
|
* @throws {Error} if not called on a top level GUI.
|
|
* @instance
|
|
*/
|
|
remember: function() {
|
|
|
|
if (common.isUndefined(SAVE_DIALOGUE)) {
|
|
SAVE_DIALOGUE = new CenteredDiv();
|
|
SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;
|
|
}
|
|
|
|
if (this.parent) {
|
|
throw new Error("You can only call remember on a top level GUI.");
|
|
}
|
|
|
|
var _this = this;
|
|
|
|
common.each(Array.prototype.slice.call(arguments), function(object) {
|
|
if (_this.__rememberedObjects.length == 0) {
|
|
addSaveMenu(_this);
|
|
}
|
|
if (_this.__rememberedObjects.indexOf(object) == -1) {
|
|
_this.__rememberedObjects.push(object);
|
|
}
|
|
});
|
|
|
|
if (this.autoPlace) {
|
|
// Set save row width
|
|
setWidth(this, this.width);
|
|
}
|
|
|
|
},
|
|
|
|
/**
|
|
* @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.
|
|
* @instance
|
|
*/
|
|
getRoot: function() {
|
|
var gui = this;
|
|
while (gui.parent) {
|
|
gui = gui.parent;
|
|
}
|
|
return gui;
|
|
},
|
|
|
|
/**
|
|
* @returns {Object} a JSON object representing the current state of
|
|
* this GUI as well as its remembered properties.
|
|
* @instance
|
|
*/
|
|
getSaveObject: function() {
|
|
|
|
var toReturn = this.load;
|
|
|
|
toReturn.closed = this.closed;
|
|
|
|
// Am I remembering any values?
|
|
if (this.__rememberedObjects.length > 0) {
|
|
|
|
toReturn.preset = this.preset;
|
|
|
|
if (!toReturn.remembered) {
|
|
toReturn.remembered = {};
|
|
}
|
|
|
|
toReturn.remembered[this.preset] = getCurrentPreset(this);
|
|
|
|
}
|
|
|
|
toReturn.folders = {};
|
|
common.each(this.__folders, function(element, key) {
|
|
toReturn.folders[key] = element.getSaveObject();
|
|
});
|
|
|
|
return toReturn;
|
|
|
|
},
|
|
|
|
save: function() {
|
|
|
|
if (!this.load.remembered) {
|
|
this.load.remembered = {};
|
|
}
|
|
|
|
this.load.remembered[this.preset] = getCurrentPreset(this);
|
|
markPresetModified(this, false);
|
|
|
|
},
|
|
|
|
saveAs: function(presetName) {
|
|
|
|
if (!this.load.remembered) {
|
|
|
|
// Retain default values upon first save
|
|
this.load.remembered = {};
|
|
this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);
|
|
|
|
}
|
|
|
|
this.load.remembered[presetName] = getCurrentPreset(this);
|
|
this.preset = presetName;
|
|
addPresetOption(this, presetName, true);
|
|
|
|
},
|
|
|
|
revert: function(gui) {
|
|
|
|
common.each(this.__controllers, function(controller) {
|
|
// Make revert work on Default.
|
|
if (!this.getRoot().load.remembered) {
|
|
controller.setValue(controller.initialValue);
|
|
} else {
|
|
recallSavedValue(gui || this.getRoot(), controller);
|
|
}
|
|
}, this);
|
|
|
|
common.each(this.__folders, function(folder) {
|
|
folder.revert(folder);
|
|
});
|
|
|
|
if (!gui) {
|
|
markPresetModified(this.getRoot(), false);
|
|
}
|
|
|
|
|
|
},
|
|
|
|
listen: function(controller) {
|
|
|
|
var init = this.__listening.length == 0;
|
|
this.__listening.push(controller);
|
|
if (init) updateDisplays(this.__listening);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
function add(gui, object, property, params) {
|
|
|
|
if (object[property] === undefined) {
|
|
throw new Error("Object " + object + " has no property \"" + property + "\"");
|
|
}
|
|
|
|
var controller;
|
|
|
|
if (params.color) {
|
|
|
|
controller = new ColorController(object, property);
|
|
|
|
} else {
|
|
|
|
var factoryArgs = [object,property].concat(params.factoryArgs);
|
|
controller = controllerFactory.apply(gui, factoryArgs);
|
|
|
|
}
|
|
|
|
if (params.before instanceof Controller) {
|
|
params.before = params.before.__li;
|
|
}
|
|
|
|
recallSavedValue(gui, controller);
|
|
|
|
dom.addClass(controller.domElement, 'c');
|
|
|
|
var name = document.createElement('span');
|
|
dom.addClass(name, 'property-name');
|
|
name.innerHTML = controller.property;
|
|
|
|
var container = document.createElement('div');
|
|
container.appendChild(name);
|
|
container.appendChild(controller.domElement);
|
|
|
|
var li = addRow(gui, container, params.before);
|
|
|
|
dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);
|
|
dom.addClass(li, typeof controller.getValue());
|
|
|
|
augmentController(gui, li, controller);
|
|
|
|
gui.__controllers.push(controller);
|
|
|
|
return controller;
|
|
|
|
}
|
|
|
|
/**
|
|
* Add a row to the end of the GUI or before another row.
|
|
*
|
|
* @param gui
|
|
* @param [dom] If specified, inserts the dom content in the new row
|
|
* @param [liBefore] If specified, places the new row before another row
|
|
*/
|
|
function addRow(gui, dom, liBefore) {
|
|
var li = document.createElement('li');
|
|
if (dom) li.appendChild(dom);
|
|
if (liBefore) {
|
|
gui.__ul.insertBefore(li, params.before);
|
|
} else {
|
|
gui.__ul.appendChild(li);
|
|
}
|
|
gui.onResize();
|
|
return li;
|
|
}
|
|
|
|
function augmentController(gui, li, controller) {
|
|
|
|
controller.__li = li;
|
|
controller.__gui = gui;
|
|
|
|
common.extend(controller, {
|
|
|
|
options: function(options) {
|
|
|
|
if (arguments.length > 1) {
|
|
controller.remove();
|
|
|
|
return add(
|
|
gui,
|
|
controller.object,
|
|
controller.property,
|
|
{
|
|
before: controller.__li.nextElementSibling,
|
|
factoryArgs: [common.toArray(arguments)]
|
|
}
|
|
);
|
|
|
|
}
|
|
|
|
if (common.isArray(options) || common.isObject(options)) {
|
|
controller.remove();
|
|
|
|
return add(
|
|
gui,
|
|
controller.object,
|
|
controller.property,
|
|
{
|
|
before: controller.__li.nextElementSibling,
|
|
factoryArgs: [options]
|
|
}
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
name: function(v) {
|
|
controller.__li.firstElementChild.firstElementChild.innerHTML = v;
|
|
return controller;
|
|
},
|
|
|
|
listen: function() {
|
|
controller.__gui.listen(controller);
|
|
return controller;
|
|
},
|
|
|
|
remove: function() {
|
|
controller.__gui.remove(controller);
|
|
return controller;
|
|
}
|
|
|
|
});
|
|
|
|
// All sliders should be accompanied by a box.
|
|
if (controller instanceof NumberControllerSlider) {
|
|
|
|
var box = new NumberControllerBox(controller.object, controller.property,
|
|
{ min: controller.__min, max: controller.__max, step: controller.__step });
|
|
|
|
common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {
|
|
var pc = controller[method];
|
|
var pb = box[method];
|
|
controller[method] = box[method] = function() {
|
|
var args = Array.prototype.slice.call(arguments);
|
|
pc.apply(controller, args);
|
|
return pb.apply(box, args);
|
|
};
|
|
});
|
|
|
|
dom.addClass(li, 'has-slider');
|
|
controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);
|
|
|
|
}
|
|
else if (controller instanceof NumberControllerBox) {
|
|
|
|
var r = function(returned) {
|
|
|
|
// Have we defined both boundaries?
|
|
if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {
|
|
|
|
// Well, then lets just replace this with a slider.
|
|
controller.remove();
|
|
return add(
|
|
gui,
|
|
controller.object,
|
|
controller.property,
|
|
{
|
|
before: controller.__li.nextElementSibling,
|
|
factoryArgs: [controller.__min, controller.__max, controller.__step]
|
|
});
|
|
|
|
}
|
|
|
|
return returned;
|
|
|
|
};
|
|
|
|
controller.min = common.compose(r, controller.min);
|
|
controller.max = common.compose(r, controller.max);
|
|
|
|
}
|
|
else if (controller instanceof BooleanController) {
|
|
|
|
dom.bind(li, 'click', function() {
|
|
dom.fakeEvent(controller.__checkbox, 'click');
|
|
});
|
|
|
|
dom.bind(controller.__checkbox, 'click', function(e) {
|
|
e.stopPropagation(); // Prevents double-toggle
|
|
});
|
|
|
|
}
|
|
else if (controller instanceof FunctionController) {
|
|
|
|
dom.bind(li, 'click', function() {
|
|
dom.fakeEvent(controller.__button, 'click');
|
|
});
|
|
|
|
dom.bind(li, 'mouseover', function() {
|
|
dom.addClass(controller.__button, 'hover');
|
|
});
|
|
|
|
dom.bind(li, 'mouseout', function() {
|
|
dom.removeClass(controller.__button, 'hover');
|
|
});
|
|
|
|
}
|
|
else if (controller instanceof ColorController) {
|
|
|
|
dom.addClass(li, 'color');
|
|
controller.updateDisplay = common.compose(function(r) {
|
|
li.style.borderLeftColor = controller.__color.toString();
|
|
return r;
|
|
}, controller.updateDisplay);
|
|
|
|
controller.updateDisplay();
|
|
|
|
}
|
|
|
|
controller.setValue = common.compose(function(r) {
|
|
if (gui.getRoot().__preset_select && controller.isModified()) {
|
|
markPresetModified(gui.getRoot(), true);
|
|
}
|
|
return r;
|
|
}, controller.setValue);
|
|
|
|
}
|
|
|
|
function recallSavedValue(gui, controller) {
|
|
|
|
// Find the topmost GUI, that's where remembered objects live.
|
|
var root = gui.getRoot();
|
|
|
|
// Does the object we're controlling match anything we've been told to
|
|
// remember?
|
|
var matched_index = root.__rememberedObjects.indexOf(controller.object);
|
|
|
|
// Why yes, it does!
|
|
if (matched_index != -1) {
|
|
|
|
// Let me fetch a map of controllers for thcommon.isObject.
|
|
var controller_map =
|
|
root.__rememberedObjectIndecesToControllers[matched_index];
|
|
|
|
// Ohp, I believe this is the first controller we've created for this
|
|
// object. Lets make the map fresh.
|
|
if (controller_map === undefined) {
|
|
controller_map = {};
|
|
root.__rememberedObjectIndecesToControllers[matched_index] =
|
|
controller_map;
|
|
}
|
|
|
|
// Keep track of this controller
|
|
controller_map[controller.property] = controller;
|
|
|
|
// Okay, now have we saved any values for this controller?
|
|
if (root.load && root.load.remembered) {
|
|
|
|
var preset_map = root.load.remembered;
|
|
|
|
// Which preset are we trying to load?
|
|
var preset;
|
|
|
|
if (preset_map[gui.preset]) {
|
|
|
|
preset = preset_map[gui.preset];
|
|
|
|
} else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {
|
|
|
|
// Uhh, you can have the default instead?
|
|
preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];
|
|
|
|
} else {
|
|
|
|
// Nada.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
// Did the loaded object remember thcommon.isObject?
|
|
if (preset[matched_index] &&
|
|
|
|
// Did we remember this particular property?
|
|
preset[matched_index][controller.property] !== undefined) {
|
|
|
|
// We did remember something for this guy ...
|
|
var value = preset[matched_index][controller.property];
|
|
|
|
// And that's what it is.
|
|
controller.initialValue = value;
|
|
controller.setValue(value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getLocalStorageHash(gui, key) {
|
|
// TODO how does this deal with multiple GUI's?
|
|
return document.location.href + '.' + key;
|
|
|
|
}
|
|
|
|
function addSaveMenu(gui) {
|
|
|
|
var div = gui.__save_row = document.createElement('li');
|
|
|
|
dom.addClass(gui.domElement, 'has-save');
|
|
|
|
gui.__ul.insertBefore(div, gui.__ul.firstChild);
|
|
|
|
dom.addClass(div, 'save-row');
|
|
|
|
var gears = document.createElement('span');
|
|
gears.innerHTML = ' ';
|
|
dom.addClass(gears, 'button gears');
|
|
|
|
// TODO replace with FunctionController
|
|
var button = document.createElement('span');
|
|
button.innerHTML = 'Save';
|
|
dom.addClass(button, 'button');
|
|
dom.addClass(button, 'save');
|
|
|
|
var button2 = document.createElement('span');
|
|
button2.innerHTML = 'New';
|
|
dom.addClass(button2, 'button');
|
|
dom.addClass(button2, 'save-as');
|
|
|
|
var button3 = document.createElement('span');
|
|
button3.innerHTML = 'Revert';
|
|
dom.addClass(button3, 'button');
|
|
dom.addClass(button3, 'revert');
|
|
|
|
var select = gui.__preset_select = document.createElement('select');
|
|
|
|
if (gui.load && gui.load.remembered) {
|
|
|
|
common.each(gui.load.remembered, function(value, key) {
|
|
addPresetOption(gui, key, key == gui.preset);
|
|
});
|
|
|
|
} else {
|
|
addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);
|
|
}
|
|
|
|
dom.bind(select, 'change', function() {
|
|
|
|
|
|
for (var index = 0; index < gui.__preset_select.length; index++) {
|
|
gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;
|
|
}
|
|
|
|
gui.preset = this.value;
|
|
|
|
});
|
|
|
|
div.appendChild(select);
|
|
div.appendChild(gears);
|
|
div.appendChild(button);
|
|
div.appendChild(button2);
|
|
div.appendChild(button3);
|
|
|
|
if (SUPPORTS_LOCAL_STORAGE) {
|
|
|
|
var saveLocally = document.getElementById('dg-save-locally');
|
|
var explain = document.getElementById('dg-local-explain');
|
|
|
|
saveLocally.style.display = 'block';
|
|
|
|
var localStorageCheckBox = document.getElementById('dg-local-storage');
|
|
|
|
if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {
|
|
localStorageCheckBox.setAttribute('checked', 'checked');
|
|
}
|
|
|
|
function showHideExplain() {
|
|
explain.style.display = gui.useLocalStorage ? 'block' : 'none';
|
|
}
|
|
|
|
showHideExplain();
|
|
|
|
// TODO: Use a boolean controller, fool!
|
|
dom.bind(localStorageCheckBox, 'change', function() {
|
|
gui.useLocalStorage = !gui.useLocalStorage;
|
|
showHideExplain();
|
|
});
|
|
|
|
}
|
|
|
|
var newConstructorTextArea = document.getElementById('dg-new-constructor');
|
|
|
|
dom.bind(newConstructorTextArea, 'keydown', function(e) {
|
|
if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {
|
|
SAVE_DIALOGUE.hide();
|
|
}
|
|
});
|
|
|
|
dom.bind(gears, 'click', function() {
|
|
newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);
|
|
SAVE_DIALOGUE.show();
|
|
newConstructorTextArea.focus();
|
|
newConstructorTextArea.select();
|
|
});
|
|
|
|
dom.bind(button, 'click', function() {
|
|
gui.save();
|
|
});
|
|
|
|
dom.bind(button2, 'click', function() {
|
|
var presetName = prompt('Enter a new preset name.');
|
|
if (presetName) gui.saveAs(presetName);
|
|
});
|
|
|
|
dom.bind(button3, 'click', function() {
|
|
gui.revert();
|
|
});
|
|
|
|
// div.appendChild(button2);
|
|
|
|
}
|
|
|
|
function addResizeHandle(gui) {
|
|
|
|
gui.__resize_handle = document.createElement('div');
|
|
|
|
common.extend(gui.__resize_handle.style, {
|
|
|
|
width: '6px',
|
|
marginLeft: '-3px',
|
|
height: '200px',
|
|
cursor: 'ew-resize',
|
|
position: 'absolute'
|
|
// border: '1px solid blue'
|
|
|
|
});
|
|
|
|
var pmouseX;
|
|
|
|
dom.bind(gui.__resize_handle, 'mousedown', dragStart);
|
|
dom.bind(gui.__closeButton, 'mousedown', dragStart);
|
|
|
|
gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);
|
|
|
|
function dragStart(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
pmouseX = e.clientX;
|
|
|
|
dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);
|
|
dom.bind(window, 'mousemove', drag);
|
|
dom.bind(window, 'mouseup', dragStop);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
function drag(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
gui.width += pmouseX - e.clientX;
|
|
gui.onResize();
|
|
pmouseX = e.clientX;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
function dragStop() {
|
|
|
|
dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);
|
|
dom.unbind(window, 'mousemove', drag);
|
|
dom.unbind(window, 'mouseup', dragStop);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setWidth(gui, w) {
|
|
gui.domElement.style.width = w + 'px';
|
|
// Auto placed save-rows are position fixed, so we have to
|
|
// set the width manually if we want it to bleed to the edge
|
|
if (gui.__save_row && gui.autoPlace) {
|
|
gui.__save_row.style.width = w + 'px';
|
|
}if (gui.__closeButton) {
|
|
gui.__closeButton.style.width = w + 'px';
|
|
}
|
|
}
|
|
|
|
function getCurrentPreset(gui, useInitialValues) {
|
|
|
|
var toReturn = {};
|
|
|
|
// For each object I'm remembering
|
|
common.each(gui.__rememberedObjects, function(val, index) {
|
|
|
|
var saved_values = {};
|
|
|
|
// The controllers I've made for thcommon.isObject by property
|
|
var controller_map =
|
|
gui.__rememberedObjectIndecesToControllers[index];
|
|
|
|
// Remember each value for each property
|
|
common.each(controller_map, function(controller, property) {
|
|
saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();
|
|
});
|
|
|
|
// Save the values for thcommon.isObject
|
|
toReturn[index] = saved_values;
|
|
|
|
});
|
|
|
|
return toReturn;
|
|
|
|
}
|
|
|
|
function addPresetOption(gui, name, setSelected) {
|
|
var opt = document.createElement('option');
|
|
opt.innerHTML = name;
|
|
opt.value = name;
|
|
gui.__preset_select.appendChild(opt);
|
|
if (setSelected) {
|
|
gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;
|
|
}
|
|
}
|
|
|
|
function setPresetSelectIndex(gui) {
|
|
for (var index = 0; index < gui.__preset_select.length; index++) {
|
|
if (gui.__preset_select[index].value == gui.preset) {
|
|
gui.__preset_select.selectedIndex = index;
|
|
}
|
|
}
|
|
}
|
|
|
|
function markPresetModified(gui, modified) {
|
|
var opt = gui.__preset_select[gui.__preset_select.selectedIndex];
|
|
// console.log('mark', modified, opt);
|
|
if (modified) {
|
|
opt.innerHTML = opt.value + "*";
|
|
} else {
|
|
opt.innerHTML = opt.value;
|
|
}
|
|
}
|
|
|
|
function updateDisplays(controllerArray) {
|
|
|
|
|
|
if (controllerArray.length != 0) {
|
|
|
|
requestAnimationFrame(function() {
|
|
updateDisplays(controllerArray);
|
|
});
|
|
|
|
}
|
|
|
|
common.each(controllerArray, function(c) {
|
|
c.updateDisplay();
|
|
});
|
|
|
|
}
|
|
|
|
return GUI;
|
|
|
|
})(dat.utils.css,
|
|
"<div id=\"dg-save\" class=\"dg dialogue\">\n\n Here's the new load parameter for your <code>GUI</code>'s constructor:\n\n <textarea id=\"dg-new-constructor\"></textarea>\n\n <div id=\"dg-save-locally\">\n\n <input id=\"dg-local-storage\" type=\"checkbox\"/> Automatically save\n values to <code>localStorage</code> on exit.\n\n <div id=\"dg-local-explain\">The values saved to <code>localStorage</code> will\n override those passed to <code>dat.GUI</code>'s constructor. This makes it\n easier to work incrementally, but <code>localStorage</code> is fragile,\n and your friends may not see the same values you do.\n \n </div>\n \n </div>\n\n</div>",
|
|
".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n",
|
|
dat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {
|
|
|
|
return function(object, property) {
|
|
|
|
var initialValue = object[property];
|
|
|
|
// Providing options?
|
|
if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {
|
|
return new OptionController(object, property, arguments[2]);
|
|
}
|
|
|
|
// Providing a map?
|
|
|
|
if (common.isNumber(initialValue)) {
|
|
|
|
if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {
|
|
|
|
// Has min and max.
|
|
return new NumberControllerSlider(object, property, arguments[2], arguments[3]);
|
|
|
|
} else {
|
|
|
|
return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (common.isString(initialValue)) {
|
|
return new StringController(object, property);
|
|
}
|
|
|
|
if (common.isFunction(initialValue)) {
|
|
return new FunctionController(object, property, '');
|
|
}
|
|
|
|
if (common.isBoolean(initialValue)) {
|
|
return new BooleanController(object, property);
|
|
}
|
|
|
|
}
|
|
|
|
})(dat.controllers.OptionController,
|
|
dat.controllers.NumberControllerBox,
|
|
dat.controllers.NumberControllerSlider,
|
|
dat.controllers.StringController = (function (Controller, dom, common) {
|
|
|
|
/**
|
|
* @class Provides a text input to alter the string property of an object.
|
|
*
|
|
* @extends dat.controllers.Controller
|
|
*
|
|
* @param {Object} object The object to be manipulated
|
|
* @param {string} property The name of the property to be manipulated
|
|
*
|
|
* @member dat.controllers
|
|
*/
|
|
var StringController = function(object, property) {
|
|
|
|
StringController.superclass.call(this, object, property);
|
|
|
|
var _this = this;
|
|
|
|
this.__input = document.createElement('input');
|
|
this.__input.setAttribute('type', 'text');
|
|
|
|
dom.bind(this.__input, 'keyup', onChange);
|
|
dom.bind(this.__input, 'change', onChange);
|
|
dom.bind(this.__input, 'blur', onBlur);
|
|
dom.bind(this.__input, 'keydown', function(e) {
|
|
if (e.keyCode === 13) {
|
|
this.blur();
|
|
}
|
|
});
|
|
|
|
|
|
function onChange() {
|
|
_this.setValue(_this.__input.value);
|
|
}
|
|
|
|
function onBlur() {
|
|
if (_this.__onFinishChange) {
|
|
_this.__onFinishChange.call(_this, _this.getValue());
|
|
}
|
|
}
|
|
|
|
this.updateDisplay();
|
|
|
|
this.domElement.appendChild(this.__input);
|
|
|
|
};
|
|
|
|
StringController.superclass = Controller;
|
|
|
|
common.extend(
|
|
|
|
StringController.prototype,
|
|
Controller.prototype,
|
|
|
|
{
|
|
|
|
updateDisplay: function() {
|
|
// Stops the caret from moving on account of:
|
|
// keyup -> setValue -> updateDisplay
|
|
if (!dom.isActive(this.__input)) {
|
|
this.__input.value = this.getValue();
|
|
}
|
|
return StringController.superclass.prototype.updateDisplay.call(this);
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
return StringController;
|
|
|
|
})(dat.controllers.Controller,
|
|
dat.dom.dom,
|
|
dat.utils.common),
|
|
dat.controllers.FunctionController,
|
|
dat.controllers.BooleanController,
|
|
dat.utils.common),
|
|
dat.controllers.Controller,
|
|
dat.controllers.BooleanController,
|
|
dat.controllers.FunctionController,
|
|
dat.controllers.NumberControllerBox,
|
|
dat.controllers.NumberControllerSlider,
|
|
dat.controllers.OptionController,
|
|
dat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {
|
|
|
|
var ColorController = function(object, property) {
|
|
|
|
ColorController.superclass.call(this, object, property);
|
|
|
|
this.__color = new Color(this.getValue());
|
|
this.__temp = new Color(0);
|
|
|
|
var _this = this;
|
|
|
|
this.domElement = document.createElement('div');
|
|
|
|
dom.makeSelectable(this.domElement, false);
|
|
|
|
this.__selector = document.createElement('div');
|
|
this.__selector.className = 'selector';
|
|
|
|
this.__saturation_field = document.createElement('div');
|
|
this.__saturation_field.className = 'saturation-field';
|
|
|
|
this.__field_knob = document.createElement('div');
|
|
this.__field_knob.className = 'field-knob';
|
|
this.__field_knob_border = '2px solid ';
|
|
|
|
this.__hue_knob = document.createElement('div');
|
|
this.__hue_knob.className = 'hue-knob';
|
|
|
|
this.__hue_field = document.createElement('div');
|
|
this.__hue_field.className = 'hue-field';
|
|
|
|
this.__input = document.createElement('input');
|
|
this.__input.type = 'text';
|
|
this.__input_textShadow = '0 1px 1px ';
|
|
|
|
dom.bind(this.__input, 'keydown', function(e) {
|
|
if (e.keyCode === 13) { // on enter
|
|
onBlur.call(this);
|
|
}
|
|
});
|
|
|
|
dom.bind(this.__input, 'blur', onBlur);
|
|
|
|
dom.bind(this.__selector, 'mousedown', function(e) {
|
|
|
|
dom
|
|
.addClass(this, 'drag')
|
|
.bind(window, 'mouseup', function(e) {
|
|
dom.removeClass(_this.__selector, 'drag');
|
|
});
|
|
|
|
});
|
|
|
|
var value_field = document.createElement('div');
|
|
|
|
common.extend(this.__selector.style, {
|
|
width: '122px',
|
|
height: '102px',
|
|
padding: '3px',
|
|
backgroundColor: '#222',
|
|
boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'
|
|
});
|
|
|
|
common.extend(this.__field_knob.style, {
|
|
position: 'absolute',
|
|
width: '12px',
|
|
height: '12px',
|
|
border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),
|
|
boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',
|
|
borderRadius: '12px',
|
|
zIndex: 1
|
|
});
|
|
|
|
common.extend(this.__hue_knob.style, {
|
|
position: 'absolute',
|
|
width: '15px',
|
|
height: '2px',
|
|
borderRight: '4px solid #fff',
|
|
zIndex: 1
|
|
});
|
|
|
|
common.extend(this.__saturation_field.style, {
|
|
width: '100px',
|
|
height: '100px',
|
|
border: '1px solid #555',
|
|
marginRight: '3px',
|
|
display: 'inline-block',
|
|
cursor: 'pointer'
|
|
});
|
|
|
|
common.extend(value_field.style, {
|
|
width: '100%',
|
|
height: '100%',
|
|
background: 'none'
|
|
});
|
|
|
|
linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');
|
|
|
|
common.extend(this.__hue_field.style, {
|
|
width: '15px',
|
|
height: '100px',
|
|
display: 'inline-block',
|
|
border: '1px solid #555',
|
|
cursor: 'ns-resize'
|
|
});
|
|
|
|
hueGradient(this.__hue_field);
|
|
|
|
common.extend(this.__input.style, {
|
|
outline: 'none',
|
|
// width: '120px',
|
|
textAlign: 'center',
|
|
// padding: '4px',
|
|
// marginBottom: '6px',
|
|
color: '#fff',
|
|
border: 0,
|
|
fontWeight: 'bold',
|
|
textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'
|
|
});
|
|
|
|
dom.bind(this.__saturation_field, 'mousedown', fieldDown);
|
|
dom.bind(this.__field_knob, 'mousedown', fieldDown);
|
|
|
|
dom.bind(this.__hue_field, 'mousedown', function(e) {
|
|
setH(e);
|
|
dom.bind(window, 'mousemove', setH);
|
|
dom.bind(window, 'mouseup', unbindH);
|
|
});
|
|
|
|
function fieldDown(e) {
|
|
setSV(e);
|
|
// document.body.style.cursor = 'none';
|
|
dom.bind(window, 'mousemove', setSV);
|
|
dom.bind(window, 'mouseup', unbindSV);
|
|
}
|
|
|
|
function unbindSV() {
|
|
dom.unbind(window, 'mousemove', setSV);
|
|
dom.unbind(window, 'mouseup', unbindSV);
|
|
// document.body.style.cursor = 'default';
|
|
}
|
|
|
|
function onBlur() {
|
|
var i = interpret(this.value);
|
|
if (i !== false) {
|
|
_this.__color.__state = i;
|
|
_this.setValue(_this.__color.toOriginal());
|
|
} else {
|
|
this.value = _this.__color.toString();
|
|
}
|
|
}
|
|
|
|
function unbindH() {
|
|
dom.unbind(window, 'mousemove', setH);
|
|
dom.unbind(window, 'mouseup', unbindH);
|
|
}
|
|
|
|
this.__saturation_field.appendChild(value_field);
|
|
this.__selector.appendChild(this.__field_knob);
|
|
this.__selector.appendChild(this.__saturation_field);
|
|
this.__selector.appendChild(this.__hue_field);
|
|
this.__hue_field.appendChild(this.__hue_knob);
|
|
|
|
this.domElement.appendChild(this.__input);
|
|
this.domElement.appendChild(this.__selector);
|
|
|
|
this.updateDisplay();
|
|
|
|
function setSV(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var w = dom.getWidth(_this.__saturation_field);
|
|
var o = dom.getOffset(_this.__saturation_field);
|
|
var s = (e.clientX - o.left + document.body.scrollLeft) / w;
|
|
var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;
|
|
|
|
if (v > 1) v = 1;
|
|
else if (v < 0) v = 0;
|
|
|
|
if (s > 1) s = 1;
|
|
else if (s < 0) s = 0;
|
|
|
|
_this.__color.v = v;
|
|
_this.__color.s = s;
|
|
|
|
_this.setValue(_this.__color.toOriginal());
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
function setH(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var s = dom.getHeight(_this.__hue_field);
|
|
var o = dom.getOffset(_this.__hue_field);
|
|
var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;
|
|
|
|
if (h > 1) h = 1;
|
|
else if (h < 0) h = 0;
|
|
|
|
_this.__color.h = h * 360;
|
|
|
|
_this.setValue(_this.__color.toOriginal());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
ColorController.superclass = Controller;
|
|
|
|
common.extend(
|
|
|
|
ColorController.prototype,
|
|
Controller.prototype,
|
|
|
|
{
|
|
|
|
updateDisplay: function() {
|
|
|
|
var i = interpret(this.getValue());
|
|
|
|
if (i !== false) {
|
|
|
|
var mismatch = false;
|
|
|
|
// Check for mismatch on the interpreted value.
|
|
|
|
common.each(Color.COMPONENTS, function(component) {
|
|
if (!common.isUndefined(i[component]) &&
|
|
!common.isUndefined(this.__color.__state[component]) &&
|
|
i[component] !== this.__color.__state[component]) {
|
|
mismatch = true;
|
|
return {}; // break
|
|
}
|
|
}, this);
|
|
|
|
// If nothing diverges, we keep our previous values
|
|
// for statefulness, otherwise we recalculate fresh
|
|
if (mismatch) {
|
|
common.extend(this.__color.__state, i);
|
|
}
|
|
|
|
}
|
|
|
|
common.extend(this.__temp.__state, this.__color.__state);
|
|
|
|
this.__temp.a = 1;
|
|
|
|
var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;
|
|
var _flip = 255 - flip;
|
|
|
|
common.extend(this.__field_knob.style, {
|
|
marginLeft: 100 * this.__color.s - 7 + 'px',
|
|
marginTop: 100 * (1 - this.__color.v) - 7 + 'px',
|
|
backgroundColor: this.__temp.toString(),
|
|
border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'
|
|
});
|
|
|
|
this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';
|
|
|
|
this.__temp.s = 1;
|
|
this.__temp.v = 1;
|
|
|
|
linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());
|
|
|
|
common.extend(this.__input.style, {
|
|
backgroundColor: this.__input.value = this.__color.toString(),
|
|
color: 'rgb(' + flip + ',' + flip + ',' + flip +')',
|
|
textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
var vendors = ['-moz-','-o-','-webkit-','-ms-',''];
|
|
|
|
function linearGradient(elem, x, a, b) {
|
|
elem.style.background = '';
|
|
common.each(vendors, function(vendor) {
|
|
elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';
|
|
});
|
|
}
|
|
|
|
function hueGradient(elem) {
|
|
elem.style.background = '';
|
|
elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';
|
|
elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
|
|
elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
|
|
elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
|
|
elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';
|
|
}
|
|
|
|
|
|
return ColorController;
|
|
|
|
})(dat.controllers.Controller,
|
|
dat.dom.dom,
|
|
dat.color.Color = (function (interpret, math, toString, common) {
|
|
|
|
var Color = function() {
|
|
|
|
this.__state = interpret.apply(this, arguments);
|
|
|
|
if (this.__state === false) {
|
|
throw 'Failed to interpret color arguments';
|
|
}
|
|
|
|
this.__state.a = this.__state.a || 1;
|
|
|
|
|
|
};
|
|
|
|
Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];
|
|
|
|
common.extend(Color.prototype, {
|
|
|
|
toString: function() {
|
|
return toString(this);
|
|
},
|
|
|
|
toOriginal: function() {
|
|
return this.__state.conversion.write(this);
|
|
}
|
|
|
|
});
|
|
|
|
defineRGBComponent(Color.prototype, 'r', 2);
|
|
defineRGBComponent(Color.prototype, 'g', 1);
|
|
defineRGBComponent(Color.prototype, 'b', 0);
|
|
|
|
defineHSVComponent(Color.prototype, 'h');
|
|
defineHSVComponent(Color.prototype, 's');
|
|
defineHSVComponent(Color.prototype, 'v');
|
|
|
|
Object.defineProperty(Color.prototype, 'a', {
|
|
|
|
get: function() {
|
|
return this.__state.a;
|
|
},
|
|
|
|
set: function(v) {
|
|
this.__state.a = v;
|
|
}
|
|
|
|
});
|
|
|
|
Object.defineProperty(Color.prototype, 'hex', {
|
|
|
|
get: function() {
|
|
|
|
if (!this.__state.space !== 'HEX') {
|
|
this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);
|
|
}
|
|
|
|
return this.__state.hex;
|
|
|
|
},
|
|
|
|
set: function(v) {
|
|
|
|
this.__state.space = 'HEX';
|
|
this.__state.hex = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function defineRGBComponent(target, component, componentHexIndex) {
|
|
|
|
Object.defineProperty(target, component, {
|
|
|
|
get: function() {
|
|
|
|
if (this.__state.space === 'RGB') {
|
|
return this.__state[component];
|
|
}
|
|
|
|
recalculateRGB(this, component, componentHexIndex);
|
|
|
|
return this.__state[component];
|
|
|
|
},
|
|
|
|
set: function(v) {
|
|
|
|
if (this.__state.space !== 'RGB') {
|
|
recalculateRGB(this, component, componentHexIndex);
|
|
this.__state.space = 'RGB';
|
|
}
|
|
|
|
this.__state[component] = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function defineHSVComponent(target, component) {
|
|
|
|
Object.defineProperty(target, component, {
|
|
|
|
get: function() {
|
|
|
|
if (this.__state.space === 'HSV')
|
|
return this.__state[component];
|
|
|
|
recalculateHSV(this);
|
|
|
|
return this.__state[component];
|
|
|
|
},
|
|
|
|
set: function(v) {
|
|
|
|
if (this.__state.space !== 'HSV') {
|
|
recalculateHSV(this);
|
|
this.__state.space = 'HSV';
|
|
}
|
|
|
|
this.__state[component] = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function recalculateRGB(color, component, componentHexIndex) {
|
|
|
|
if (color.__state.space === 'HEX') {
|
|
|
|
color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);
|
|
|
|
} else if (color.__state.space === 'HSV') {
|
|
|
|
common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));
|
|
|
|
} else {
|
|
|
|
throw 'Corrupted color state';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function recalculateHSV(color) {
|
|
|
|
var result = math.rgb_to_hsv(color.r, color.g, color.b);
|
|
|
|
common.extend(color.__state,
|
|
{
|
|
s: result.s,
|
|
v: result.v
|
|
}
|
|
);
|
|
|
|
if (!common.isNaN(result.h)) {
|
|
color.__state.h = result.h;
|
|
} else if (common.isUndefined(color.__state.h)) {
|
|
color.__state.h = 0;
|
|
}
|
|
|
|
}
|
|
|
|
return Color;
|
|
|
|
})(dat.color.interpret,
|
|
dat.color.math = (function () {
|
|
|
|
var tmpComponent;
|
|
|
|
return {
|
|
|
|
hsv_to_rgb: function(h, s, v) {
|
|
|
|
var hi = Math.floor(h / 60) % 6;
|
|
|
|
var f = h / 60 - Math.floor(h / 60);
|
|
var p = v * (1.0 - s);
|
|
var q = v * (1.0 - (f * s));
|
|
var t = v * (1.0 - ((1.0 - f) * s));
|
|
var c = [
|
|
[v, t, p],
|
|
[q, v, p],
|
|
[p, v, t],
|
|
[p, q, v],
|
|
[t, p, v],
|
|
[v, p, q]
|
|
][hi];
|
|
|
|
return {
|
|
r: c[0] * 255,
|
|
g: c[1] * 255,
|
|
b: c[2] * 255
|
|
};
|
|
|
|
},
|
|
|
|
rgb_to_hsv: function(r, g, b) {
|
|
|
|
var min = Math.min(r, g, b),
|
|
max = Math.max(r, g, b),
|
|
delta = max - min,
|
|
h, s;
|
|
|
|
if (max != 0) {
|
|
s = delta / max;
|
|
} else {
|
|
return {
|
|
h: NaN,
|
|
s: 0,
|
|
v: 0
|
|
};
|
|
}
|
|
|
|
if (r == max) {
|
|
h = (g - b) / delta;
|
|
} else if (g == max) {
|
|
h = 2 + (b - r) / delta;
|
|
} else {
|
|
h = 4 + (r - g) / delta;
|
|
}
|
|
h /= 6;
|
|
if (h < 0) {
|
|
h += 1;
|
|
}
|
|
|
|
return {
|
|
h: h * 360,
|
|
s: s,
|
|
v: max / 255
|
|
};
|
|
},
|
|
|
|
rgb_to_hex: function(r, g, b) {
|
|
var hex = this.hex_with_component(0, 2, r);
|
|
hex = this.hex_with_component(hex, 1, g);
|
|
hex = this.hex_with_component(hex, 0, b);
|
|
return hex;
|
|
},
|
|
|
|
component_from_hex: function(hex, componentIndex) {
|
|
return (hex >> (componentIndex * 8)) & 0xFF;
|
|
},
|
|
|
|
hex_with_component: function(hex, componentIndex, value) {
|
|
return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));
|
|
}
|
|
|
|
}
|
|
|
|
})(),
|
|
dat.color.toString,
|
|
dat.utils.common),
|
|
dat.color.interpret,
|
|
dat.utils.common),
|
|
dat.utils.requestAnimationFrame = (function () {
|
|
|
|
/**
|
|
* requirejs version of Paul Irish's RequestAnimationFrame
|
|
* http://paulirish.com/2011/requestanimationframe-for-smart-animating/
|
|
*/
|
|
|
|
return window.webkitRequestAnimationFrame ||
|
|
window.mozRequestAnimationFrame ||
|
|
window.oRequestAnimationFrame ||
|
|
window.msRequestAnimationFrame ||
|
|
function(callback, element) {
|
|
|
|
window.setTimeout(callback, 1000 / 60);
|
|
|
|
};
|
|
})(),
|
|
dat.dom.CenteredDiv = (function (dom, common) {
|
|
|
|
|
|
var CenteredDiv = function() {
|
|
|
|
this.backgroundElement = document.createElement('div');
|
|
common.extend(this.backgroundElement.style, {
|
|
backgroundColor: 'rgba(0,0,0,0.8)',
|
|
top: 0,
|
|
left: 0,
|
|
display: 'none',
|
|
zIndex: '1000',
|
|
opacity: 0,
|
|
WebkitTransition: 'opacity 0.2s linear'
|
|
});
|
|
|
|
dom.makeFullscreen(this.backgroundElement);
|
|
this.backgroundElement.style.position = 'fixed';
|
|
|
|
this.domElement = document.createElement('div');
|
|
common.extend(this.domElement.style, {
|
|
position: 'fixed',
|
|
display: 'none',
|
|
zIndex: '1001',
|
|
opacity: 0,
|
|
WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'
|
|
});
|
|
|
|
|
|
document.body.appendChild(this.backgroundElement);
|
|
document.body.appendChild(this.domElement);
|
|
|
|
var _this = this;
|
|
dom.bind(this.backgroundElement, 'click', function() {
|
|
_this.hide();
|
|
});
|
|
|
|
|
|
};
|
|
|
|
CenteredDiv.prototype.show = function() {
|
|
|
|
var _this = this;
|
|
|
|
|
|
|
|
this.backgroundElement.style.display = 'block';
|
|
|
|
this.domElement.style.display = 'block';
|
|
this.domElement.style.opacity = 0;
|
|
// this.domElement.style.top = '52%';
|
|
this.domElement.style.webkitTransform = 'scale(1.1)';
|
|
|
|
this.layout();
|
|
|
|
common.defer(function() {
|
|
_this.backgroundElement.style.opacity = 1;
|
|
_this.domElement.style.opacity = 1;
|
|
_this.domElement.style.webkitTransform = 'scale(1)';
|
|
});
|
|
|
|
};
|
|
|
|
CenteredDiv.prototype.hide = function() {
|
|
|
|
var _this = this;
|
|
|
|
var hide = function() {
|
|
|
|
_this.domElement.style.display = 'none';
|
|
_this.backgroundElement.style.display = 'none';
|
|
|
|
dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);
|
|
dom.unbind(_this.domElement, 'transitionend', hide);
|
|
dom.unbind(_this.domElement, 'oTransitionEnd', hide);
|
|
|
|
};
|
|
|
|
dom.bind(this.domElement, 'webkitTransitionEnd', hide);
|
|
dom.bind(this.domElement, 'transitionend', hide);
|
|
dom.bind(this.domElement, 'oTransitionEnd', hide);
|
|
|
|
this.backgroundElement.style.opacity = 0;
|
|
// this.domElement.style.top = '48%';
|
|
this.domElement.style.opacity = 0;
|
|
this.domElement.style.webkitTransform = 'scale(1.1)';
|
|
|
|
};
|
|
|
|
CenteredDiv.prototype.layout = function() {
|
|
this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';
|
|
this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';
|
|
};
|
|
|
|
return CenteredDiv;
|
|
|
|
})(dat.dom.dom,
|
|
dat.utils.common),
|
|
dat.dom.dom,
|
|
dat.utils.common);
|
|
});
|
|
|
|
var dat_color = createCommonjsModule(function (module) {
|
|
/**
|
|
* dat-gui JavaScript Controller Library
|
|
* http://code.google.com/p/dat-gui
|
|
*
|
|
* Copyright 2011 Data Arts Team, Google Creative Lab
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*/
|
|
|
|
/** @namespace */
|
|
var dat = module.exports = dat || {};
|
|
|
|
/** @namespace */
|
|
dat.color = dat.color || {};
|
|
|
|
/** @namespace */
|
|
dat.utils = dat.utils || {};
|
|
|
|
dat.utils.common = (function () {
|
|
|
|
var ARR_EACH = Array.prototype.forEach;
|
|
var ARR_SLICE = Array.prototype.slice;
|
|
|
|
/**
|
|
* Band-aid methods for things that should be a lot easier in JavaScript.
|
|
* Implementation and structure inspired by underscore.js
|
|
* http://documentcloud.github.com/underscore/
|
|
*/
|
|
|
|
return {
|
|
|
|
BREAK: {},
|
|
|
|
extend: function(target) {
|
|
|
|
this.each(ARR_SLICE.call(arguments, 1), function(obj) {
|
|
|
|
for (var key in obj)
|
|
if (!this.isUndefined(obj[key]))
|
|
target[key] = obj[key];
|
|
|
|
}, this);
|
|
|
|
return target;
|
|
|
|
},
|
|
|
|
defaults: function(target) {
|
|
|
|
this.each(ARR_SLICE.call(arguments, 1), function(obj) {
|
|
|
|
for (var key in obj)
|
|
if (this.isUndefined(target[key]))
|
|
target[key] = obj[key];
|
|
|
|
}, this);
|
|
|
|
return target;
|
|
|
|
},
|
|
|
|
compose: function() {
|
|
var toCall = ARR_SLICE.call(arguments);
|
|
return function() {
|
|
var args = ARR_SLICE.call(arguments);
|
|
for (var i = toCall.length -1; i >= 0; i--) {
|
|
args = [toCall[i].apply(this, args)];
|
|
}
|
|
return args[0];
|
|
}
|
|
},
|
|
|
|
each: function(obj, itr, scope) {
|
|
|
|
|
|
if (ARR_EACH && obj.forEach === ARR_EACH) {
|
|
|
|
obj.forEach(itr, scope);
|
|
|
|
} else if (obj.length === obj.length + 0) { // Is number but not NaN
|
|
|
|
for (var key = 0, l = obj.length; key < l; key++)
|
|
if (key in obj && itr.call(scope, obj[key], key) === this.BREAK)
|
|
return;
|
|
|
|
} else {
|
|
|
|
for (var key in obj)
|
|
if (itr.call(scope, obj[key], key) === this.BREAK)
|
|
return;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
defer: function(fnc) {
|
|
setTimeout(fnc, 0);
|
|
},
|
|
|
|
toArray: function(obj) {
|
|
if (obj.toArray) return obj.toArray();
|
|
return ARR_SLICE.call(obj);
|
|
},
|
|
|
|
isUndefined: function(obj) {
|
|
return obj === undefined;
|
|
},
|
|
|
|
isNull: function(obj) {
|
|
return obj === null;
|
|
},
|
|
|
|
isNaN: function(obj) {
|
|
return obj !== obj;
|
|
},
|
|
|
|
isArray: Array.isArray || function(obj) {
|
|
return obj.constructor === Array;
|
|
},
|
|
|
|
isObject: function(obj) {
|
|
return obj === Object(obj);
|
|
},
|
|
|
|
isNumber: function(obj) {
|
|
return obj === obj+0;
|
|
},
|
|
|
|
isString: function(obj) {
|
|
return obj === obj+'';
|
|
},
|
|
|
|
isBoolean: function(obj) {
|
|
return obj === false || obj === true;
|
|
},
|
|
|
|
isFunction: function(obj) {
|
|
return Object.prototype.toString.call(obj) === '[object Function]';
|
|
}
|
|
|
|
};
|
|
|
|
})();
|
|
|
|
|
|
dat.color.toString = (function (common) {
|
|
|
|
return function(color) {
|
|
|
|
if (color.a == 1 || common.isUndefined(color.a)) {
|
|
|
|
var s = color.hex.toString(16);
|
|
while (s.length < 6) {
|
|
s = '0' + s;
|
|
}
|
|
|
|
return '#' + s;
|
|
|
|
} else {
|
|
|
|
return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})(dat.utils.common);
|
|
|
|
|
|
dat.Color = dat.color.Color = (function (interpret, math, toString, common) {
|
|
|
|
var Color = function() {
|
|
|
|
this.__state = interpret.apply(this, arguments);
|
|
|
|
if (this.__state === false) {
|
|
throw 'Failed to interpret color arguments';
|
|
}
|
|
|
|
this.__state.a = this.__state.a || 1;
|
|
|
|
|
|
};
|
|
|
|
Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];
|
|
|
|
common.extend(Color.prototype, {
|
|
|
|
toString: function() {
|
|
return toString(this);
|
|
},
|
|
|
|
toOriginal: function() {
|
|
return this.__state.conversion.write(this);
|
|
}
|
|
|
|
});
|
|
|
|
defineRGBComponent(Color.prototype, 'r', 2);
|
|
defineRGBComponent(Color.prototype, 'g', 1);
|
|
defineRGBComponent(Color.prototype, 'b', 0);
|
|
|
|
defineHSVComponent(Color.prototype, 'h');
|
|
defineHSVComponent(Color.prototype, 's');
|
|
defineHSVComponent(Color.prototype, 'v');
|
|
|
|
Object.defineProperty(Color.prototype, 'a', {
|
|
|
|
get: function() {
|
|
return this.__state.a;
|
|
},
|
|
|
|
set: function(v) {
|
|
this.__state.a = v;
|
|
}
|
|
|
|
});
|
|
|
|
Object.defineProperty(Color.prototype, 'hex', {
|
|
|
|
get: function() {
|
|
|
|
if (!this.__state.space !== 'HEX') {
|
|
this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);
|
|
}
|
|
|
|
return this.__state.hex;
|
|
|
|
},
|
|
|
|
set: function(v) {
|
|
|
|
this.__state.space = 'HEX';
|
|
this.__state.hex = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function defineRGBComponent(target, component, componentHexIndex) {
|
|
|
|
Object.defineProperty(target, component, {
|
|
|
|
get: function() {
|
|
|
|
if (this.__state.space === 'RGB') {
|
|
return this.__state[component];
|
|
}
|
|
|
|
recalculateRGB(this, component, componentHexIndex);
|
|
|
|
return this.__state[component];
|
|
|
|
},
|
|
|
|
set: function(v) {
|
|
|
|
if (this.__state.space !== 'RGB') {
|
|
recalculateRGB(this, component, componentHexIndex);
|
|
this.__state.space = 'RGB';
|
|
}
|
|
|
|
this.__state[component] = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function defineHSVComponent(target, component) {
|
|
|
|
Object.defineProperty(target, component, {
|
|
|
|
get: function() {
|
|
|
|
if (this.__state.space === 'HSV')
|
|
return this.__state[component];
|
|
|
|
recalculateHSV(this);
|
|
|
|
return this.__state[component];
|
|
|
|
},
|
|
|
|
set: function(v) {
|
|
|
|
if (this.__state.space !== 'HSV') {
|
|
recalculateHSV(this);
|
|
this.__state.space = 'HSV';
|
|
}
|
|
|
|
this.__state[component] = v;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
function recalculateRGB(color, component, componentHexIndex) {
|
|
|
|
if (color.__state.space === 'HEX') {
|
|
|
|
color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);
|
|
|
|
} else if (color.__state.space === 'HSV') {
|
|
|
|
common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));
|
|
|
|
} else {
|
|
|
|
throw 'Corrupted color state';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function recalculateHSV(color) {
|
|
|
|
var result = math.rgb_to_hsv(color.r, color.g, color.b);
|
|
|
|
common.extend(color.__state,
|
|
{
|
|
s: result.s,
|
|
v: result.v
|
|
}
|
|
);
|
|
|
|
if (!common.isNaN(result.h)) {
|
|
color.__state.h = result.h;
|
|
} else if (common.isUndefined(color.__state.h)) {
|
|
color.__state.h = 0;
|
|
}
|
|
|
|
}
|
|
|
|
return Color;
|
|
|
|
})(dat.color.interpret = (function (toString, common) {
|
|
|
|
var result, toReturn;
|
|
|
|
var interpret = function() {
|
|
|
|
toReturn = false;
|
|
|
|
var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];
|
|
|
|
common.each(INTERPRETATIONS, function(family) {
|
|
|
|
if (family.litmus(original)) {
|
|
|
|
common.each(family.conversions, function(conversion, conversionName) {
|
|
|
|
result = conversion.read(original);
|
|
|
|
if (toReturn === false && result !== false) {
|
|
toReturn = result;
|
|
result.conversionName = conversionName;
|
|
result.conversion = conversion;
|
|
return common.BREAK;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return common.BREAK;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return toReturn;
|
|
|
|
};
|
|
|
|
var INTERPRETATIONS = [
|
|
|
|
// Strings
|
|
{
|
|
|
|
litmus: common.isString,
|
|
|
|
conversions: {
|
|
|
|
THREE_CHAR_HEX: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'HEX',
|
|
hex: parseInt(
|
|
'0x' +
|
|
test[1].toString() + test[1].toString() +
|
|
test[2].toString() + test[2].toString() +
|
|
test[3].toString() + test[3].toString())
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
},
|
|
|
|
SIX_CHAR_HEX: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^#([A-F0-9]{6})$/i);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'HEX',
|
|
hex: parseInt('0x' + test[1].toString())
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
},
|
|
|
|
CSS_RGB: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'RGB',
|
|
r: parseFloat(test[1]),
|
|
g: parseFloat(test[2]),
|
|
b: parseFloat(test[3])
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
},
|
|
|
|
CSS_RGBA: {
|
|
|
|
read: function(original) {
|
|
|
|
var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/);
|
|
if (test === null) return false;
|
|
|
|
return {
|
|
space: 'RGB',
|
|
r: parseFloat(test[1]),
|
|
g: parseFloat(test[2]),
|
|
b: parseFloat(test[3]),
|
|
a: parseFloat(test[4])
|
|
};
|
|
|
|
},
|
|
|
|
write: toString
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Numbers
|
|
{
|
|
|
|
litmus: common.isNumber,
|
|
|
|
conversions: {
|
|
|
|
HEX: {
|
|
read: function(original) {
|
|
return {
|
|
space: 'HEX',
|
|
hex: original,
|
|
conversionName: 'HEX'
|
|
}
|
|
},
|
|
|
|
write: function(color) {
|
|
return color.hex;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Arrays
|
|
{
|
|
|
|
litmus: common.isArray,
|
|
|
|
conversions: {
|
|
|
|
RGB_ARRAY: {
|
|
read: function(original) {
|
|
if (original.length != 3) return false;
|
|
return {
|
|
space: 'RGB',
|
|
r: original[0],
|
|
g: original[1],
|
|
b: original[2]
|
|
};
|
|
},
|
|
|
|
write: function(color) {
|
|
return [color.r, color.g, color.b];
|
|
}
|
|
|
|
},
|
|
|
|
RGBA_ARRAY: {
|
|
read: function(original) {
|
|
if (original.length != 4) return false;
|
|
return {
|
|
space: 'RGB',
|
|
r: original[0],
|
|
g: original[1],
|
|
b: original[2],
|
|
a: original[3]
|
|
};
|
|
},
|
|
|
|
write: function(color) {
|
|
return [color.r, color.g, color.b, color.a];
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Objects
|
|
{
|
|
|
|
litmus: common.isObject,
|
|
|
|
conversions: {
|
|
|
|
RGBA_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.r) &&
|
|
common.isNumber(original.g) &&
|
|
common.isNumber(original.b) &&
|
|
common.isNumber(original.a)) {
|
|
return {
|
|
space: 'RGB',
|
|
r: original.r,
|
|
g: original.g,
|
|
b: original.b,
|
|
a: original.a
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
r: color.r,
|
|
g: color.g,
|
|
b: color.b,
|
|
a: color.a
|
|
}
|
|
}
|
|
},
|
|
|
|
RGB_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.r) &&
|
|
common.isNumber(original.g) &&
|
|
common.isNumber(original.b)) {
|
|
return {
|
|
space: 'RGB',
|
|
r: original.r,
|
|
g: original.g,
|
|
b: original.b
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
r: color.r,
|
|
g: color.g,
|
|
b: color.b
|
|
}
|
|
}
|
|
},
|
|
|
|
HSVA_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.h) &&
|
|
common.isNumber(original.s) &&
|
|
common.isNumber(original.v) &&
|
|
common.isNumber(original.a)) {
|
|
return {
|
|
space: 'HSV',
|
|
h: original.h,
|
|
s: original.s,
|
|
v: original.v,
|
|
a: original.a
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
h: color.h,
|
|
s: color.s,
|
|
v: color.v,
|
|
a: color.a
|
|
}
|
|
}
|
|
},
|
|
|
|
HSV_OBJ: {
|
|
read: function(original) {
|
|
if (common.isNumber(original.h) &&
|
|
common.isNumber(original.s) &&
|
|
common.isNumber(original.v)) {
|
|
return {
|
|
space: 'HSV',
|
|
h: original.h,
|
|
s: original.s,
|
|
v: original.v
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
write: function(color) {
|
|
return {
|
|
h: color.h,
|
|
s: color.s,
|
|
v: color.v
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
];
|
|
|
|
return interpret;
|
|
|
|
|
|
})(dat.color.toString,
|
|
dat.utils.common),
|
|
dat.color.math = (function () {
|
|
|
|
var tmpComponent;
|
|
|
|
return {
|
|
|
|
hsv_to_rgb: function(h, s, v) {
|
|
|
|
var hi = Math.floor(h / 60) % 6;
|
|
|
|
var f = h / 60 - Math.floor(h / 60);
|
|
var p = v * (1.0 - s);
|
|
var q = v * (1.0 - (f * s));
|
|
var t = v * (1.0 - ((1.0 - f) * s));
|
|
var c = [
|
|
[v, t, p],
|
|
[q, v, p],
|
|
[p, v, t],
|
|
[p, q, v],
|
|
[t, p, v],
|
|
[v, p, q]
|
|
][hi];
|
|
|
|
return {
|
|
r: c[0] * 255,
|
|
g: c[1] * 255,
|
|
b: c[2] * 255
|
|
};
|
|
|
|
},
|
|
|
|
rgb_to_hsv: function(r, g, b) {
|
|
|
|
var min = Math.min(r, g, b),
|
|
max = Math.max(r, g, b),
|
|
delta = max - min,
|
|
h, s;
|
|
|
|
if (max != 0) {
|
|
s = delta / max;
|
|
} else {
|
|
return {
|
|
h: NaN,
|
|
s: 0,
|
|
v: 0
|
|
};
|
|
}
|
|
|
|
if (r == max) {
|
|
h = (g - b) / delta;
|
|
} else if (g == max) {
|
|
h = 2 + (b - r) / delta;
|
|
} else {
|
|
h = 4 + (r - g) / delta;
|
|
}
|
|
h /= 6;
|
|
if (h < 0) {
|
|
h += 1;
|
|
}
|
|
|
|
return {
|
|
h: h * 360,
|
|
s: s,
|
|
v: max / 255
|
|
};
|
|
},
|
|
|
|
rgb_to_hex: function(r, g, b) {
|
|
var hex = this.hex_with_component(0, 2, r);
|
|
hex = this.hex_with_component(hex, 1, g);
|
|
hex = this.hex_with_component(hex, 0, b);
|
|
return hex;
|
|
},
|
|
|
|
component_from_hex: function(hex, componentIndex) {
|
|
return (hex >> (componentIndex * 8)) & 0xFF;
|
|
},
|
|
|
|
hex_with_component: function(hex, componentIndex, value) {
|
|
return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));
|
|
}
|
|
|
|
}
|
|
|
|
})(),
|
|
dat.color.toString,
|
|
dat.utils.common);
|
|
});
|
|
|
|
var index = dat_gui;
|
|
var color = dat_color;
|
|
index.color = color;
|
|
|
|
// Polyfills
|
|
|
|
if ( Number.EPSILON === undefined ) {
|
|
|
|
Number.EPSILON = Math.pow( 2, - 52 );
|
|
|
|
}
|
|
|
|
if ( Number.isInteger === undefined ) {
|
|
|
|
// Missing in IE
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
|
|
|
|
Number.isInteger = function ( value ) {
|
|
|
|
return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if ( Math.sign === undefined ) {
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
|
|
|
|
Math.sign = function ( x ) {
|
|
|
|
return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
if ( Function.prototype.name === undefined ) {
|
|
|
|
// Missing in IE
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name
|
|
|
|
Object.defineProperty( Function.prototype, 'name', {
|
|
|
|
get: function () {
|
|
|
|
return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ];
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
if ( Object.assign === undefined ) {
|
|
|
|
// Missing in IE
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
|
|
|
|
( function () {
|
|
|
|
Object.assign = function ( target ) {
|
|
|
|
if ( target === undefined || target === null ) {
|
|
|
|
throw new TypeError( 'Cannot convert undefined or null to object' );
|
|
|
|
}
|
|
|
|
var output = Object( target );
|
|
|
|
for ( var index = 1; index < arguments.length; index ++ ) {
|
|
|
|
var source = arguments[ index ];
|
|
|
|
if ( source !== undefined && source !== null ) {
|
|
|
|
for ( var nextKey in source ) {
|
|
|
|
if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {
|
|
|
|
output[ nextKey ] = source[ nextKey ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return output;
|
|
|
|
};
|
|
|
|
} )();
|
|
|
|
}
|
|
|
|
/**
|
|
* https://github.com/mrdoob/eventdispatcher.js/
|
|
*/
|
|
|
|
function EventDispatcher() {}
|
|
|
|
Object.assign( EventDispatcher.prototype, {
|
|
|
|
addEventListener: function ( type, listener ) {
|
|
|
|
if ( this._listeners === undefined ) this._listeners = {};
|
|
|
|
var listeners = this._listeners;
|
|
|
|
if ( listeners[ type ] === undefined ) {
|
|
|
|
listeners[ type ] = [];
|
|
|
|
}
|
|
|
|
if ( listeners[ type ].indexOf( listener ) === - 1 ) {
|
|
|
|
listeners[ type ].push( listener );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
hasEventListener: function ( type, listener ) {
|
|
|
|
if ( this._listeners === undefined ) return false;
|
|
|
|
var listeners = this._listeners;
|
|
|
|
return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;
|
|
|
|
},
|
|
|
|
removeEventListener: function ( type, listener ) {
|
|
|
|
if ( this._listeners === undefined ) return;
|
|
|
|
var listeners = this._listeners;
|
|
var listenerArray = listeners[ type ];
|
|
|
|
if ( listenerArray !== undefined ) {
|
|
|
|
var index = listenerArray.indexOf( listener );
|
|
|
|
if ( index !== - 1 ) {
|
|
|
|
listenerArray.splice( index, 1 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
dispatchEvent: function ( event ) {
|
|
|
|
if ( this._listeners === undefined ) return;
|
|
|
|
var listeners = this._listeners;
|
|
var listenerArray = listeners[ event.type ];
|
|
|
|
if ( listenerArray !== undefined ) {
|
|
|
|
event.target = this;
|
|
|
|
var array = [], i = 0;
|
|
var length = listenerArray.length;
|
|
|
|
for ( i = 0; i < length; i ++ ) {
|
|
|
|
array[ i ] = listenerArray[ i ];
|
|
|
|
}
|
|
|
|
for ( i = 0; i < length; i ++ ) {
|
|
|
|
array[ i ].call( this, event );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
var REVISION = '85';
|
|
var CullFaceNone = 0;
|
|
var CullFaceBack = 1;
|
|
var CullFaceFront = 2;
|
|
var FrontFaceDirectionCW = 0;
|
|
var PCFShadowMap = 1;
|
|
var PCFSoftShadowMap = 2;
|
|
var FrontSide = 0;
|
|
var BackSide = 1;
|
|
var DoubleSide = 2;
|
|
var FlatShading = 1;
|
|
var SmoothShading = 2;
|
|
var NoColors = 0;
|
|
var FaceColors = 1;
|
|
var VertexColors = 2;
|
|
var NoBlending = 0;
|
|
var NormalBlending = 1;
|
|
var AdditiveBlending = 2;
|
|
var SubtractiveBlending = 3;
|
|
var MultiplyBlending = 4;
|
|
var CustomBlending = 5;
|
|
var AddEquation = 100;
|
|
var SubtractEquation = 101;
|
|
var ReverseSubtractEquation = 102;
|
|
var MinEquation = 103;
|
|
var MaxEquation = 104;
|
|
var ZeroFactor = 200;
|
|
var OneFactor = 201;
|
|
var SrcColorFactor = 202;
|
|
var OneMinusSrcColorFactor = 203;
|
|
var SrcAlphaFactor = 204;
|
|
var OneMinusSrcAlphaFactor = 205;
|
|
var DstAlphaFactor = 206;
|
|
var OneMinusDstAlphaFactor = 207;
|
|
var DstColorFactor = 208;
|
|
var OneMinusDstColorFactor = 209;
|
|
var SrcAlphaSaturateFactor = 210;
|
|
var NeverDepth = 0;
|
|
var AlwaysDepth = 1;
|
|
var LessDepth = 2;
|
|
var LessEqualDepth = 3;
|
|
var EqualDepth = 4;
|
|
var GreaterEqualDepth = 5;
|
|
var GreaterDepth = 6;
|
|
var NotEqualDepth = 7;
|
|
var MultiplyOperation = 0;
|
|
var MixOperation = 1;
|
|
var AddOperation = 2;
|
|
var NoToneMapping = 0;
|
|
var LinearToneMapping = 1;
|
|
var ReinhardToneMapping = 2;
|
|
var Uncharted2ToneMapping = 3;
|
|
var CineonToneMapping = 4;
|
|
var UVMapping = 300;
|
|
var CubeReflectionMapping = 301;
|
|
var CubeRefractionMapping = 302;
|
|
var EquirectangularReflectionMapping = 303;
|
|
var EquirectangularRefractionMapping = 304;
|
|
var SphericalReflectionMapping = 305;
|
|
var CubeUVReflectionMapping = 306;
|
|
var CubeUVRefractionMapping = 307;
|
|
var RepeatWrapping = 1000;
|
|
var ClampToEdgeWrapping = 1001;
|
|
var MirroredRepeatWrapping = 1002;
|
|
var NearestFilter = 1003;
|
|
var NearestMipMapNearestFilter = 1004;
|
|
var NearestMipMapLinearFilter = 1005;
|
|
var LinearFilter = 1006;
|
|
var LinearMipMapNearestFilter = 1007;
|
|
var LinearMipMapLinearFilter = 1008;
|
|
var UnsignedByteType = 1009;
|
|
var ByteType = 1010;
|
|
var ShortType = 1011;
|
|
var UnsignedShortType = 1012;
|
|
var IntType = 1013;
|
|
var UnsignedIntType = 1014;
|
|
var FloatType = 1015;
|
|
var HalfFloatType = 1016;
|
|
var UnsignedShort4444Type = 1017;
|
|
var UnsignedShort5551Type = 1018;
|
|
var UnsignedShort565Type = 1019;
|
|
var UnsignedInt248Type = 1020;
|
|
var AlphaFormat = 1021;
|
|
var RGBFormat = 1022;
|
|
var RGBAFormat = 1023;
|
|
var LuminanceFormat = 1024;
|
|
var LuminanceAlphaFormat = 1025;
|
|
var DepthFormat = 1026;
|
|
var DepthStencilFormat = 1027;
|
|
var RGB_S3TC_DXT1_Format = 2001;
|
|
var RGBA_S3TC_DXT1_Format = 2002;
|
|
var RGBA_S3TC_DXT3_Format = 2003;
|
|
var RGBA_S3TC_DXT5_Format = 2004;
|
|
var RGB_PVRTC_4BPPV1_Format = 2100;
|
|
var RGB_PVRTC_2BPPV1_Format = 2101;
|
|
var RGBA_PVRTC_4BPPV1_Format = 2102;
|
|
var RGBA_PVRTC_2BPPV1_Format = 2103;
|
|
var RGB_ETC1_Format = 2151;
|
|
var LoopOnce = 2200;
|
|
var LoopRepeat = 2201;
|
|
var LoopPingPong = 2202;
|
|
var InterpolateDiscrete = 2300;
|
|
var InterpolateLinear = 2301;
|
|
var InterpolateSmooth = 2302;
|
|
var ZeroCurvatureEnding = 2400;
|
|
var ZeroSlopeEnding = 2401;
|
|
var WrapAroundEnding = 2402;
|
|
var TrianglesDrawMode = 0;
|
|
var TriangleStripDrawMode = 1;
|
|
var TriangleFanDrawMode = 2;
|
|
var LinearEncoding = 3000;
|
|
var sRGBEncoding = 3001;
|
|
var GammaEncoding = 3007;
|
|
var RGBEEncoding = 3002;
|
|
var RGBM7Encoding = 3004;
|
|
var RGBM16Encoding = 3005;
|
|
var RGBDEncoding = 3006;
|
|
var BasicDepthPacking = 3200;
|
|
var RGBADepthPacking = 3201;
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
var _Math = {
|
|
|
|
DEG2RAD: Math.PI / 180,
|
|
RAD2DEG: 180 / Math.PI,
|
|
|
|
generateUUID: function () {
|
|
|
|
// http://www.broofa.com/Tools/Math.uuid.htm
|
|
|
|
var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );
|
|
var uuid = new Array( 36 );
|
|
var rnd = 0, r;
|
|
|
|
return function generateUUID() {
|
|
|
|
for ( var i = 0; i < 36; i ++ ) {
|
|
|
|
if ( i === 8 || i === 13 || i === 18 || i === 23 ) {
|
|
|
|
uuid[ i ] = '-';
|
|
|
|
} else if ( i === 14 ) {
|
|
|
|
uuid[ i ] = '4';
|
|
|
|
} else {
|
|
|
|
if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;
|
|
r = rnd & 0xf;
|
|
rnd = rnd >> 4;
|
|
uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return uuid.join( '' );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clamp: function ( value, min, max ) {
|
|
|
|
return Math.max( min, Math.min( max, value ) );
|
|
|
|
},
|
|
|
|
// compute euclidian modulo of m % n
|
|
// https://en.wikipedia.org/wiki/Modulo_operation
|
|
|
|
euclideanModulo: function ( n, m ) {
|
|
|
|
return ( ( n % m ) + m ) % m;
|
|
|
|
},
|
|
|
|
// Linear mapping from range <a1, a2> to range <b1, b2>
|
|
|
|
mapLinear: function ( x, a1, a2, b1, b2 ) {
|
|
|
|
return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
|
|
|
|
},
|
|
|
|
// https://en.wikipedia.org/wiki/Linear_interpolation
|
|
|
|
lerp: function ( x, y, t ) {
|
|
|
|
return ( 1 - t ) * x + t * y;
|
|
|
|
},
|
|
|
|
// http://en.wikipedia.org/wiki/Smoothstep
|
|
|
|
smoothstep: function ( x, min, max ) {
|
|
|
|
if ( x <= min ) return 0;
|
|
if ( x >= max ) return 1;
|
|
|
|
x = ( x - min ) / ( max - min );
|
|
|
|
return x * x * ( 3 - 2 * x );
|
|
|
|
},
|
|
|
|
smootherstep: function ( x, min, max ) {
|
|
|
|
if ( x <= min ) return 0;
|
|
if ( x >= max ) return 1;
|
|
|
|
x = ( x - min ) / ( max - min );
|
|
|
|
return x * x * x * ( x * ( x * 6 - 15 ) + 10 );
|
|
|
|
},
|
|
|
|
// Random integer from <low, high> interval
|
|
|
|
randInt: function ( low, high ) {
|
|
|
|
return low + Math.floor( Math.random() * ( high - low + 1 ) );
|
|
|
|
},
|
|
|
|
// Random float from <low, high> interval
|
|
|
|
randFloat: function ( low, high ) {
|
|
|
|
return low + Math.random() * ( high - low );
|
|
|
|
},
|
|
|
|
// Random float from <-range/2, range/2> interval
|
|
|
|
randFloatSpread: function ( range ) {
|
|
|
|
return range * ( 0.5 - Math.random() );
|
|
|
|
},
|
|
|
|
degToRad: function ( degrees ) {
|
|
|
|
return degrees * _Math.DEG2RAD;
|
|
|
|
},
|
|
|
|
radToDeg: function ( radians ) {
|
|
|
|
return radians * _Math.RAD2DEG;
|
|
|
|
},
|
|
|
|
isPowerOfTwo: function ( value ) {
|
|
|
|
return ( value & ( value - 1 ) ) === 0 && value !== 0;
|
|
|
|
},
|
|
|
|
nearestPowerOfTwo: function ( value ) {
|
|
|
|
return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );
|
|
|
|
},
|
|
|
|
nextPowerOfTwo: function ( value ) {
|
|
|
|
value --;
|
|
value |= value >> 1;
|
|
value |= value >> 2;
|
|
value |= value >> 4;
|
|
value |= value >> 8;
|
|
value |= value >> 16;
|
|
value ++;
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author philogb / http://blog.thejit.org/
|
|
* @author egraether / http://egraether.com/
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
*/
|
|
|
|
function Vector2( x, y ) {
|
|
|
|
this.x = x || 0;
|
|
this.y = y || 0;
|
|
|
|
}
|
|
|
|
Object.defineProperties( Vector2.prototype, {
|
|
|
|
"width" : {
|
|
|
|
get: function () {
|
|
|
|
return this.x;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this.x = value;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"height" : {
|
|
|
|
get: function () {
|
|
|
|
return this.y;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this.y = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Vector2.prototype, {
|
|
|
|
isVector2: true,
|
|
|
|
set: function ( x, y ) {
|
|
|
|
this.x = x;
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setScalar: function ( scalar ) {
|
|
|
|
this.x = scalar;
|
|
this.y = scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setX: function ( x ) {
|
|
|
|
this.x = x;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setY: function ( y ) {
|
|
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setComponent: function ( index, value ) {
|
|
|
|
switch ( index ) {
|
|
|
|
case 0: this.x = value; break;
|
|
case 1: this.y = value; break;
|
|
default: throw new Error( 'index is out of range: ' + index );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getComponent: function ( index ) {
|
|
|
|
switch ( index ) {
|
|
|
|
case 0: return this.x;
|
|
case 1: return this.y;
|
|
default: throw new Error( 'index is out of range: ' + index );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.x, this.y );
|
|
|
|
},
|
|
|
|
copy: function ( v ) {
|
|
|
|
this.x = v.x;
|
|
this.y = v.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
add: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
|
|
return this.addVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x += v.x;
|
|
this.y += v.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScalar: function ( s ) {
|
|
|
|
this.x += s;
|
|
this.y += s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addVectors: function ( a, b ) {
|
|
|
|
this.x = a.x + b.x;
|
|
this.y = a.y + b.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScaledVector: function ( v, s ) {
|
|
|
|
this.x += v.x * s;
|
|
this.y += v.y * s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
sub: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
|
|
return this.subVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x -= v.x;
|
|
this.y -= v.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
subScalar: function ( s ) {
|
|
|
|
this.x -= s;
|
|
this.y -= s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
subVectors: function ( a, b ) {
|
|
|
|
this.x = a.x - b.x;
|
|
this.y = a.y - b.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiply: function ( v ) {
|
|
|
|
this.x *= v.x;
|
|
this.y *= v.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyScalar: function ( scalar ) {
|
|
|
|
this.x *= scalar;
|
|
this.y *= scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
divide: function ( v ) {
|
|
|
|
this.x /= v.x;
|
|
this.y /= v.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
divideScalar: function ( scalar ) {
|
|
|
|
return this.multiplyScalar( 1 / scalar );
|
|
|
|
},
|
|
|
|
min: function ( v ) {
|
|
|
|
this.x = Math.min( this.x, v.x );
|
|
this.y = Math.min( this.y, v.y );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
max: function ( v ) {
|
|
|
|
this.x = Math.max( this.x, v.x );
|
|
this.y = Math.max( this.y, v.y );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clamp: function ( min, max ) {
|
|
|
|
// This function assumes min < max, if this assumption isn't true it will not operate correctly
|
|
|
|
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
|
|
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clampScalar: function () {
|
|
|
|
var min = new Vector2();
|
|
var max = new Vector2();
|
|
|
|
return function clampScalar( minVal, maxVal ) {
|
|
|
|
min.set( minVal, minVal );
|
|
max.set( maxVal, maxVal );
|
|
|
|
return this.clamp( min, max );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clampLength: function ( min, max ) {
|
|
|
|
var length = this.length();
|
|
|
|
return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );
|
|
|
|
},
|
|
|
|
floor: function () {
|
|
|
|
this.x = Math.floor( this.x );
|
|
this.y = Math.floor( this.y );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
ceil: function () {
|
|
|
|
this.x = Math.ceil( this.x );
|
|
this.y = Math.ceil( this.y );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
round: function () {
|
|
|
|
this.x = Math.round( this.x );
|
|
this.y = Math.round( this.y );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
roundToZero: function () {
|
|
|
|
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
|
|
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
negate: function () {
|
|
|
|
this.x = - this.x;
|
|
this.y = - this.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dot: function ( v ) {
|
|
|
|
return this.x * v.x + this.y * v.y;
|
|
|
|
},
|
|
|
|
lengthSq: function () {
|
|
|
|
return this.x * this.x + this.y * this.y;
|
|
|
|
},
|
|
|
|
length: function () {
|
|
|
|
return Math.sqrt( this.x * this.x + this.y * this.y );
|
|
|
|
},
|
|
|
|
lengthManhattan: function() {
|
|
|
|
return Math.abs( this.x ) + Math.abs( this.y );
|
|
|
|
},
|
|
|
|
normalize: function () {
|
|
|
|
return this.divideScalar( this.length() );
|
|
|
|
},
|
|
|
|
angle: function () {
|
|
|
|
// computes the angle in radians with respect to the positive x-axis
|
|
|
|
var angle = Math.atan2( this.y, this.x );
|
|
|
|
if ( angle < 0 ) angle += 2 * Math.PI;
|
|
|
|
return angle;
|
|
|
|
},
|
|
|
|
distanceTo: function ( v ) {
|
|
|
|
return Math.sqrt( this.distanceToSquared( v ) );
|
|
|
|
},
|
|
|
|
distanceToSquared: function ( v ) {
|
|
|
|
var dx = this.x - v.x, dy = this.y - v.y;
|
|
return dx * dx + dy * dy;
|
|
|
|
},
|
|
|
|
distanceToManhattan: function ( v ) {
|
|
|
|
return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );
|
|
|
|
},
|
|
|
|
setLength: function ( length ) {
|
|
|
|
return this.multiplyScalar( length / this.length() );
|
|
|
|
},
|
|
|
|
lerp: function ( v, alpha ) {
|
|
|
|
this.x += ( v.x - this.x ) * alpha;
|
|
this.y += ( v.y - this.y ) * alpha;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
lerpVectors: function ( v1, v2, alpha ) {
|
|
|
|
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
|
|
|
|
},
|
|
|
|
equals: function ( v ) {
|
|
|
|
return ( ( v.x === this.x ) && ( v.y === this.y ) );
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this.x = array[ offset ];
|
|
this.y = array[ offset + 1 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
array[ offset ] = this.x;
|
|
array[ offset + 1 ] = this.y;
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
fromBufferAttribute: function ( attribute, index, offset ) {
|
|
|
|
if ( offset !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );
|
|
|
|
}
|
|
|
|
this.x = attribute.getX( index );
|
|
this.y = attribute.getY( index );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
rotateAround: function ( center, angle ) {
|
|
|
|
var c = Math.cos( angle ), s = Math.sin( angle );
|
|
|
|
var x = this.x - center.x;
|
|
var y = this.y - center.y;
|
|
|
|
this.x = x * c - y * s + center.x;
|
|
this.y = x * s + y * c + center.y;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author szimek / https://github.com/szimek/
|
|
*/
|
|
|
|
var textureId = 0;
|
|
|
|
function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
|
|
|
|
Object.defineProperty( this, 'id', { value: textureId ++ } );
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.name = '';
|
|
|
|
this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;
|
|
this.mipmaps = [];
|
|
|
|
this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;
|
|
|
|
this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;
|
|
this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;
|
|
|
|
this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
|
|
this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;
|
|
|
|
this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
|
|
|
|
this.format = format !== undefined ? format : RGBAFormat;
|
|
this.type = type !== undefined ? type : UnsignedByteType;
|
|
|
|
this.offset = new Vector2( 0, 0 );
|
|
this.repeat = new Vector2( 1, 1 );
|
|
|
|
this.generateMipmaps = true;
|
|
this.premultiplyAlpha = false;
|
|
this.flipY = true;
|
|
this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
|
|
|
|
// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.
|
|
//
|
|
// Also changing the encoding after already used by a Material will not automatically make the Material
|
|
// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.
|
|
this.encoding = encoding !== undefined ? encoding : LinearEncoding;
|
|
|
|
this.version = 0;
|
|
this.onUpdate = null;
|
|
|
|
}
|
|
|
|
Texture.DEFAULT_IMAGE = undefined;
|
|
Texture.DEFAULT_MAPPING = UVMapping;
|
|
|
|
Object.defineProperty( Texture.prototype, "needsUpdate", {
|
|
|
|
set: function ( value ) {
|
|
|
|
if ( value === true ) this.version ++;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Texture.prototype, EventDispatcher.prototype, {
|
|
|
|
constructor: Texture,
|
|
|
|
isTexture: true,
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.name = source.name;
|
|
|
|
this.image = source.image;
|
|
this.mipmaps = source.mipmaps.slice( 0 );
|
|
|
|
this.mapping = source.mapping;
|
|
|
|
this.wrapS = source.wrapS;
|
|
this.wrapT = source.wrapT;
|
|
|
|
this.magFilter = source.magFilter;
|
|
this.minFilter = source.minFilter;
|
|
|
|
this.anisotropy = source.anisotropy;
|
|
|
|
this.format = source.format;
|
|
this.type = source.type;
|
|
|
|
this.offset.copy( source.offset );
|
|
this.repeat.copy( source.repeat );
|
|
|
|
this.generateMipmaps = source.generateMipmaps;
|
|
this.premultiplyAlpha = source.premultiplyAlpha;
|
|
this.flipY = source.flipY;
|
|
this.unpackAlignment = source.unpackAlignment;
|
|
this.encoding = source.encoding;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
if ( meta.textures[ this.uuid ] !== undefined ) {
|
|
|
|
return meta.textures[ this.uuid ];
|
|
|
|
}
|
|
|
|
function getDataURL( image ) {
|
|
|
|
var canvas;
|
|
|
|
if ( image.toDataURL !== undefined ) {
|
|
|
|
canvas = image;
|
|
|
|
} else {
|
|
|
|
canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
|
|
canvas.width = image.width;
|
|
canvas.height = image.height;
|
|
|
|
canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );
|
|
|
|
}
|
|
|
|
if ( canvas.width > 2048 || canvas.height > 2048 ) {
|
|
|
|
return canvas.toDataURL( 'image/jpeg', 0.6 );
|
|
|
|
} else {
|
|
|
|
return canvas.toDataURL( 'image/png' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var output = {
|
|
metadata: {
|
|
version: 4.5,
|
|
type: 'Texture',
|
|
generator: 'Texture.toJSON'
|
|
},
|
|
|
|
uuid: this.uuid,
|
|
name: this.name,
|
|
|
|
mapping: this.mapping,
|
|
|
|
repeat: [ this.repeat.x, this.repeat.y ],
|
|
offset: [ this.offset.x, this.offset.y ],
|
|
wrap: [ this.wrapS, this.wrapT ],
|
|
|
|
minFilter: this.minFilter,
|
|
magFilter: this.magFilter,
|
|
anisotropy: this.anisotropy,
|
|
|
|
flipY: this.flipY
|
|
};
|
|
|
|
if ( this.image !== undefined ) {
|
|
|
|
// TODO: Move to THREE.Image
|
|
|
|
var image = this.image;
|
|
|
|
if ( image.uuid === undefined ) {
|
|
|
|
image.uuid = _Math.generateUUID(); // UGH
|
|
|
|
}
|
|
|
|
if ( meta.images[ image.uuid ] === undefined ) {
|
|
|
|
meta.images[ image.uuid ] = {
|
|
uuid: image.uuid,
|
|
url: getDataURL( image )
|
|
};
|
|
|
|
}
|
|
|
|
output.image = image.uuid;
|
|
|
|
}
|
|
|
|
meta.textures[ this.uuid ] = output;
|
|
|
|
return output;
|
|
|
|
},
|
|
|
|
dispose: function () {
|
|
|
|
this.dispatchEvent( { type: 'dispose' } );
|
|
|
|
},
|
|
|
|
transformUv: function ( uv ) {
|
|
|
|
if ( this.mapping !== UVMapping ) return;
|
|
|
|
uv.multiply( this.repeat );
|
|
uv.add( this.offset );
|
|
|
|
if ( uv.x < 0 || uv.x > 1 ) {
|
|
|
|
switch ( this.wrapS ) {
|
|
|
|
case RepeatWrapping:
|
|
|
|
uv.x = uv.x - Math.floor( uv.x );
|
|
break;
|
|
|
|
case ClampToEdgeWrapping:
|
|
|
|
uv.x = uv.x < 0 ? 0 : 1;
|
|
break;
|
|
|
|
case MirroredRepeatWrapping:
|
|
|
|
if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {
|
|
|
|
uv.x = Math.ceil( uv.x ) - uv.x;
|
|
|
|
} else {
|
|
|
|
uv.x = uv.x - Math.floor( uv.x );
|
|
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( uv.y < 0 || uv.y > 1 ) {
|
|
|
|
switch ( this.wrapT ) {
|
|
|
|
case RepeatWrapping:
|
|
|
|
uv.y = uv.y - Math.floor( uv.y );
|
|
break;
|
|
|
|
case ClampToEdgeWrapping:
|
|
|
|
uv.y = uv.y < 0 ? 0 : 1;
|
|
break;
|
|
|
|
case MirroredRepeatWrapping:
|
|
|
|
if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {
|
|
|
|
uv.y = Math.ceil( uv.y ) - uv.y;
|
|
|
|
} else {
|
|
|
|
uv.y = uv.y - Math.floor( uv.y );
|
|
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( this.flipY ) {
|
|
|
|
uv.y = 1 - uv.y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author supereggbert / http://www.paulbrunt.co.uk/
|
|
* @author philogb / http://blog.thejit.org/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author egraether / http://egraether.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function Vector4( x, y, z, w ) {
|
|
|
|
this.x = x || 0;
|
|
this.y = y || 0;
|
|
this.z = z || 0;
|
|
this.w = ( w !== undefined ) ? w : 1;
|
|
|
|
}
|
|
|
|
Object.assign( Vector4.prototype, {
|
|
|
|
isVector4: true,
|
|
|
|
set: function ( x, y, z, w ) {
|
|
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
this.w = w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setScalar: function ( scalar ) {
|
|
|
|
this.x = scalar;
|
|
this.y = scalar;
|
|
this.z = scalar;
|
|
this.w = scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setX: function ( x ) {
|
|
|
|
this.x = x;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setY: function ( y ) {
|
|
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setZ: function ( z ) {
|
|
|
|
this.z = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setW: function ( w ) {
|
|
|
|
this.w = w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setComponent: function ( index, value ) {
|
|
|
|
switch ( index ) {
|
|
|
|
case 0: this.x = value; break;
|
|
case 1: this.y = value; break;
|
|
case 2: this.z = value; break;
|
|
case 3: this.w = value; break;
|
|
default: throw new Error( 'index is out of range: ' + index );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getComponent: function ( index ) {
|
|
|
|
switch ( index ) {
|
|
|
|
case 0: return this.x;
|
|
case 1: return this.y;
|
|
case 2: return this.z;
|
|
case 3: return this.w;
|
|
default: throw new Error( 'index is out of range: ' + index );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.x, this.y, this.z, this.w );
|
|
|
|
},
|
|
|
|
copy: function ( v ) {
|
|
|
|
this.x = v.x;
|
|
this.y = v.y;
|
|
this.z = v.z;
|
|
this.w = ( v.w !== undefined ) ? v.w : 1;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
add: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
|
|
return this.addVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x += v.x;
|
|
this.y += v.y;
|
|
this.z += v.z;
|
|
this.w += v.w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScalar: function ( s ) {
|
|
|
|
this.x += s;
|
|
this.y += s;
|
|
this.z += s;
|
|
this.w += s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addVectors: function ( a, b ) {
|
|
|
|
this.x = a.x + b.x;
|
|
this.y = a.y + b.y;
|
|
this.z = a.z + b.z;
|
|
this.w = a.w + b.w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScaledVector: function ( v, s ) {
|
|
|
|
this.x += v.x * s;
|
|
this.y += v.y * s;
|
|
this.z += v.z * s;
|
|
this.w += v.w * s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
sub: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
|
|
return this.subVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x -= v.x;
|
|
this.y -= v.y;
|
|
this.z -= v.z;
|
|
this.w -= v.w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
subScalar: function ( s ) {
|
|
|
|
this.x -= s;
|
|
this.y -= s;
|
|
this.z -= s;
|
|
this.w -= s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
subVectors: function ( a, b ) {
|
|
|
|
this.x = a.x - b.x;
|
|
this.y = a.y - b.y;
|
|
this.z = a.z - b.z;
|
|
this.w = a.w - b.w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyScalar: function ( scalar ) {
|
|
|
|
this.x *= scalar;
|
|
this.y *= scalar;
|
|
this.z *= scalar;
|
|
this.w *= scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
applyMatrix4: function ( m ) {
|
|
|
|
var x = this.x, y = this.y, z = this.z, w = this.w;
|
|
var e = m.elements;
|
|
|
|
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;
|
|
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;
|
|
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;
|
|
this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
divideScalar: function ( scalar ) {
|
|
|
|
return this.multiplyScalar( 1 / scalar );
|
|
|
|
},
|
|
|
|
setAxisAngleFromQuaternion: function ( q ) {
|
|
|
|
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
|
|
|
|
// q is assumed to be normalized
|
|
|
|
this.w = 2 * Math.acos( q.w );
|
|
|
|
var s = Math.sqrt( 1 - q.w * q.w );
|
|
|
|
if ( s < 0.0001 ) {
|
|
|
|
this.x = 1;
|
|
this.y = 0;
|
|
this.z = 0;
|
|
|
|
} else {
|
|
|
|
this.x = q.x / s;
|
|
this.y = q.y / s;
|
|
this.z = q.z / s;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setAxisAngleFromRotationMatrix: function ( m ) {
|
|
|
|
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
|
|
|
|
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
|
|
var angle, x, y, z, // variables for result
|
|
epsilon = 0.01, // margin to allow for rounding errors
|
|
epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees
|
|
|
|
te = m.elements,
|
|
|
|
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
|
|
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
|
|
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
|
|
|
|
if ( ( Math.abs( m12 - m21 ) < epsilon ) &&
|
|
( Math.abs( m13 - m31 ) < epsilon ) &&
|
|
( Math.abs( m23 - m32 ) < epsilon ) ) {
|
|
|
|
// singularity found
|
|
// first check for identity matrix which must have +1 for all terms
|
|
// in leading diagonal and zero in other terms
|
|
|
|
if ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&
|
|
( Math.abs( m13 + m31 ) < epsilon2 ) &&
|
|
( Math.abs( m23 + m32 ) < epsilon2 ) &&
|
|
( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
|
|
|
|
// this singularity is identity matrix so angle = 0
|
|
|
|
this.set( 1, 0, 0, 0 );
|
|
|
|
return this; // zero angle, arbitrary axis
|
|
|
|
}
|
|
|
|
// otherwise this singularity is angle = 180
|
|
|
|
angle = Math.PI;
|
|
|
|
var xx = ( m11 + 1 ) / 2;
|
|
var yy = ( m22 + 1 ) / 2;
|
|
var zz = ( m33 + 1 ) / 2;
|
|
var xy = ( m12 + m21 ) / 4;
|
|
var xz = ( m13 + m31 ) / 4;
|
|
var yz = ( m23 + m32 ) / 4;
|
|
|
|
if ( ( xx > yy ) && ( xx > zz ) ) {
|
|
|
|
// m11 is the largest diagonal term
|
|
|
|
if ( xx < epsilon ) {
|
|
|
|
x = 0;
|
|
y = 0.707106781;
|
|
z = 0.707106781;
|
|
|
|
} else {
|
|
|
|
x = Math.sqrt( xx );
|
|
y = xy / x;
|
|
z = xz / x;
|
|
|
|
}
|
|
|
|
} else if ( yy > zz ) {
|
|
|
|
// m22 is the largest diagonal term
|
|
|
|
if ( yy < epsilon ) {
|
|
|
|
x = 0.707106781;
|
|
y = 0;
|
|
z = 0.707106781;
|
|
|
|
} else {
|
|
|
|
y = Math.sqrt( yy );
|
|
x = xy / y;
|
|
z = yz / y;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// m33 is the largest diagonal term so base result on this
|
|
|
|
if ( zz < epsilon ) {
|
|
|
|
x = 0.707106781;
|
|
y = 0.707106781;
|
|
z = 0;
|
|
|
|
} else {
|
|
|
|
z = Math.sqrt( zz );
|
|
x = xz / z;
|
|
y = yz / z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.set( x, y, z, angle );
|
|
|
|
return this; // return 180 deg rotation
|
|
|
|
}
|
|
|
|
// as we have reached here there are no singularities so we can handle normally
|
|
|
|
var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +
|
|
( m13 - m31 ) * ( m13 - m31 ) +
|
|
( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
|
|
|
|
if ( Math.abs( s ) < 0.001 ) s = 1;
|
|
|
|
// prevent divide by zero, should not happen if matrix is orthogonal and should be
|
|
// caught by singularity test above, but I've left it in just in case
|
|
|
|
this.x = ( m32 - m23 ) / s;
|
|
this.y = ( m13 - m31 ) / s;
|
|
this.z = ( m21 - m12 ) / s;
|
|
this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
min: function ( v ) {
|
|
|
|
this.x = Math.min( this.x, v.x );
|
|
this.y = Math.min( this.y, v.y );
|
|
this.z = Math.min( this.z, v.z );
|
|
this.w = Math.min( this.w, v.w );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
max: function ( v ) {
|
|
|
|
this.x = Math.max( this.x, v.x );
|
|
this.y = Math.max( this.y, v.y );
|
|
this.z = Math.max( this.z, v.z );
|
|
this.w = Math.max( this.w, v.w );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clamp: function ( min, max ) {
|
|
|
|
// This function assumes min < max, if this assumption isn't true it will not operate correctly
|
|
|
|
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
|
|
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
|
|
this.z = Math.max( min.z, Math.min( max.z, this.z ) );
|
|
this.w = Math.max( min.w, Math.min( max.w, this.w ) );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clampScalar: function () {
|
|
|
|
var min = new Vector4();
|
|
var max = new Vector4();
|
|
|
|
return function clampScalar( minVal, maxVal ) {
|
|
|
|
min.set( minVal, minVal, minVal, minVal );
|
|
max.set( maxVal, maxVal, maxVal, maxVal );
|
|
|
|
return this.clamp( min, max );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
floor: function () {
|
|
|
|
this.x = Math.floor( this.x );
|
|
this.y = Math.floor( this.y );
|
|
this.z = Math.floor( this.z );
|
|
this.w = Math.floor( this.w );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
ceil: function () {
|
|
|
|
this.x = Math.ceil( this.x );
|
|
this.y = Math.ceil( this.y );
|
|
this.z = Math.ceil( this.z );
|
|
this.w = Math.ceil( this.w );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
round: function () {
|
|
|
|
this.x = Math.round( this.x );
|
|
this.y = Math.round( this.y );
|
|
this.z = Math.round( this.z );
|
|
this.w = Math.round( this.w );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
roundToZero: function () {
|
|
|
|
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
|
|
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
|
|
this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
|
|
this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
negate: function () {
|
|
|
|
this.x = - this.x;
|
|
this.y = - this.y;
|
|
this.z = - this.z;
|
|
this.w = - this.w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dot: function ( v ) {
|
|
|
|
return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
|
|
|
|
},
|
|
|
|
lengthSq: function () {
|
|
|
|
return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
|
|
|
|
},
|
|
|
|
length: function () {
|
|
|
|
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
|
|
|
|
},
|
|
|
|
lengthManhattan: function () {
|
|
|
|
return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
|
|
|
|
},
|
|
|
|
normalize: function () {
|
|
|
|
return this.divideScalar( this.length() );
|
|
|
|
},
|
|
|
|
setLength: function ( length ) {
|
|
|
|
return this.multiplyScalar( length / this.length() );
|
|
|
|
},
|
|
|
|
lerp: function ( v, alpha ) {
|
|
|
|
this.x += ( v.x - this.x ) * alpha;
|
|
this.y += ( v.y - this.y ) * alpha;
|
|
this.z += ( v.z - this.z ) * alpha;
|
|
this.w += ( v.w - this.w ) * alpha;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
lerpVectors: function ( v1, v2, alpha ) {
|
|
|
|
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
|
|
|
|
},
|
|
|
|
equals: function ( v ) {
|
|
|
|
return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this.x = array[ offset ];
|
|
this.y = array[ offset + 1 ];
|
|
this.z = array[ offset + 2 ];
|
|
this.w = array[ offset + 3 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
array[ offset ] = this.x;
|
|
array[ offset + 1 ] = this.y;
|
|
array[ offset + 2 ] = this.z;
|
|
array[ offset + 3 ] = this.w;
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
fromBufferAttribute: function ( attribute, index, offset ) {
|
|
|
|
if ( offset !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );
|
|
|
|
}
|
|
|
|
this.x = attribute.getX( index );
|
|
this.y = attribute.getY( index );
|
|
this.z = attribute.getZ( index );
|
|
this.w = attribute.getW( index );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author szimek / https://github.com/szimek/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author Marius Kintel / https://github.com/kintel
|
|
*/
|
|
|
|
/*
|
|
In options, we can specify:
|
|
* Texture parameters for an auto-generated target texture
|
|
* depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers
|
|
*/
|
|
function WebGLRenderTarget( width, height, options ) {
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.width = width;
|
|
this.height = height;
|
|
|
|
this.scissor = new Vector4( 0, 0, width, height );
|
|
this.scissorTest = false;
|
|
|
|
this.viewport = new Vector4( 0, 0, width, height );
|
|
|
|
options = options || {};
|
|
|
|
if ( options.minFilter === undefined ) options.minFilter = LinearFilter;
|
|
|
|
this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );
|
|
|
|
this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
|
|
this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;
|
|
this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
|
|
|
|
}
|
|
|
|
Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {
|
|
|
|
isWebGLRenderTarget: true,
|
|
|
|
setSize: function ( width, height ) {
|
|
|
|
if ( this.width !== width || this.height !== height ) {
|
|
|
|
this.width = width;
|
|
this.height = height;
|
|
|
|
this.dispose();
|
|
|
|
}
|
|
|
|
this.viewport.set( 0, 0, width, height );
|
|
this.scissor.set( 0, 0, width, height );
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.width = source.width;
|
|
this.height = source.height;
|
|
|
|
this.viewport.copy( source.viewport );
|
|
|
|
this.texture = source.texture.clone();
|
|
|
|
this.depthBuffer = source.depthBuffer;
|
|
this.stencilBuffer = source.stencilBuffer;
|
|
this.depthTexture = source.depthTexture;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dispose: function () {
|
|
|
|
this.dispatchEvent( { type: 'dispose' } );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com
|
|
*/
|
|
|
|
function WebGLRenderTargetCube( width, height, options ) {
|
|
|
|
WebGLRenderTarget.call( this, width, height, options );
|
|
|
|
this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5
|
|
this.activeMipMapLevel = 0;
|
|
|
|
}
|
|
|
|
WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );
|
|
WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;
|
|
|
|
WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Quaternion( x, y, z, w ) {
|
|
|
|
this._x = x || 0;
|
|
this._y = y || 0;
|
|
this._z = z || 0;
|
|
this._w = ( w !== undefined ) ? w : 1;
|
|
|
|
}
|
|
|
|
Object.assign( Quaternion, {
|
|
|
|
slerp: function ( qa, qb, qm, t ) {
|
|
|
|
return qm.copy( qa ).slerp( qb, t );
|
|
|
|
},
|
|
|
|
slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
|
|
|
|
// fuzz-free, array-based Quaternion SLERP operation
|
|
|
|
var x0 = src0[ srcOffset0 + 0 ],
|
|
y0 = src0[ srcOffset0 + 1 ],
|
|
z0 = src0[ srcOffset0 + 2 ],
|
|
w0 = src0[ srcOffset0 + 3 ],
|
|
|
|
x1 = src1[ srcOffset1 + 0 ],
|
|
y1 = src1[ srcOffset1 + 1 ],
|
|
z1 = src1[ srcOffset1 + 2 ],
|
|
w1 = src1[ srcOffset1 + 3 ];
|
|
|
|
if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {
|
|
|
|
var s = 1 - t,
|
|
|
|
cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
|
|
|
|
dir = ( cos >= 0 ? 1 : - 1 ),
|
|
sqrSin = 1 - cos * cos;
|
|
|
|
// Skip the Slerp for tiny steps to avoid numeric problems:
|
|
if ( sqrSin > Number.EPSILON ) {
|
|
|
|
var sin = Math.sqrt( sqrSin ),
|
|
len = Math.atan2( sin, cos * dir );
|
|
|
|
s = Math.sin( s * len ) / sin;
|
|
t = Math.sin( t * len ) / sin;
|
|
|
|
}
|
|
|
|
var tDir = t * dir;
|
|
|
|
x0 = x0 * s + x1 * tDir;
|
|
y0 = y0 * s + y1 * tDir;
|
|
z0 = z0 * s + z1 * tDir;
|
|
w0 = w0 * s + w1 * tDir;
|
|
|
|
// Normalize in case we just did a lerp:
|
|
if ( s === 1 - t ) {
|
|
|
|
var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );
|
|
|
|
x0 *= f;
|
|
y0 *= f;
|
|
z0 *= f;
|
|
w0 *= f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dst[ dstOffset ] = x0;
|
|
dst[ dstOffset + 1 ] = y0;
|
|
dst[ dstOffset + 2 ] = z0;
|
|
dst[ dstOffset + 3 ] = w0;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( Quaternion.prototype, {
|
|
|
|
x: {
|
|
|
|
get: function () {
|
|
|
|
return this._x;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._x = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
y: {
|
|
|
|
get: function () {
|
|
|
|
return this._y;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._y = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
z: {
|
|
|
|
get: function () {
|
|
|
|
return this._z;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._z = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
w: {
|
|
|
|
get: function () {
|
|
|
|
return this._w;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._w = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Quaternion.prototype, {
|
|
|
|
set: function ( x, y, z, w ) {
|
|
|
|
this._x = x;
|
|
this._y = y;
|
|
this._z = z;
|
|
this._w = w;
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this._x, this._y, this._z, this._w );
|
|
|
|
},
|
|
|
|
copy: function ( quaternion ) {
|
|
|
|
this._x = quaternion.x;
|
|
this._y = quaternion.y;
|
|
this._z = quaternion.z;
|
|
this._w = quaternion.w;
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromEuler: function ( euler, update ) {
|
|
|
|
if ( ( euler && euler.isEuler ) === false ) {
|
|
|
|
throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );
|
|
|
|
}
|
|
|
|
var x = euler._x, y = euler._y, z = euler._z, order = euler.order;
|
|
|
|
// http://www.mathworks.com/matlabcentral/fileexchange/
|
|
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
|
|
// content/SpinCalc.m
|
|
|
|
var cos = Math.cos;
|
|
var sin = Math.sin;
|
|
|
|
var c1 = cos( x / 2 );
|
|
var c2 = cos( y / 2 );
|
|
var c3 = cos( z / 2 );
|
|
|
|
var s1 = sin( x / 2 );
|
|
var s2 = sin( y / 2 );
|
|
var s3 = sin( z / 2 );
|
|
|
|
if ( order === 'XYZ' ) {
|
|
|
|
this._x = s1 * c2 * c3 + c1 * s2 * s3;
|
|
this._y = c1 * s2 * c3 - s1 * c2 * s3;
|
|
this._z = c1 * c2 * s3 + s1 * s2 * c3;
|
|
this._w = c1 * c2 * c3 - s1 * s2 * s3;
|
|
|
|
} else if ( order === 'YXZ' ) {
|
|
|
|
this._x = s1 * c2 * c3 + c1 * s2 * s3;
|
|
this._y = c1 * s2 * c3 - s1 * c2 * s3;
|
|
this._z = c1 * c2 * s3 - s1 * s2 * c3;
|
|
this._w = c1 * c2 * c3 + s1 * s2 * s3;
|
|
|
|
} else if ( order === 'ZXY' ) {
|
|
|
|
this._x = s1 * c2 * c3 - c1 * s2 * s3;
|
|
this._y = c1 * s2 * c3 + s1 * c2 * s3;
|
|
this._z = c1 * c2 * s3 + s1 * s2 * c3;
|
|
this._w = c1 * c2 * c3 - s1 * s2 * s3;
|
|
|
|
} else if ( order === 'ZYX' ) {
|
|
|
|
this._x = s1 * c2 * c3 - c1 * s2 * s3;
|
|
this._y = c1 * s2 * c3 + s1 * c2 * s3;
|
|
this._z = c1 * c2 * s3 - s1 * s2 * c3;
|
|
this._w = c1 * c2 * c3 + s1 * s2 * s3;
|
|
|
|
} else if ( order === 'YZX' ) {
|
|
|
|
this._x = s1 * c2 * c3 + c1 * s2 * s3;
|
|
this._y = c1 * s2 * c3 + s1 * c2 * s3;
|
|
this._z = c1 * c2 * s3 - s1 * s2 * c3;
|
|
this._w = c1 * c2 * c3 - s1 * s2 * s3;
|
|
|
|
} else if ( order === 'XZY' ) {
|
|
|
|
this._x = s1 * c2 * c3 - c1 * s2 * s3;
|
|
this._y = c1 * s2 * c3 - s1 * c2 * s3;
|
|
this._z = c1 * c2 * s3 + s1 * s2 * c3;
|
|
this._w = c1 * c2 * c3 + s1 * s2 * s3;
|
|
|
|
}
|
|
|
|
if ( update !== false ) this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromAxisAngle: function ( axis, angle ) {
|
|
|
|
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
|
|
|
|
// assumes axis is normalized
|
|
|
|
var halfAngle = angle / 2, s = Math.sin( halfAngle );
|
|
|
|
this._x = axis.x * s;
|
|
this._y = axis.y * s;
|
|
this._z = axis.z * s;
|
|
this._w = Math.cos( halfAngle );
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromRotationMatrix: function ( m ) {
|
|
|
|
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
|
|
|
|
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
|
|
var te = m.elements,
|
|
|
|
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
|
|
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
|
|
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
|
|
|
|
trace = m11 + m22 + m33,
|
|
s;
|
|
|
|
if ( trace > 0 ) {
|
|
|
|
s = 0.5 / Math.sqrt( trace + 1.0 );
|
|
|
|
this._w = 0.25 / s;
|
|
this._x = ( m32 - m23 ) * s;
|
|
this._y = ( m13 - m31 ) * s;
|
|
this._z = ( m21 - m12 ) * s;
|
|
|
|
} else if ( m11 > m22 && m11 > m33 ) {
|
|
|
|
s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
|
|
|
|
this._w = ( m32 - m23 ) / s;
|
|
this._x = 0.25 * s;
|
|
this._y = ( m12 + m21 ) / s;
|
|
this._z = ( m13 + m31 ) / s;
|
|
|
|
} else if ( m22 > m33 ) {
|
|
|
|
s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
|
|
|
|
this._w = ( m13 - m31 ) / s;
|
|
this._x = ( m12 + m21 ) / s;
|
|
this._y = 0.25 * s;
|
|
this._z = ( m23 + m32 ) / s;
|
|
|
|
} else {
|
|
|
|
s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
|
|
|
|
this._w = ( m21 - m12 ) / s;
|
|
this._x = ( m13 + m31 ) / s;
|
|
this._y = ( m23 + m32 ) / s;
|
|
this._z = 0.25 * s;
|
|
|
|
}
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromUnitVectors: function () {
|
|
|
|
// assumes direction vectors vFrom and vTo are normalized
|
|
|
|
var v1 = new Vector3();
|
|
var r;
|
|
|
|
var EPS = 0.000001;
|
|
|
|
return function setFromUnitVectors( vFrom, vTo ) {
|
|
|
|
if ( v1 === undefined ) v1 = new Vector3();
|
|
|
|
r = vFrom.dot( vTo ) + 1;
|
|
|
|
if ( r < EPS ) {
|
|
|
|
r = 0;
|
|
|
|
if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
|
|
|
|
v1.set( - vFrom.y, vFrom.x, 0 );
|
|
|
|
} else {
|
|
|
|
v1.set( 0, - vFrom.z, vFrom.y );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
v1.crossVectors( vFrom, vTo );
|
|
|
|
}
|
|
|
|
this._x = v1.x;
|
|
this._y = v1.y;
|
|
this._z = v1.z;
|
|
this._w = r;
|
|
|
|
return this.normalize();
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
inverse: function () {
|
|
|
|
return this.conjugate().normalize();
|
|
|
|
},
|
|
|
|
conjugate: function () {
|
|
|
|
this._x *= - 1;
|
|
this._y *= - 1;
|
|
this._z *= - 1;
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dot: function ( v ) {
|
|
|
|
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
|
|
|
|
},
|
|
|
|
lengthSq: function () {
|
|
|
|
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
|
|
|
|
},
|
|
|
|
length: function () {
|
|
|
|
return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
|
|
|
|
},
|
|
|
|
normalize: function () {
|
|
|
|
var l = this.length();
|
|
|
|
if ( l === 0 ) {
|
|
|
|
this._x = 0;
|
|
this._y = 0;
|
|
this._z = 0;
|
|
this._w = 1;
|
|
|
|
} else {
|
|
|
|
l = 1 / l;
|
|
|
|
this._x = this._x * l;
|
|
this._y = this._y * l;
|
|
this._z = this._z * l;
|
|
this._w = this._w * l;
|
|
|
|
}
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiply: function ( q, p ) {
|
|
|
|
if ( p !== undefined ) {
|
|
|
|
console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
|
|
return this.multiplyQuaternions( q, p );
|
|
|
|
}
|
|
|
|
return this.multiplyQuaternions( this, q );
|
|
|
|
},
|
|
|
|
premultiply: function ( q ) {
|
|
|
|
return this.multiplyQuaternions( q, this );
|
|
|
|
},
|
|
|
|
multiplyQuaternions: function ( a, b ) {
|
|
|
|
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
|
|
|
|
var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
|
|
var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
|
|
|
|
this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
|
|
this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
|
|
this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
|
|
this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
slerp: function ( qb, t ) {
|
|
|
|
if ( t === 0 ) return this;
|
|
if ( t === 1 ) return this.copy( qb );
|
|
|
|
var x = this._x, y = this._y, z = this._z, w = this._w;
|
|
|
|
// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
|
|
|
|
var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
|
|
|
|
if ( cosHalfTheta < 0 ) {
|
|
|
|
this._w = - qb._w;
|
|
this._x = - qb._x;
|
|
this._y = - qb._y;
|
|
this._z = - qb._z;
|
|
|
|
cosHalfTheta = - cosHalfTheta;
|
|
|
|
} else {
|
|
|
|
this.copy( qb );
|
|
|
|
}
|
|
|
|
if ( cosHalfTheta >= 1.0 ) {
|
|
|
|
this._w = w;
|
|
this._x = x;
|
|
this._y = y;
|
|
this._z = z;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
|
|
|
|
if ( Math.abs( sinHalfTheta ) < 0.001 ) {
|
|
|
|
this._w = 0.5 * ( w + this._w );
|
|
this._x = 0.5 * ( x + this._x );
|
|
this._y = 0.5 * ( y + this._y );
|
|
this._z = 0.5 * ( z + this._z );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );
|
|
var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
|
|
ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
|
|
|
|
this._w = ( w * ratioA + this._w * ratioB );
|
|
this._x = ( x * ratioA + this._x * ratioB );
|
|
this._y = ( y * ratioA + this._y * ratioB );
|
|
this._z = ( z * ratioA + this._z * ratioB );
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( quaternion ) {
|
|
|
|
return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this._x = array[ offset ];
|
|
this._y = array[ offset + 1 ];
|
|
this._z = array[ offset + 2 ];
|
|
this._w = array[ offset + 3 ];
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
array[ offset ] = this._x;
|
|
array[ offset + 1 ] = this._y;
|
|
array[ offset + 2 ] = this._z;
|
|
array[ offset + 3 ] = this._w;
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
onChange: function ( callback ) {
|
|
|
|
this.onChangeCallback = callback;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
onChangeCallback: function () {}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author *kile / http://kile.stravaganza.org/
|
|
* @author philogb / http://blog.thejit.org/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author egraether / http://egraether.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function Vector3( x, y, z ) {
|
|
|
|
this.x = x || 0;
|
|
this.y = y || 0;
|
|
this.z = z || 0;
|
|
|
|
}
|
|
|
|
Object.assign( Vector3.prototype, {
|
|
|
|
isVector3: true,
|
|
|
|
set: function ( x, y, z ) {
|
|
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setScalar: function ( scalar ) {
|
|
|
|
this.x = scalar;
|
|
this.y = scalar;
|
|
this.z = scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setX: function ( x ) {
|
|
|
|
this.x = x;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setY: function ( y ) {
|
|
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setZ: function ( z ) {
|
|
|
|
this.z = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setComponent: function ( index, value ) {
|
|
|
|
switch ( index ) {
|
|
|
|
case 0: this.x = value; break;
|
|
case 1: this.y = value; break;
|
|
case 2: this.z = value; break;
|
|
default: throw new Error( 'index is out of range: ' + index );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getComponent: function ( index ) {
|
|
|
|
switch ( index ) {
|
|
|
|
case 0: return this.x;
|
|
case 1: return this.y;
|
|
case 2: return this.z;
|
|
default: throw new Error( 'index is out of range: ' + index );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.x, this.y, this.z );
|
|
|
|
},
|
|
|
|
copy: function ( v ) {
|
|
|
|
this.x = v.x;
|
|
this.y = v.y;
|
|
this.z = v.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
add: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
|
|
return this.addVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x += v.x;
|
|
this.y += v.y;
|
|
this.z += v.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScalar: function ( s ) {
|
|
|
|
this.x += s;
|
|
this.y += s;
|
|
this.z += s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addVectors: function ( a, b ) {
|
|
|
|
this.x = a.x + b.x;
|
|
this.y = a.y + b.y;
|
|
this.z = a.z + b.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScaledVector: function ( v, s ) {
|
|
|
|
this.x += v.x * s;
|
|
this.y += v.y * s;
|
|
this.z += v.z * s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
sub: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
|
|
return this.subVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x -= v.x;
|
|
this.y -= v.y;
|
|
this.z -= v.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
subScalar: function ( s ) {
|
|
|
|
this.x -= s;
|
|
this.y -= s;
|
|
this.z -= s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
subVectors: function ( a, b ) {
|
|
|
|
this.x = a.x - b.x;
|
|
this.y = a.y - b.y;
|
|
this.z = a.z - b.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiply: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
|
|
return this.multiplyVectors( v, w );
|
|
|
|
}
|
|
|
|
this.x *= v.x;
|
|
this.y *= v.y;
|
|
this.z *= v.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyScalar: function ( scalar ) {
|
|
|
|
this.x *= scalar;
|
|
this.y *= scalar;
|
|
this.z *= scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyVectors: function ( a, b ) {
|
|
|
|
this.x = a.x * b.x;
|
|
this.y = a.y * b.y;
|
|
this.z = a.z * b.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
applyEuler: function () {
|
|
|
|
var quaternion = new Quaternion();
|
|
|
|
return function applyEuler( euler ) {
|
|
|
|
if ( ( euler && euler.isEuler ) === false ) {
|
|
|
|
console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );
|
|
|
|
}
|
|
|
|
return this.applyQuaternion( quaternion.setFromEuler( euler ) );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
applyAxisAngle: function () {
|
|
|
|
var quaternion = new Quaternion();
|
|
|
|
return function applyAxisAngle( axis, angle ) {
|
|
|
|
return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
applyMatrix3: function ( m ) {
|
|
|
|
var x = this.x, y = this.y, z = this.z;
|
|
var e = m.elements;
|
|
|
|
this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
|
|
this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
|
|
this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
applyMatrix4: function ( m ) {
|
|
|
|
var x = this.x, y = this.y, z = this.z;
|
|
var e = m.elements;
|
|
|
|
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];
|
|
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];
|
|
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];
|
|
var w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ];
|
|
|
|
return this.divideScalar( w );
|
|
|
|
},
|
|
|
|
applyQuaternion: function ( q ) {
|
|
|
|
var x = this.x, y = this.y, z = this.z;
|
|
var qx = q.x, qy = q.y, qz = q.z, qw = q.w;
|
|
|
|
// calculate quat * vector
|
|
|
|
var ix = qw * x + qy * z - qz * y;
|
|
var iy = qw * y + qz * x - qx * z;
|
|
var iz = qw * z + qx * y - qy * x;
|
|
var iw = - qx * x - qy * y - qz * z;
|
|
|
|
// calculate result * inverse quat
|
|
|
|
this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;
|
|
this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;
|
|
this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
project: function () {
|
|
|
|
var matrix = new Matrix4();
|
|
|
|
return function project( camera ) {
|
|
|
|
matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );
|
|
return this.applyMatrix4( matrix );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
unproject: function () {
|
|
|
|
var matrix = new Matrix4();
|
|
|
|
return function unproject( camera ) {
|
|
|
|
matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );
|
|
return this.applyMatrix4( matrix );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
transformDirection: function ( m ) {
|
|
|
|
// input: THREE.Matrix4 affine matrix
|
|
// vector interpreted as a direction
|
|
|
|
var x = this.x, y = this.y, z = this.z;
|
|
var e = m.elements;
|
|
|
|
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
|
|
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
|
|
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
|
|
|
|
return this.normalize();
|
|
|
|
},
|
|
|
|
divide: function ( v ) {
|
|
|
|
this.x /= v.x;
|
|
this.y /= v.y;
|
|
this.z /= v.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
divideScalar: function ( scalar ) {
|
|
|
|
return this.multiplyScalar( 1 / scalar );
|
|
|
|
},
|
|
|
|
min: function ( v ) {
|
|
|
|
this.x = Math.min( this.x, v.x );
|
|
this.y = Math.min( this.y, v.y );
|
|
this.z = Math.min( this.z, v.z );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
max: function ( v ) {
|
|
|
|
this.x = Math.max( this.x, v.x );
|
|
this.y = Math.max( this.y, v.y );
|
|
this.z = Math.max( this.z, v.z );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clamp: function ( min, max ) {
|
|
|
|
// This function assumes min < max, if this assumption isn't true it will not operate correctly
|
|
|
|
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
|
|
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
|
|
this.z = Math.max( min.z, Math.min( max.z, this.z ) );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clampScalar: function () {
|
|
|
|
var min = new Vector3();
|
|
var max = new Vector3();
|
|
|
|
return function clampScalar( minVal, maxVal ) {
|
|
|
|
min.set( minVal, minVal, minVal );
|
|
max.set( maxVal, maxVal, maxVal );
|
|
|
|
return this.clamp( min, max );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clampLength: function ( min, max ) {
|
|
|
|
var length = this.length();
|
|
|
|
return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );
|
|
|
|
},
|
|
|
|
floor: function () {
|
|
|
|
this.x = Math.floor( this.x );
|
|
this.y = Math.floor( this.y );
|
|
this.z = Math.floor( this.z );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
ceil: function () {
|
|
|
|
this.x = Math.ceil( this.x );
|
|
this.y = Math.ceil( this.y );
|
|
this.z = Math.ceil( this.z );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
round: function () {
|
|
|
|
this.x = Math.round( this.x );
|
|
this.y = Math.round( this.y );
|
|
this.z = Math.round( this.z );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
roundToZero: function () {
|
|
|
|
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
|
|
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
|
|
this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
negate: function () {
|
|
|
|
this.x = - this.x;
|
|
this.y = - this.y;
|
|
this.z = - this.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dot: function ( v ) {
|
|
|
|
return this.x * v.x + this.y * v.y + this.z * v.z;
|
|
|
|
},
|
|
|
|
// TODO lengthSquared?
|
|
|
|
lengthSq: function () {
|
|
|
|
return this.x * this.x + this.y * this.y + this.z * this.z;
|
|
|
|
},
|
|
|
|
length: function () {
|
|
|
|
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
|
|
|
|
},
|
|
|
|
lengthManhattan: function () {
|
|
|
|
return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
|
|
|
|
},
|
|
|
|
normalize: function () {
|
|
|
|
return this.divideScalar( this.length() );
|
|
|
|
},
|
|
|
|
setLength: function ( length ) {
|
|
|
|
return this.multiplyScalar( length / this.length() );
|
|
|
|
},
|
|
|
|
lerp: function ( v, alpha ) {
|
|
|
|
this.x += ( v.x - this.x ) * alpha;
|
|
this.y += ( v.y - this.y ) * alpha;
|
|
this.z += ( v.z - this.z ) * alpha;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
lerpVectors: function ( v1, v2, alpha ) {
|
|
|
|
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
|
|
|
|
},
|
|
|
|
cross: function ( v, w ) {
|
|
|
|
if ( w !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
|
|
return this.crossVectors( v, w );
|
|
|
|
}
|
|
|
|
var x = this.x, y = this.y, z = this.z;
|
|
|
|
this.x = y * v.z - z * v.y;
|
|
this.y = z * v.x - x * v.z;
|
|
this.z = x * v.y - y * v.x;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
crossVectors: function ( a, b ) {
|
|
|
|
var ax = a.x, ay = a.y, az = a.z;
|
|
var bx = b.x, by = b.y, bz = b.z;
|
|
|
|
this.x = ay * bz - az * by;
|
|
this.y = az * bx - ax * bz;
|
|
this.z = ax * by - ay * bx;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
projectOnVector: function ( vector ) {
|
|
|
|
var scalar = vector.dot( this ) / vector.lengthSq();
|
|
|
|
return this.copy( vector ).multiplyScalar( scalar );
|
|
|
|
},
|
|
|
|
projectOnPlane: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function projectOnPlane( planeNormal ) {
|
|
|
|
v1.copy( this ).projectOnVector( planeNormal );
|
|
|
|
return this.sub( v1 );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
reflect: function () {
|
|
|
|
// reflect incident vector off plane orthogonal to normal
|
|
// normal is assumed to have unit length
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function reflect( normal ) {
|
|
|
|
return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
angleTo: function ( v ) {
|
|
|
|
var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );
|
|
|
|
// clamp, to handle numerical problems
|
|
|
|
return Math.acos( _Math.clamp( theta, - 1, 1 ) );
|
|
|
|
},
|
|
|
|
distanceTo: function ( v ) {
|
|
|
|
return Math.sqrt( this.distanceToSquared( v ) );
|
|
|
|
},
|
|
|
|
distanceToSquared: function ( v ) {
|
|
|
|
var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
|
|
|
|
return dx * dx + dy * dy + dz * dz;
|
|
|
|
},
|
|
|
|
distanceToManhattan: function ( v ) {
|
|
|
|
return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );
|
|
|
|
},
|
|
|
|
setFromSpherical: function ( s ) {
|
|
|
|
var sinPhiRadius = Math.sin( s.phi ) * s.radius;
|
|
|
|
this.x = sinPhiRadius * Math.sin( s.theta );
|
|
this.y = Math.cos( s.phi ) * s.radius;
|
|
this.z = sinPhiRadius * Math.cos( s.theta );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromCylindrical: function ( c ) {
|
|
|
|
this.x = c.radius * Math.sin( c.theta );
|
|
this.y = c.y;
|
|
this.z = c.radius * Math.cos( c.theta );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromMatrixPosition: function ( m ) {
|
|
|
|
return this.setFromMatrixColumn( m, 3 );
|
|
|
|
},
|
|
|
|
setFromMatrixScale: function ( m ) {
|
|
|
|
var sx = this.setFromMatrixColumn( m, 0 ).length();
|
|
var sy = this.setFromMatrixColumn( m, 1 ).length();
|
|
var sz = this.setFromMatrixColumn( m, 2 ).length();
|
|
|
|
this.x = sx;
|
|
this.y = sy;
|
|
this.z = sz;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromMatrixColumn: function ( m, index ) {
|
|
|
|
|
|
return this.fromArray( m.elements, index * 4 );
|
|
|
|
},
|
|
|
|
equals: function ( v ) {
|
|
|
|
return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this.x = array[ offset ];
|
|
this.y = array[ offset + 1 ];
|
|
this.z = array[ offset + 2 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
array[ offset ] = this.x;
|
|
array[ offset + 1 ] = this.y;
|
|
array[ offset + 2 ] = this.z;
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
fromBufferAttribute: function ( attribute, index, offset ) {
|
|
|
|
if ( offset !== undefined ) {
|
|
|
|
console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );
|
|
|
|
}
|
|
|
|
this.x = attribute.getX( index );
|
|
this.y = attribute.getY( index );
|
|
this.z = attribute.getZ( index );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author supereggbert / http://www.paulbrunt.co.uk/
|
|
* @author philogb / http://blog.thejit.org/
|
|
* @author jordi_ros / http://plattsoft.com
|
|
* @author D1plo1d / http://github.com/D1plo1d
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author timknip / http://www.floorplanner.com/
|
|
* @author bhouston / http://clara.io
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function Matrix4() {
|
|
|
|
this.elements = [
|
|
|
|
1, 0, 0, 0,
|
|
0, 1, 0, 0,
|
|
0, 0, 1, 0,
|
|
0, 0, 0, 1
|
|
|
|
];
|
|
|
|
if ( arguments.length > 0 ) {
|
|
|
|
console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Object.assign( Matrix4.prototype, {
|
|
|
|
isMatrix4: true,
|
|
|
|
set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
|
|
|
|
var te = this.elements;
|
|
|
|
te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;
|
|
te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;
|
|
te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;
|
|
te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
identity: function () {
|
|
|
|
this.set(
|
|
|
|
1, 0, 0, 0,
|
|
0, 1, 0, 0,
|
|
0, 0, 1, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new Matrix4().fromArray( this.elements );
|
|
|
|
},
|
|
|
|
copy: function ( m ) {
|
|
|
|
var te = this.elements;
|
|
var me = m.elements;
|
|
|
|
te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];
|
|
te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];
|
|
te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];
|
|
te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyPosition: function ( m ) {
|
|
|
|
var te = this.elements, me = m.elements;
|
|
|
|
te[ 12 ] = me[ 12 ];
|
|
te[ 13 ] = me[ 13 ];
|
|
te[ 14 ] = me[ 14 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
extractBasis: function ( xAxis, yAxis, zAxis ) {
|
|
|
|
xAxis.setFromMatrixColumn( this, 0 );
|
|
yAxis.setFromMatrixColumn( this, 1 );
|
|
zAxis.setFromMatrixColumn( this, 2 );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeBasis: function ( xAxis, yAxis, zAxis ) {
|
|
|
|
this.set(
|
|
xAxis.x, yAxis.x, zAxis.x, 0,
|
|
xAxis.y, yAxis.y, zAxis.y, 0,
|
|
xAxis.z, yAxis.z, zAxis.z, 0,
|
|
0, 0, 0, 1
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
extractRotation: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function extractRotation( m ) {
|
|
|
|
var te = this.elements;
|
|
var me = m.elements;
|
|
|
|
var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();
|
|
var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();
|
|
var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();
|
|
|
|
te[ 0 ] = me[ 0 ] * scaleX;
|
|
te[ 1 ] = me[ 1 ] * scaleX;
|
|
te[ 2 ] = me[ 2 ] * scaleX;
|
|
|
|
te[ 4 ] = me[ 4 ] * scaleY;
|
|
te[ 5 ] = me[ 5 ] * scaleY;
|
|
te[ 6 ] = me[ 6 ] * scaleY;
|
|
|
|
te[ 8 ] = me[ 8 ] * scaleZ;
|
|
te[ 9 ] = me[ 9 ] * scaleZ;
|
|
te[ 10 ] = me[ 10 ] * scaleZ;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
makeRotationFromEuler: function ( euler ) {
|
|
|
|
if ( ( euler && euler.isEuler ) === false ) {
|
|
|
|
console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
|
|
|
|
}
|
|
|
|
var te = this.elements;
|
|
|
|
var x = euler.x, y = euler.y, z = euler.z;
|
|
var a = Math.cos( x ), b = Math.sin( x );
|
|
var c = Math.cos( y ), d = Math.sin( y );
|
|
var e = Math.cos( z ), f = Math.sin( z );
|
|
|
|
if ( euler.order === 'XYZ' ) {
|
|
|
|
var ae = a * e, af = a * f, be = b * e, bf = b * f;
|
|
|
|
te[ 0 ] = c * e;
|
|
te[ 4 ] = - c * f;
|
|
te[ 8 ] = d;
|
|
|
|
te[ 1 ] = af + be * d;
|
|
te[ 5 ] = ae - bf * d;
|
|
te[ 9 ] = - b * c;
|
|
|
|
te[ 2 ] = bf - ae * d;
|
|
te[ 6 ] = be + af * d;
|
|
te[ 10 ] = a * c;
|
|
|
|
} else if ( euler.order === 'YXZ' ) {
|
|
|
|
var ce = c * e, cf = c * f, de = d * e, df = d * f;
|
|
|
|
te[ 0 ] = ce + df * b;
|
|
te[ 4 ] = de * b - cf;
|
|
te[ 8 ] = a * d;
|
|
|
|
te[ 1 ] = a * f;
|
|
te[ 5 ] = a * e;
|
|
te[ 9 ] = - b;
|
|
|
|
te[ 2 ] = cf * b - de;
|
|
te[ 6 ] = df + ce * b;
|
|
te[ 10 ] = a * c;
|
|
|
|
} else if ( euler.order === 'ZXY' ) {
|
|
|
|
var ce = c * e, cf = c * f, de = d * e, df = d * f;
|
|
|
|
te[ 0 ] = ce - df * b;
|
|
te[ 4 ] = - a * f;
|
|
te[ 8 ] = de + cf * b;
|
|
|
|
te[ 1 ] = cf + de * b;
|
|
te[ 5 ] = a * e;
|
|
te[ 9 ] = df - ce * b;
|
|
|
|
te[ 2 ] = - a * d;
|
|
te[ 6 ] = b;
|
|
te[ 10 ] = a * c;
|
|
|
|
} else if ( euler.order === 'ZYX' ) {
|
|
|
|
var ae = a * e, af = a * f, be = b * e, bf = b * f;
|
|
|
|
te[ 0 ] = c * e;
|
|
te[ 4 ] = be * d - af;
|
|
te[ 8 ] = ae * d + bf;
|
|
|
|
te[ 1 ] = c * f;
|
|
te[ 5 ] = bf * d + ae;
|
|
te[ 9 ] = af * d - be;
|
|
|
|
te[ 2 ] = - d;
|
|
te[ 6 ] = b * c;
|
|
te[ 10 ] = a * c;
|
|
|
|
} else if ( euler.order === 'YZX' ) {
|
|
|
|
var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
|
|
|
|
te[ 0 ] = c * e;
|
|
te[ 4 ] = bd - ac * f;
|
|
te[ 8 ] = bc * f + ad;
|
|
|
|
te[ 1 ] = f;
|
|
te[ 5 ] = a * e;
|
|
te[ 9 ] = - b * e;
|
|
|
|
te[ 2 ] = - d * e;
|
|
te[ 6 ] = ad * f + bc;
|
|
te[ 10 ] = ac - bd * f;
|
|
|
|
} else if ( euler.order === 'XZY' ) {
|
|
|
|
var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
|
|
|
|
te[ 0 ] = c * e;
|
|
te[ 4 ] = - f;
|
|
te[ 8 ] = d * e;
|
|
|
|
te[ 1 ] = ac * f + bd;
|
|
te[ 5 ] = a * e;
|
|
te[ 9 ] = ad * f - bc;
|
|
|
|
te[ 2 ] = bc * f - ad;
|
|
te[ 6 ] = b * e;
|
|
te[ 10 ] = bd * f + ac;
|
|
|
|
}
|
|
|
|
// last column
|
|
te[ 3 ] = 0;
|
|
te[ 7 ] = 0;
|
|
te[ 11 ] = 0;
|
|
|
|
// bottom row
|
|
te[ 12 ] = 0;
|
|
te[ 13 ] = 0;
|
|
te[ 14 ] = 0;
|
|
te[ 15 ] = 1;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeRotationFromQuaternion: function ( q ) {
|
|
|
|
var te = this.elements;
|
|
|
|
var x = q._x, y = q._y, z = q._z, w = q._w;
|
|
var x2 = x + x, y2 = y + y, z2 = z + z;
|
|
var xx = x * x2, xy = x * y2, xz = x * z2;
|
|
var yy = y * y2, yz = y * z2, zz = z * z2;
|
|
var wx = w * x2, wy = w * y2, wz = w * z2;
|
|
|
|
te[ 0 ] = 1 - ( yy + zz );
|
|
te[ 4 ] = xy - wz;
|
|
te[ 8 ] = xz + wy;
|
|
|
|
te[ 1 ] = xy + wz;
|
|
te[ 5 ] = 1 - ( xx + zz );
|
|
te[ 9 ] = yz - wx;
|
|
|
|
te[ 2 ] = xz - wy;
|
|
te[ 6 ] = yz + wx;
|
|
te[ 10 ] = 1 - ( xx + yy );
|
|
|
|
// last column
|
|
te[ 3 ] = 0;
|
|
te[ 7 ] = 0;
|
|
te[ 11 ] = 0;
|
|
|
|
// bottom row
|
|
te[ 12 ] = 0;
|
|
te[ 13 ] = 0;
|
|
te[ 14 ] = 0;
|
|
te[ 15 ] = 1;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
lookAt: function () {
|
|
|
|
var x = new Vector3();
|
|
var y = new Vector3();
|
|
var z = new Vector3();
|
|
|
|
return function lookAt( eye, target, up ) {
|
|
|
|
var te = this.elements;
|
|
|
|
z.subVectors( eye, target );
|
|
|
|
if ( z.lengthSq() === 0 ) {
|
|
|
|
// eye and target are in the same position
|
|
|
|
z.z = 1;
|
|
|
|
}
|
|
|
|
z.normalize();
|
|
x.crossVectors( up, z );
|
|
|
|
if ( x.lengthSq() === 0 ) {
|
|
|
|
// eye and target are in the same vertical
|
|
|
|
z.z += 0.0001;
|
|
x.crossVectors( up, z );
|
|
|
|
}
|
|
|
|
x.normalize();
|
|
y.crossVectors( z, x );
|
|
|
|
te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;
|
|
te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;
|
|
te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
multiply: function ( m, n ) {
|
|
|
|
if ( n !== undefined ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );
|
|
return this.multiplyMatrices( m, n );
|
|
|
|
}
|
|
|
|
return this.multiplyMatrices( this, m );
|
|
|
|
},
|
|
|
|
premultiply: function ( m ) {
|
|
|
|
return this.multiplyMatrices( m, this );
|
|
|
|
},
|
|
|
|
multiplyMatrices: function ( a, b ) {
|
|
|
|
var ae = a.elements;
|
|
var be = b.elements;
|
|
var te = this.elements;
|
|
|
|
var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];
|
|
var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];
|
|
var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];
|
|
var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];
|
|
|
|
var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];
|
|
var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];
|
|
var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];
|
|
var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];
|
|
|
|
te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
|
|
te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
|
|
te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
|
|
te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
|
|
|
|
te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
|
|
te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
|
|
te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
|
|
te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
|
|
|
|
te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
|
|
te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
|
|
te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
|
|
te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
|
|
|
|
te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
|
|
te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
|
|
te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
|
|
te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyScalar: function ( s ) {
|
|
|
|
var te = this.elements;
|
|
|
|
te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;
|
|
te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;
|
|
te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;
|
|
te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
applyToBufferAttribute: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function applyToBufferAttribute( attribute ) {
|
|
|
|
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
|
|
|
|
v1.x = attribute.getX( i );
|
|
v1.y = attribute.getY( i );
|
|
v1.z = attribute.getZ( i );
|
|
|
|
v1.applyMatrix4( this );
|
|
|
|
attribute.setXYZ( i, v1.x, v1.y, v1.z );
|
|
|
|
}
|
|
|
|
return attribute;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
determinant: function () {
|
|
|
|
var te = this.elements;
|
|
|
|
var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];
|
|
var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];
|
|
var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];
|
|
var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];
|
|
|
|
//TODO: make this more efficient
|
|
//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
|
|
|
|
return (
|
|
n41 * (
|
|
+ n14 * n23 * n32
|
|
- n13 * n24 * n32
|
|
- n14 * n22 * n33
|
|
+ n12 * n24 * n33
|
|
+ n13 * n22 * n34
|
|
- n12 * n23 * n34
|
|
) +
|
|
n42 * (
|
|
+ n11 * n23 * n34
|
|
- n11 * n24 * n33
|
|
+ n14 * n21 * n33
|
|
- n13 * n21 * n34
|
|
+ n13 * n24 * n31
|
|
- n14 * n23 * n31
|
|
) +
|
|
n43 * (
|
|
+ n11 * n24 * n32
|
|
- n11 * n22 * n34
|
|
- n14 * n21 * n32
|
|
+ n12 * n21 * n34
|
|
+ n14 * n22 * n31
|
|
- n12 * n24 * n31
|
|
) +
|
|
n44 * (
|
|
- n13 * n22 * n31
|
|
- n11 * n23 * n32
|
|
+ n11 * n22 * n33
|
|
+ n13 * n21 * n32
|
|
- n12 * n21 * n33
|
|
+ n12 * n23 * n31
|
|
)
|
|
|
|
);
|
|
|
|
},
|
|
|
|
transpose: function () {
|
|
|
|
var te = this.elements;
|
|
var tmp;
|
|
|
|
tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;
|
|
tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;
|
|
tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;
|
|
|
|
tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;
|
|
tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;
|
|
tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setPosition: function ( v ) {
|
|
|
|
var te = this.elements;
|
|
|
|
te[ 12 ] = v.x;
|
|
te[ 13 ] = v.y;
|
|
te[ 14 ] = v.z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getInverse: function ( m, throwOnDegenerate ) {
|
|
|
|
// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
|
|
var te = this.elements,
|
|
me = m.elements,
|
|
|
|
n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],
|
|
n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],
|
|
n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],
|
|
n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],
|
|
|
|
t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
|
|
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
|
|
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
|
|
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
|
|
|
|
var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
|
|
|
|
if ( det === 0 ) {
|
|
|
|
var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0";
|
|
|
|
if ( throwOnDegenerate === true ) {
|
|
|
|
throw new Error( msg );
|
|
|
|
} else {
|
|
|
|
console.warn( msg );
|
|
|
|
}
|
|
|
|
return this.identity();
|
|
|
|
}
|
|
|
|
var detInv = 1 / det;
|
|
|
|
te[ 0 ] = t11 * detInv;
|
|
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
|
|
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
|
|
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
|
|
|
|
te[ 4 ] = t12 * detInv;
|
|
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
|
|
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
|
|
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
|
|
|
|
te[ 8 ] = t13 * detInv;
|
|
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
|
|
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
|
|
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
|
|
|
|
te[ 12 ] = t14 * detInv;
|
|
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
|
|
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
|
|
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
scale: function ( v ) {
|
|
|
|
var te = this.elements;
|
|
var x = v.x, y = v.y, z = v.z;
|
|
|
|
te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;
|
|
te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;
|
|
te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;
|
|
te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getMaxScaleOnAxis: function () {
|
|
|
|
var te = this.elements;
|
|
|
|
var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];
|
|
var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];
|
|
var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];
|
|
|
|
return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );
|
|
|
|
},
|
|
|
|
makeTranslation: function ( x, y, z ) {
|
|
|
|
this.set(
|
|
|
|
1, 0, 0, x,
|
|
0, 1, 0, y,
|
|
0, 0, 1, z,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeRotationX: function ( theta ) {
|
|
|
|
var c = Math.cos( theta ), s = Math.sin( theta );
|
|
|
|
this.set(
|
|
|
|
1, 0, 0, 0,
|
|
0, c, - s, 0,
|
|
0, s, c, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeRotationY: function ( theta ) {
|
|
|
|
var c = Math.cos( theta ), s = Math.sin( theta );
|
|
|
|
this.set(
|
|
|
|
c, 0, s, 0,
|
|
0, 1, 0, 0,
|
|
- s, 0, c, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeRotationZ: function ( theta ) {
|
|
|
|
var c = Math.cos( theta ), s = Math.sin( theta );
|
|
|
|
this.set(
|
|
|
|
c, - s, 0, 0,
|
|
s, c, 0, 0,
|
|
0, 0, 1, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeRotationAxis: function ( axis, angle ) {
|
|
|
|
// Based on http://www.gamedev.net/reference/articles/article1199.asp
|
|
|
|
var c = Math.cos( angle );
|
|
var s = Math.sin( angle );
|
|
var t = 1 - c;
|
|
var x = axis.x, y = axis.y, z = axis.z;
|
|
var tx = t * x, ty = t * y;
|
|
|
|
this.set(
|
|
|
|
tx * x + c, tx * y - s * z, tx * z + s * y, 0,
|
|
tx * y + s * z, ty * y + c, ty * z - s * x, 0,
|
|
tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeScale: function ( x, y, z ) {
|
|
|
|
this.set(
|
|
|
|
x, 0, 0, 0,
|
|
0, y, 0, 0,
|
|
0, 0, z, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeShear: function ( x, y, z ) {
|
|
|
|
this.set(
|
|
|
|
1, y, z, 0,
|
|
x, 1, z, 0,
|
|
x, y, 1, 0,
|
|
0, 0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
compose: function ( position, quaternion, scale ) {
|
|
|
|
this.makeRotationFromQuaternion( quaternion );
|
|
this.scale( scale );
|
|
this.setPosition( position );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
decompose: function () {
|
|
|
|
var vector = new Vector3();
|
|
var matrix = new Matrix4();
|
|
|
|
return function decompose( position, quaternion, scale ) {
|
|
|
|
var te = this.elements;
|
|
|
|
var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();
|
|
var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
|
|
var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();
|
|
|
|
// if determine is negative, we need to invert one scale
|
|
var det = this.determinant();
|
|
if ( det < 0 ) sx = - sx;
|
|
|
|
position.x = te[ 12 ];
|
|
position.y = te[ 13 ];
|
|
position.z = te[ 14 ];
|
|
|
|
// scale the rotation part
|
|
matrix.copy( this );
|
|
|
|
var invSX = 1 / sx;
|
|
var invSY = 1 / sy;
|
|
var invSZ = 1 / sz;
|
|
|
|
matrix.elements[ 0 ] *= invSX;
|
|
matrix.elements[ 1 ] *= invSX;
|
|
matrix.elements[ 2 ] *= invSX;
|
|
|
|
matrix.elements[ 4 ] *= invSY;
|
|
matrix.elements[ 5 ] *= invSY;
|
|
matrix.elements[ 6 ] *= invSY;
|
|
|
|
matrix.elements[ 8 ] *= invSZ;
|
|
matrix.elements[ 9 ] *= invSZ;
|
|
matrix.elements[ 10 ] *= invSZ;
|
|
|
|
quaternion.setFromRotationMatrix( matrix );
|
|
|
|
scale.x = sx;
|
|
scale.y = sy;
|
|
scale.z = sz;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
makePerspective: function ( left, right, top, bottom, near, far ) {
|
|
|
|
if ( far === undefined ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );
|
|
|
|
}
|
|
|
|
var te = this.elements;
|
|
var x = 2 * near / ( right - left );
|
|
var y = 2 * near / ( top - bottom );
|
|
|
|
var a = ( right + left ) / ( right - left );
|
|
var b = ( top + bottom ) / ( top - bottom );
|
|
var c = - ( far + near ) / ( far - near );
|
|
var d = - 2 * far * near / ( far - near );
|
|
|
|
te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0;
|
|
te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0;
|
|
te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d;
|
|
te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeOrthographic: function ( left, right, top, bottom, near, far ) {
|
|
|
|
var te = this.elements;
|
|
var w = 1.0 / ( right - left );
|
|
var h = 1.0 / ( top - bottom );
|
|
var p = 1.0 / ( far - near );
|
|
|
|
var x = ( right + left ) * w;
|
|
var y = ( top + bottom ) * h;
|
|
var z = ( far + near ) * p;
|
|
|
|
te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x;
|
|
te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y;
|
|
te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z;
|
|
te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( matrix ) {
|
|
|
|
var te = this.elements;
|
|
var me = matrix.elements;
|
|
|
|
for ( var i = 0; i < 16; i ++ ) {
|
|
|
|
if ( te[ i ] !== me[ i ] ) return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
for ( var i = 0; i < 16; i ++ ) {
|
|
|
|
this.elements[ i ] = array[ i + offset ];
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
var te = this.elements;
|
|
|
|
array[ offset ] = te[ 0 ];
|
|
array[ offset + 1 ] = te[ 1 ];
|
|
array[ offset + 2 ] = te[ 2 ];
|
|
array[ offset + 3 ] = te[ 3 ];
|
|
|
|
array[ offset + 4 ] = te[ 4 ];
|
|
array[ offset + 5 ] = te[ 5 ];
|
|
array[ offset + 6 ] = te[ 6 ];
|
|
array[ offset + 7 ] = te[ 7 ];
|
|
|
|
array[ offset + 8 ] = te[ 8 ];
|
|
array[ offset + 9 ] = te[ 9 ];
|
|
array[ offset + 10 ] = te[ 10 ];
|
|
array[ offset + 11 ] = te[ 11 ];
|
|
|
|
array[ offset + 12 ] = te[ 12 ];
|
|
array[ offset + 13 ] = te[ 13 ];
|
|
array[ offset + 14 ] = te[ 14 ];
|
|
array[ offset + 15 ] = te[ 15 ];
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {
|
|
|
|
Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
|
|
|
|
this.image = { data: data, width: width, height: height };
|
|
|
|
this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
|
|
this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
|
|
|
|
this.generateMipmaps = false;
|
|
this.flipY = false;
|
|
this.unpackAlignment = 1;
|
|
|
|
}
|
|
|
|
DataTexture.prototype = Object.create( Texture.prototype );
|
|
DataTexture.prototype.constructor = DataTexture;
|
|
|
|
DataTexture.prototype.isDataTexture = true;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
|
|
|
|
images = images !== undefined ? images : [];
|
|
mapping = mapping !== undefined ? mapping : CubeReflectionMapping;
|
|
|
|
Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
|
|
|
|
this.flipY = false;
|
|
|
|
}
|
|
|
|
CubeTexture.prototype = Object.create( Texture.prototype );
|
|
CubeTexture.prototype.constructor = CubeTexture;
|
|
|
|
CubeTexture.prototype.isCubeTexture = true;
|
|
|
|
Object.defineProperty( CubeTexture.prototype, 'images', {
|
|
|
|
get: function () {
|
|
|
|
return this.image;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this.image = value;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author tschw
|
|
*
|
|
* Uniforms of a program.
|
|
* Those form a tree structure with a special top-level container for the root,
|
|
* which you get by calling 'new WebGLUniforms( gl, program, renderer )'.
|
|
*
|
|
*
|
|
* Properties of inner nodes including the top-level container:
|
|
*
|
|
* .seq - array of nested uniforms
|
|
* .map - nested uniforms by name
|
|
*
|
|
*
|
|
* Methods of all nodes except the top-level container:
|
|
*
|
|
* .setValue( gl, value, [renderer] )
|
|
*
|
|
* uploads a uniform value(s)
|
|
* the 'renderer' parameter is needed for sampler uniforms
|
|
*
|
|
*
|
|
* Static methods of the top-level container (renderer factorizations):
|
|
*
|
|
* .upload( gl, seq, values, renderer )
|
|
*
|
|
* sets uniforms in 'seq' to 'values[id].value'
|
|
*
|
|
* .seqWithValue( seq, values ) : filteredSeq
|
|
*
|
|
* filters 'seq' entries with corresponding entry in values
|
|
*
|
|
*
|
|
* Methods of the top-level container (renderer factorizations):
|
|
*
|
|
* .setValue( gl, name, value )
|
|
*
|
|
* sets uniform with name 'name' to 'value'
|
|
*
|
|
* .set( gl, obj, prop )
|
|
*
|
|
* sets uniform from object and property with same name than uniform
|
|
*
|
|
* .setOptional( gl, obj, prop )
|
|
*
|
|
* like .set for an optional property of the object
|
|
*
|
|
*/
|
|
|
|
var emptyTexture = new Texture();
|
|
var emptyCubeTexture = new CubeTexture();
|
|
|
|
// --- Base for inner nodes (including the root) ---
|
|
|
|
function UniformContainer() {
|
|
|
|
this.seq = [];
|
|
this.map = {};
|
|
|
|
}
|
|
|
|
// --- Utilities ---
|
|
|
|
// Array Caches (provide typed arrays for temporary by size)
|
|
|
|
var arrayCacheF32 = [];
|
|
var arrayCacheI32 = [];
|
|
|
|
// Float32Array caches used for uploading Matrix uniforms
|
|
|
|
var mat4array = new Float32Array( 16 );
|
|
var mat3array = new Float32Array( 9 );
|
|
|
|
// Flattening for arrays of vectors and matrices
|
|
|
|
function flatten( array, nBlocks, blockSize ) {
|
|
|
|
var firstElem = array[ 0 ];
|
|
|
|
if ( firstElem <= 0 || firstElem > 0 ) return array;
|
|
// unoptimized: ! isNaN( firstElem )
|
|
// see http://jacksondunstan.com/articles/983
|
|
|
|
var n = nBlocks * blockSize,
|
|
r = arrayCacheF32[ n ];
|
|
|
|
if ( r === undefined ) {
|
|
|
|
r = new Float32Array( n );
|
|
arrayCacheF32[ n ] = r;
|
|
|
|
}
|
|
|
|
if ( nBlocks !== 0 ) {
|
|
|
|
firstElem.toArray( r, 0 );
|
|
|
|
for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {
|
|
|
|
offset += blockSize;
|
|
array[ i ].toArray( r, offset );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
// Texture unit allocation
|
|
|
|
function allocTexUnits( renderer, n ) {
|
|
|
|
var r = arrayCacheI32[ n ];
|
|
|
|
if ( r === undefined ) {
|
|
|
|
r = new Int32Array( n );
|
|
arrayCacheI32[ n ] = r;
|
|
|
|
}
|
|
|
|
for ( var i = 0; i !== n; ++ i )
|
|
r[ i ] = renderer.allocTextureUnit();
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
// --- Setters ---
|
|
|
|
// Note: Defining these methods externally, because they come in a bunch
|
|
// and this way their names minify.
|
|
|
|
// Single scalar
|
|
|
|
function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }
|
|
function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }
|
|
|
|
// Single float vector (from flat array or THREE.VectorN)
|
|
|
|
function setValue2fv( gl, v ) {
|
|
|
|
if ( v.x === undefined ) gl.uniform2fv( this.addr, v );
|
|
else gl.uniform2f( this.addr, v.x, v.y );
|
|
|
|
}
|
|
|
|
function setValue3fv( gl, v ) {
|
|
|
|
if ( v.x !== undefined )
|
|
gl.uniform3f( this.addr, v.x, v.y, v.z );
|
|
else if ( v.r !== undefined )
|
|
gl.uniform3f( this.addr, v.r, v.g, v.b );
|
|
else
|
|
gl.uniform3fv( this.addr, v );
|
|
|
|
}
|
|
|
|
function setValue4fv( gl, v ) {
|
|
|
|
if ( v.x === undefined ) gl.uniform4fv( this.addr, v );
|
|
else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );
|
|
|
|
}
|
|
|
|
// Single matrix (from flat array or MatrixN)
|
|
|
|
function setValue2fm( gl, v ) {
|
|
|
|
gl.uniformMatrix2fv( this.addr, false, v.elements || v );
|
|
|
|
}
|
|
|
|
function setValue3fm( gl, v ) {
|
|
|
|
if ( v.elements === undefined ) {
|
|
|
|
gl.uniformMatrix3fv( this.addr, false, v );
|
|
|
|
} else {
|
|
|
|
mat3array.set( v.elements );
|
|
gl.uniformMatrix3fv( this.addr, false, mat3array );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setValue4fm( gl, v ) {
|
|
|
|
if ( v.elements === undefined ) {
|
|
|
|
gl.uniformMatrix4fv( this.addr, false, v );
|
|
|
|
} else {
|
|
|
|
mat4array.set( v.elements );
|
|
gl.uniformMatrix4fv( this.addr, false, mat4array );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Single texture (2D / Cube)
|
|
|
|
function setValueT1( gl, v, renderer ) {
|
|
|
|
var unit = renderer.allocTextureUnit();
|
|
gl.uniform1i( this.addr, unit );
|
|
renderer.setTexture2D( v || emptyTexture, unit );
|
|
|
|
}
|
|
|
|
function setValueT6( gl, v, renderer ) {
|
|
|
|
var unit = renderer.allocTextureUnit();
|
|
gl.uniform1i( this.addr, unit );
|
|
renderer.setTextureCube( v || emptyCubeTexture, unit );
|
|
|
|
}
|
|
|
|
// Integer / Boolean vectors or arrays thereof (always flat arrays)
|
|
|
|
function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }
|
|
function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }
|
|
function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }
|
|
|
|
// Helper to pick the right setter for the singular case
|
|
|
|
function getSingularSetter( type ) {
|
|
|
|
switch ( type ) {
|
|
|
|
case 0x1406: return setValue1f; // FLOAT
|
|
case 0x8b50: return setValue2fv; // _VEC2
|
|
case 0x8b51: return setValue3fv; // _VEC3
|
|
case 0x8b52: return setValue4fv; // _VEC4
|
|
|
|
case 0x8b5a: return setValue2fm; // _MAT2
|
|
case 0x8b5b: return setValue3fm; // _MAT3
|
|
case 0x8b5c: return setValue4fm; // _MAT4
|
|
|
|
case 0x8b5e: return setValueT1; // SAMPLER_2D
|
|
case 0x8b60: return setValueT6; // SAMPLER_CUBE
|
|
|
|
case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL
|
|
case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2
|
|
case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3
|
|
case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Array of scalars
|
|
|
|
function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }
|
|
function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }
|
|
|
|
// Array of vectors (flat or from THREE classes)
|
|
|
|
function setValueV2a( gl, v ) {
|
|
|
|
gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );
|
|
|
|
}
|
|
|
|
function setValueV3a( gl, v ) {
|
|
|
|
gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );
|
|
|
|
}
|
|
|
|
function setValueV4a( gl, v ) {
|
|
|
|
gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );
|
|
|
|
}
|
|
|
|
// Array of matrices (flat or from THREE clases)
|
|
|
|
function setValueM2a( gl, v ) {
|
|
|
|
gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );
|
|
|
|
}
|
|
|
|
function setValueM3a( gl, v ) {
|
|
|
|
gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );
|
|
|
|
}
|
|
|
|
function setValueM4a( gl, v ) {
|
|
|
|
gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );
|
|
|
|
}
|
|
|
|
// Array of textures (2D / Cube)
|
|
|
|
function setValueT1a( gl, v, renderer ) {
|
|
|
|
var n = v.length,
|
|
units = allocTexUnits( renderer, n );
|
|
|
|
gl.uniform1iv( this.addr, units );
|
|
|
|
for ( var i = 0; i !== n; ++ i ) {
|
|
|
|
renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setValueT6a( gl, v, renderer ) {
|
|
|
|
var n = v.length,
|
|
units = allocTexUnits( renderer, n );
|
|
|
|
gl.uniform1iv( this.addr, units );
|
|
|
|
for ( var i = 0; i !== n; ++ i ) {
|
|
|
|
renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Helper to pick the right setter for a pure (bottom-level) array
|
|
|
|
function getPureArraySetter( type ) {
|
|
|
|
switch ( type ) {
|
|
|
|
case 0x1406: return setValue1fv; // FLOAT
|
|
case 0x8b50: return setValueV2a; // _VEC2
|
|
case 0x8b51: return setValueV3a; // _VEC3
|
|
case 0x8b52: return setValueV4a; // _VEC4
|
|
|
|
case 0x8b5a: return setValueM2a; // _MAT2
|
|
case 0x8b5b: return setValueM3a; // _MAT3
|
|
case 0x8b5c: return setValueM4a; // _MAT4
|
|
|
|
case 0x8b5e: return setValueT1a; // SAMPLER_2D
|
|
case 0x8b60: return setValueT6a; // SAMPLER_CUBE
|
|
|
|
case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL
|
|
case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2
|
|
case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3
|
|
case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// --- Uniform Classes ---
|
|
|
|
function SingleUniform( id, activeInfo, addr ) {
|
|
|
|
this.id = id;
|
|
this.addr = addr;
|
|
this.setValue = getSingularSetter( activeInfo.type );
|
|
|
|
// this.path = activeInfo.name; // DEBUG
|
|
|
|
}
|
|
|
|
function PureArrayUniform( id, activeInfo, addr ) {
|
|
|
|
this.id = id;
|
|
this.addr = addr;
|
|
this.size = activeInfo.size;
|
|
this.setValue = getPureArraySetter( activeInfo.type );
|
|
|
|
// this.path = activeInfo.name; // DEBUG
|
|
|
|
}
|
|
|
|
function StructuredUniform( id ) {
|
|
|
|
this.id = id;
|
|
|
|
UniformContainer.call( this ); // mix-in
|
|
|
|
}
|
|
|
|
StructuredUniform.prototype.setValue = function ( gl, value ) {
|
|
|
|
// Note: Don't need an extra 'renderer' parameter, since samplers
|
|
// are not allowed in structured uniforms.
|
|
|
|
var seq = this.seq;
|
|
|
|
for ( var i = 0, n = seq.length; i !== n; ++ i ) {
|
|
|
|
var u = seq[ i ];
|
|
u.setValue( gl, value[ u.id ] );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
// --- Top-level ---
|
|
|
|
// Parser - builds up the property tree from the path strings
|
|
|
|
var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g;
|
|
|
|
// extracts
|
|
// - the identifier (member name or array index)
|
|
// - followed by an optional right bracket (found when array index)
|
|
// - followed by an optional left bracket or dot (type of subscript)
|
|
//
|
|
// Note: These portions can be read in a non-overlapping fashion and
|
|
// allow straightforward parsing of the hierarchy that WebGL encodes
|
|
// in the uniform names.
|
|
|
|
function addUniform( container, uniformObject ) {
|
|
|
|
container.seq.push( uniformObject );
|
|
container.map[ uniformObject.id ] = uniformObject;
|
|
|
|
}
|
|
|
|
function parseUniform( activeInfo, addr, container ) {
|
|
|
|
var path = activeInfo.name,
|
|
pathLength = path.length;
|
|
|
|
// reset RegExp object, because of the early exit of a previous run
|
|
RePathPart.lastIndex = 0;
|
|
|
|
for ( ; ; ) {
|
|
|
|
var match = RePathPart.exec( path ),
|
|
matchEnd = RePathPart.lastIndex,
|
|
|
|
id = match[ 1 ],
|
|
idIsIndex = match[ 2 ] === ']',
|
|
subscript = match[ 3 ];
|
|
|
|
if ( idIsIndex ) id = id | 0; // convert to integer
|
|
|
|
if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {
|
|
|
|
// bare name or "pure" bottom-level array "[0]" suffix
|
|
|
|
addUniform( container, subscript === undefined ?
|
|
new SingleUniform( id, activeInfo, addr ) :
|
|
new PureArrayUniform( id, activeInfo, addr ) );
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
// step into inner node / create it in case it doesn't exist
|
|
|
|
var map = container.map, next = map[ id ];
|
|
|
|
if ( next === undefined ) {
|
|
|
|
next = new StructuredUniform( id );
|
|
addUniform( container, next );
|
|
|
|
}
|
|
|
|
container = next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Root Container
|
|
|
|
function WebGLUniforms( gl, program, renderer ) {
|
|
|
|
UniformContainer.call( this );
|
|
|
|
this.renderer = renderer;
|
|
|
|
var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
|
|
|
|
for ( var i = 0; i < n; ++ i ) {
|
|
|
|
var info = gl.getActiveUniform( program, i ),
|
|
path = info.name,
|
|
addr = gl.getUniformLocation( program, path );
|
|
|
|
parseUniform( info, addr, this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
WebGLUniforms.prototype.setValue = function ( gl, name, value ) {
|
|
|
|
var u = this.map[ name ];
|
|
|
|
if ( u !== undefined ) u.setValue( gl, value, this.renderer );
|
|
|
|
};
|
|
|
|
WebGLUniforms.prototype.setOptional = function ( gl, object, name ) {
|
|
|
|
var v = object[ name ];
|
|
|
|
if ( v !== undefined ) this.setValue( gl, name, v );
|
|
|
|
};
|
|
|
|
|
|
// Static interface
|
|
|
|
WebGLUniforms.upload = function ( gl, seq, values, renderer ) {
|
|
|
|
for ( var i = 0, n = seq.length; i !== n; ++ i ) {
|
|
|
|
var u = seq[ i ],
|
|
v = values[ u.id ];
|
|
|
|
if ( v.needsUpdate !== false ) {
|
|
|
|
// note: always updating when .needsUpdate is undefined
|
|
u.setValue( gl, v.value, renderer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
WebGLUniforms.seqWithValue = function ( seq, values ) {
|
|
|
|
var r = [];
|
|
|
|
for ( var i = 0, n = seq.length; i !== n; ++ i ) {
|
|
|
|
var u = seq[ i ];
|
|
if ( u.id in values ) r.push( u );
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
|
|
'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
|
|
'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
|
|
'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
|
|
'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
|
|
'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
|
|
'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
|
|
'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
|
|
'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
|
|
'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
|
|
'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
|
|
'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
|
|
'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
|
|
'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
|
|
'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
|
|
'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
|
|
'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
|
|
'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
|
|
'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
|
|
'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
|
|
'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
|
|
'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
|
|
'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
|
|
'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
|
|
|
|
function Color( r, g, b ) {
|
|
|
|
if ( g === undefined && b === undefined ) {
|
|
|
|
// r is THREE.Color, hex or string
|
|
return this.set( r );
|
|
|
|
}
|
|
|
|
return this.setRGB( r, g, b );
|
|
|
|
}
|
|
|
|
Object.assign( Color.prototype, {
|
|
|
|
isColor: true,
|
|
|
|
r: 1, g: 1, b: 1,
|
|
|
|
set: function ( value ) {
|
|
|
|
if ( value && value.isColor ) {
|
|
|
|
this.copy( value );
|
|
|
|
} else if ( typeof value === 'number' ) {
|
|
|
|
this.setHex( value );
|
|
|
|
} else if ( typeof value === 'string' ) {
|
|
|
|
this.setStyle( value );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setScalar: function ( scalar ) {
|
|
|
|
this.r = scalar;
|
|
this.g = scalar;
|
|
this.b = scalar;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setHex: function ( hex ) {
|
|
|
|
hex = Math.floor( hex );
|
|
|
|
this.r = ( hex >> 16 & 255 ) / 255;
|
|
this.g = ( hex >> 8 & 255 ) / 255;
|
|
this.b = ( hex & 255 ) / 255;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setRGB: function ( r, g, b ) {
|
|
|
|
this.r = r;
|
|
this.g = g;
|
|
this.b = b;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setHSL: function () {
|
|
|
|
function hue2rgb( p, q, t ) {
|
|
|
|
if ( t < 0 ) t += 1;
|
|
if ( t > 1 ) t -= 1;
|
|
if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;
|
|
if ( t < 1 / 2 ) return q;
|
|
if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );
|
|
return p;
|
|
|
|
}
|
|
|
|
return function setHSL( h, s, l ) {
|
|
|
|
// h,s,l ranges are in 0.0 - 1.0
|
|
h = _Math.euclideanModulo( h, 1 );
|
|
s = _Math.clamp( s, 0, 1 );
|
|
l = _Math.clamp( l, 0, 1 );
|
|
|
|
if ( s === 0 ) {
|
|
|
|
this.r = this.g = this.b = l;
|
|
|
|
} else {
|
|
|
|
var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
|
|
var q = ( 2 * l ) - p;
|
|
|
|
this.r = hue2rgb( q, p, h + 1 / 3 );
|
|
this.g = hue2rgb( q, p, h );
|
|
this.b = hue2rgb( q, p, h - 1 / 3 );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
setStyle: function ( style ) {
|
|
|
|
function handleAlpha( string ) {
|
|
|
|
if ( string === undefined ) return;
|
|
|
|
if ( parseFloat( string ) < 1 ) {
|
|
|
|
console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
var m;
|
|
|
|
if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) {
|
|
|
|
// rgb / hsl
|
|
|
|
var color;
|
|
var name = m[ 1 ];
|
|
var components = m[ 2 ];
|
|
|
|
switch ( name ) {
|
|
|
|
case 'rgb':
|
|
case 'rgba':
|
|
|
|
if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
|
|
|
|
// rgb(255,0,0) rgba(255,0,0,0.5)
|
|
this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;
|
|
this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;
|
|
this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;
|
|
|
|
handleAlpha( color[ 5 ] );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
|
|
|
|
// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
|
|
this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;
|
|
this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;
|
|
this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;
|
|
|
|
handleAlpha( color[ 5 ] );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'hsl':
|
|
case 'hsla':
|
|
|
|
if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
|
|
|
|
// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
|
|
var h = parseFloat( color[ 1 ] ) / 360;
|
|
var s = parseInt( color[ 2 ], 10 ) / 100;
|
|
var l = parseInt( color[ 3 ], 10 ) / 100;
|
|
|
|
handleAlpha( color[ 5 ] );
|
|
|
|
return this.setHSL( h, s, l );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) {
|
|
|
|
// hex color
|
|
|
|
var hex = m[ 1 ];
|
|
var size = hex.length;
|
|
|
|
if ( size === 3 ) {
|
|
|
|
// #ff0
|
|
this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;
|
|
this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;
|
|
this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;
|
|
|
|
return this;
|
|
|
|
} else if ( size === 6 ) {
|
|
|
|
// #ff0000
|
|
this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;
|
|
this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;
|
|
this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( style && style.length > 0 ) {
|
|
|
|
// color keywords
|
|
var hex = ColorKeywords[ style ];
|
|
|
|
if ( hex !== undefined ) {
|
|
|
|
// red
|
|
this.setHex( hex );
|
|
|
|
} else {
|
|
|
|
// unknown color
|
|
console.warn( 'THREE.Color: Unknown color ' + style );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.r, this.g, this.b );
|
|
|
|
},
|
|
|
|
copy: function ( color ) {
|
|
|
|
this.r = color.r;
|
|
this.g = color.g;
|
|
this.b = color.b;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyGammaToLinear: function ( color, gammaFactor ) {
|
|
|
|
if ( gammaFactor === undefined ) gammaFactor = 2.0;
|
|
|
|
this.r = Math.pow( color.r, gammaFactor );
|
|
this.g = Math.pow( color.g, gammaFactor );
|
|
this.b = Math.pow( color.b, gammaFactor );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyLinearToGamma: function ( color, gammaFactor ) {
|
|
|
|
if ( gammaFactor === undefined ) gammaFactor = 2.0;
|
|
|
|
var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;
|
|
|
|
this.r = Math.pow( color.r, safeInverse );
|
|
this.g = Math.pow( color.g, safeInverse );
|
|
this.b = Math.pow( color.b, safeInverse );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
convertGammaToLinear: function () {
|
|
|
|
var r = this.r, g = this.g, b = this.b;
|
|
|
|
this.r = r * r;
|
|
this.g = g * g;
|
|
this.b = b * b;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
convertLinearToGamma: function () {
|
|
|
|
this.r = Math.sqrt( this.r );
|
|
this.g = Math.sqrt( this.g );
|
|
this.b = Math.sqrt( this.b );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getHex: function () {
|
|
|
|
return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
|
|
|
|
},
|
|
|
|
getHexString: function () {
|
|
|
|
return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );
|
|
|
|
},
|
|
|
|
getHSL: function ( optionalTarget ) {
|
|
|
|
// h,s,l ranges are in 0.0 - 1.0
|
|
|
|
var hsl = optionalTarget || { h: 0, s: 0, l: 0 };
|
|
|
|
var r = this.r, g = this.g, b = this.b;
|
|
|
|
var max = Math.max( r, g, b );
|
|
var min = Math.min( r, g, b );
|
|
|
|
var hue, saturation;
|
|
var lightness = ( min + max ) / 2.0;
|
|
|
|
if ( min === max ) {
|
|
|
|
hue = 0;
|
|
saturation = 0;
|
|
|
|
} else {
|
|
|
|
var delta = max - min;
|
|
|
|
saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );
|
|
|
|
switch ( max ) {
|
|
|
|
case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;
|
|
case g: hue = ( b - r ) / delta + 2; break;
|
|
case b: hue = ( r - g ) / delta + 4; break;
|
|
|
|
}
|
|
|
|
hue /= 6;
|
|
|
|
}
|
|
|
|
hsl.h = hue;
|
|
hsl.s = saturation;
|
|
hsl.l = lightness;
|
|
|
|
return hsl;
|
|
|
|
},
|
|
|
|
getStyle: function () {
|
|
|
|
return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
|
|
|
|
},
|
|
|
|
offsetHSL: function ( h, s, l ) {
|
|
|
|
var hsl = this.getHSL();
|
|
|
|
hsl.h += h; hsl.s += s; hsl.l += l;
|
|
|
|
this.setHSL( hsl.h, hsl.s, hsl.l );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
add: function ( color ) {
|
|
|
|
this.r += color.r;
|
|
this.g += color.g;
|
|
this.b += color.b;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addColors: function ( color1, color2 ) {
|
|
|
|
this.r = color1.r + color2.r;
|
|
this.g = color1.g + color2.g;
|
|
this.b = color1.b + color2.b;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addScalar: function ( s ) {
|
|
|
|
this.r += s;
|
|
this.g += s;
|
|
this.b += s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
sub: function( color ) {
|
|
|
|
this.r = Math.max( 0, this.r - color.r );
|
|
this.g = Math.max( 0, this.g - color.g );
|
|
this.b = Math.max( 0, this.b - color.b );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiply: function ( color ) {
|
|
|
|
this.r *= color.r;
|
|
this.g *= color.g;
|
|
this.b *= color.b;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyScalar: function ( s ) {
|
|
|
|
this.r *= s;
|
|
this.g *= s;
|
|
this.b *= s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
lerp: function ( color, alpha ) {
|
|
|
|
this.r += ( color.r - this.r ) * alpha;
|
|
this.g += ( color.g - this.g ) * alpha;
|
|
this.b += ( color.b - this.b ) * alpha;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( c ) {
|
|
|
|
return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this.r = array[ offset ];
|
|
this.g = array[ offset + 1 ];
|
|
this.b = array[ offset + 2 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
array[ offset ] = this.r;
|
|
array[ offset + 1 ] = this.g;
|
|
array[ offset + 2 ] = this.b;
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
toJSON: function () {
|
|
|
|
return this.getHex();
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* Uniforms library for shared webgl shaders
|
|
*/
|
|
|
|
var UniformsLib = {
|
|
|
|
common: {
|
|
|
|
diffuse: { value: new Color( 0xeeeeee ) },
|
|
opacity: { value: 1.0 },
|
|
|
|
map: { value: null },
|
|
offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },
|
|
|
|
specularMap: { value: null },
|
|
alphaMap: { value: null },
|
|
|
|
envMap: { value: null },
|
|
flipEnvMap: { value: - 1 },
|
|
reflectivity: { value: 1.0 },
|
|
refractionRatio: { value: 0.98 }
|
|
|
|
},
|
|
|
|
aomap: {
|
|
|
|
aoMap: { value: null },
|
|
aoMapIntensity: { value: 1 }
|
|
|
|
},
|
|
|
|
lightmap: {
|
|
|
|
lightMap: { value: null },
|
|
lightMapIntensity: { value: 1 }
|
|
|
|
},
|
|
|
|
emissivemap: {
|
|
|
|
emissiveMap: { value: null }
|
|
|
|
},
|
|
|
|
bumpmap: {
|
|
|
|
bumpMap: { value: null },
|
|
bumpScale: { value: 1 }
|
|
|
|
},
|
|
|
|
normalmap: {
|
|
|
|
normalMap: { value: null },
|
|
normalScale: { value: new Vector2( 1, 1 ) }
|
|
|
|
},
|
|
|
|
displacementmap: {
|
|
|
|
displacementMap: { value: null },
|
|
displacementScale: { value: 1 },
|
|
displacementBias: { value: 0 }
|
|
|
|
},
|
|
|
|
roughnessmap: {
|
|
|
|
roughnessMap: { value: null }
|
|
|
|
},
|
|
|
|
metalnessmap: {
|
|
|
|
metalnessMap: { value: null }
|
|
|
|
},
|
|
|
|
gradientmap: {
|
|
|
|
gradientMap: { value: null }
|
|
|
|
},
|
|
|
|
fog: {
|
|
|
|
fogDensity: { value: 0.00025 },
|
|
fogNear: { value: 1 },
|
|
fogFar: { value: 2000 },
|
|
fogColor: { value: new Color( 0xffffff ) }
|
|
|
|
},
|
|
|
|
lights: {
|
|
|
|
ambientLightColor: { value: [] },
|
|
|
|
directionalLights: { value: [], properties: {
|
|
direction: {},
|
|
color: {},
|
|
|
|
shadow: {},
|
|
shadowBias: {},
|
|
shadowRadius: {},
|
|
shadowMapSize: {}
|
|
} },
|
|
|
|
directionalShadowMap: { value: [] },
|
|
directionalShadowMatrix: { value: [] },
|
|
|
|
spotLights: { value: [], properties: {
|
|
color: {},
|
|
position: {},
|
|
direction: {},
|
|
distance: {},
|
|
coneCos: {},
|
|
penumbraCos: {},
|
|
decay: {},
|
|
|
|
shadow: {},
|
|
shadowBias: {},
|
|
shadowRadius: {},
|
|
shadowMapSize: {}
|
|
} },
|
|
|
|
spotShadowMap: { value: [] },
|
|
spotShadowMatrix: { value: [] },
|
|
|
|
pointLights: { value: [], properties: {
|
|
color: {},
|
|
position: {},
|
|
decay: {},
|
|
distance: {},
|
|
|
|
shadow: {},
|
|
shadowBias: {},
|
|
shadowRadius: {},
|
|
shadowMapSize: {}
|
|
} },
|
|
|
|
pointShadowMap: { value: [] },
|
|
pointShadowMatrix: { value: [] },
|
|
|
|
hemisphereLights: { value: [], properties: {
|
|
direction: {},
|
|
skyColor: {},
|
|
groundColor: {}
|
|
} },
|
|
|
|
// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src
|
|
rectAreaLights: { value: [], properties: {
|
|
color: {},
|
|
position: {},
|
|
width: {},
|
|
height: {}
|
|
} }
|
|
|
|
},
|
|
|
|
points: {
|
|
|
|
diffuse: { value: new Color( 0xeeeeee ) },
|
|
opacity: { value: 1.0 },
|
|
size: { value: 1.0 },
|
|
scale: { value: 1.0 },
|
|
map: { value: null },
|
|
offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Uniform Utilities
|
|
*/
|
|
|
|
var UniformsUtils = {
|
|
|
|
merge: function ( uniforms ) {
|
|
|
|
var merged = {};
|
|
|
|
for ( var u = 0; u < uniforms.length; u ++ ) {
|
|
|
|
var tmp = this.clone( uniforms[ u ] );
|
|
|
|
for ( var p in tmp ) {
|
|
|
|
merged[ p ] = tmp[ p ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return merged;
|
|
|
|
},
|
|
|
|
clone: function ( uniforms_src ) {
|
|
|
|
var uniforms_dst = {};
|
|
|
|
for ( var u in uniforms_src ) {
|
|
|
|
uniforms_dst[ u ] = {};
|
|
|
|
for ( var p in uniforms_src[ u ] ) {
|
|
|
|
var parameter_src = uniforms_src[ u ][ p ];
|
|
|
|
if ( parameter_src && ( parameter_src.isColor ||
|
|
parameter_src.isMatrix3 || parameter_src.isMatrix4 ||
|
|
parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||
|
|
parameter_src.isTexture ) ) {
|
|
|
|
uniforms_dst[ u ][ p ] = parameter_src.clone();
|
|
|
|
} else if ( Array.isArray( parameter_src ) ) {
|
|
|
|
uniforms_dst[ u ][ p ] = parameter_src.slice();
|
|
|
|
} else {
|
|
|
|
uniforms_dst[ u ][ p ] = parameter_src;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return uniforms_dst;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n";
|
|
|
|
var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";
|
|
|
|
var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n";
|
|
|
|
var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n";
|
|
|
|
var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
|
|
|
|
var begin_vertex = "\nvec3 transformed = vec3( position );\n";
|
|
|
|
var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n";
|
|
|
|
var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n";
|
|
|
|
var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n";
|
|
|
|
var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n";
|
|
|
|
var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";
|
|
|
|
var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n";
|
|
|
|
var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n";
|
|
|
|
var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";
|
|
|
|
var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";
|
|
|
|
var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
|
|
|
|
var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";
|
|
|
|
var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n";
|
|
|
|
var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";
|
|
|
|
var defaultnormal_vertex = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n";
|
|
|
|
var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";
|
|
|
|
var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n";
|
|
|
|
var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n";
|
|
|
|
var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";
|
|
|
|
var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n";
|
|
|
|
var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n";
|
|
|
|
var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";
|
|
|
|
var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";
|
|
|
|
var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";
|
|
|
|
var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n";
|
|
|
|
var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif";
|
|
|
|
var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n";
|
|
|
|
var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n";
|
|
|
|
var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n";
|
|
|
|
var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n";
|
|
|
|
var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n";
|
|
|
|
var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
|
|
|
|
var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n";
|
|
|
|
var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";
|
|
|
|
var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n";
|
|
|
|
var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n";
|
|
|
|
var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n";
|
|
|
|
var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n";
|
|
|
|
var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n";
|
|
|
|
var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif";
|
|
|
|
var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";
|
|
|
|
var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";
|
|
|
|
var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n";
|
|
|
|
var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n";
|
|
|
|
var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";
|
|
|
|
var map_particle_fragment = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";
|
|
|
|
var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n";
|
|
|
|
var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n";
|
|
|
|
var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
|
|
|
|
var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n";
|
|
|
|
var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
|
|
|
|
var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";
|
|
|
|
var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n";
|
|
|
|
var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n";
|
|
|
|
var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n";
|
|
|
|
var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n";
|
|
|
|
var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n";
|
|
|
|
var project_vertex = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n";
|
|
|
|
var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n";
|
|
|
|
var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";
|
|
|
|
var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n";
|
|
|
|
var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
|
|
|
|
var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n";
|
|
|
|
var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";
|
|
|
|
var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";
|
|
|
|
var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";
|
|
|
|
var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
|
|
|
|
var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";
|
|
|
|
var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n";
|
|
|
|
var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n";
|
|
|
|
var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";
|
|
|
|
var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
|
|
|
|
var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n";
|
|
|
|
var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n";
|
|
|
|
var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";
|
|
|
|
var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n";
|
|
|
|
var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif";
|
|
|
|
var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";
|
|
|
|
var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";
|
|
|
|
var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";
|
|
|
|
var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n";
|
|
|
|
var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";
|
|
|
|
var cube_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
|
|
|
|
var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n";
|
|
|
|
var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
|
|
|
|
var distanceRGBA_frag = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n";
|
|
|
|
var distanceRGBA_vert = "varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n";
|
|
|
|
var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";
|
|
|
|
var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
|
|
|
|
var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
|
|
|
|
var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";
|
|
|
|
var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
|
|
|
|
var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n";
|
|
|
|
var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
|
|
|
|
var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
|
|
|
|
var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
|
|
|
|
var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
|
|
|
|
var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
|
|
|
|
var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
|
|
|
|
var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n";
|
|
|
|
var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n";
|
|
|
|
var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
|
|
|
|
var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
|
|
|
|
var shadow_frag = "uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n";
|
|
|
|
var shadow_vert = "#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n";
|
|
|
|
var ShaderChunk = {
|
|
alphamap_fragment: alphamap_fragment,
|
|
alphamap_pars_fragment: alphamap_pars_fragment,
|
|
alphatest_fragment: alphatest_fragment,
|
|
aomap_fragment: aomap_fragment,
|
|
aomap_pars_fragment: aomap_pars_fragment,
|
|
begin_vertex: begin_vertex,
|
|
beginnormal_vertex: beginnormal_vertex,
|
|
bsdfs: bsdfs,
|
|
bumpmap_pars_fragment: bumpmap_pars_fragment,
|
|
clipping_planes_fragment: clipping_planes_fragment,
|
|
clipping_planes_pars_fragment: clipping_planes_pars_fragment,
|
|
clipping_planes_pars_vertex: clipping_planes_pars_vertex,
|
|
clipping_planes_vertex: clipping_planes_vertex,
|
|
color_fragment: color_fragment,
|
|
color_pars_fragment: color_pars_fragment,
|
|
color_pars_vertex: color_pars_vertex,
|
|
color_vertex: color_vertex,
|
|
common: common,
|
|
cube_uv_reflection_fragment: cube_uv_reflection_fragment,
|
|
defaultnormal_vertex: defaultnormal_vertex,
|
|
displacementmap_pars_vertex: displacementmap_pars_vertex,
|
|
displacementmap_vertex: displacementmap_vertex,
|
|
emissivemap_fragment: emissivemap_fragment,
|
|
emissivemap_pars_fragment: emissivemap_pars_fragment,
|
|
encodings_fragment: encodings_fragment,
|
|
encodings_pars_fragment: encodings_pars_fragment,
|
|
envmap_fragment: envmap_fragment,
|
|
envmap_pars_fragment: envmap_pars_fragment,
|
|
envmap_pars_vertex: envmap_pars_vertex,
|
|
envmap_vertex: envmap_vertex,
|
|
fog_vertex: fog_vertex,
|
|
fog_pars_vertex: fog_pars_vertex,
|
|
fog_fragment: fog_fragment,
|
|
fog_pars_fragment: fog_pars_fragment,
|
|
gradientmap_pars_fragment: gradientmap_pars_fragment,
|
|
lightmap_fragment: lightmap_fragment,
|
|
lightmap_pars_fragment: lightmap_pars_fragment,
|
|
lights_lambert_vertex: lights_lambert_vertex,
|
|
lights_pars: lights_pars,
|
|
lights_phong_fragment: lights_phong_fragment,
|
|
lights_phong_pars_fragment: lights_phong_pars_fragment,
|
|
lights_physical_fragment: lights_physical_fragment,
|
|
lights_physical_pars_fragment: lights_physical_pars_fragment,
|
|
lights_template: lights_template,
|
|
logdepthbuf_fragment: logdepthbuf_fragment,
|
|
logdepthbuf_pars_fragment: logdepthbuf_pars_fragment,
|
|
logdepthbuf_pars_vertex: logdepthbuf_pars_vertex,
|
|
logdepthbuf_vertex: logdepthbuf_vertex,
|
|
map_fragment: map_fragment,
|
|
map_pars_fragment: map_pars_fragment,
|
|
map_particle_fragment: map_particle_fragment,
|
|
map_particle_pars_fragment: map_particle_pars_fragment,
|
|
metalnessmap_fragment: metalnessmap_fragment,
|
|
metalnessmap_pars_fragment: metalnessmap_pars_fragment,
|
|
morphnormal_vertex: morphnormal_vertex,
|
|
morphtarget_pars_vertex: morphtarget_pars_vertex,
|
|
morphtarget_vertex: morphtarget_vertex,
|
|
normal_flip: normal_flip,
|
|
normal_fragment: normal_fragment,
|
|
normalmap_pars_fragment: normalmap_pars_fragment,
|
|
packing: packing,
|
|
premultiplied_alpha_fragment: premultiplied_alpha_fragment,
|
|
project_vertex: project_vertex,
|
|
dithering_fragment: dithering_fragment,
|
|
dithering_pars_fragment: dithering_pars_fragment,
|
|
roughnessmap_fragment: roughnessmap_fragment,
|
|
roughnessmap_pars_fragment: roughnessmap_pars_fragment,
|
|
shadowmap_pars_fragment: shadowmap_pars_fragment,
|
|
shadowmap_pars_vertex: shadowmap_pars_vertex,
|
|
shadowmap_vertex: shadowmap_vertex,
|
|
shadowmask_pars_fragment: shadowmask_pars_fragment,
|
|
skinbase_vertex: skinbase_vertex,
|
|
skinning_pars_vertex: skinning_pars_vertex,
|
|
skinning_vertex: skinning_vertex,
|
|
skinnormal_vertex: skinnormal_vertex,
|
|
specularmap_fragment: specularmap_fragment,
|
|
specularmap_pars_fragment: specularmap_pars_fragment,
|
|
tonemapping_fragment: tonemapping_fragment,
|
|
tonemapping_pars_fragment: tonemapping_pars_fragment,
|
|
uv_pars_fragment: uv_pars_fragment,
|
|
uv_pars_vertex: uv_pars_vertex,
|
|
uv_vertex: uv_vertex,
|
|
uv2_pars_fragment: uv2_pars_fragment,
|
|
uv2_pars_vertex: uv2_pars_vertex,
|
|
uv2_vertex: uv2_vertex,
|
|
worldpos_vertex: worldpos_vertex,
|
|
|
|
cube_frag: cube_frag,
|
|
cube_vert: cube_vert,
|
|
depth_frag: depth_frag,
|
|
depth_vert: depth_vert,
|
|
distanceRGBA_frag: distanceRGBA_frag,
|
|
distanceRGBA_vert: distanceRGBA_vert,
|
|
equirect_frag: equirect_frag,
|
|
equirect_vert: equirect_vert,
|
|
linedashed_frag: linedashed_frag,
|
|
linedashed_vert: linedashed_vert,
|
|
meshbasic_frag: meshbasic_frag,
|
|
meshbasic_vert: meshbasic_vert,
|
|
meshlambert_frag: meshlambert_frag,
|
|
meshlambert_vert: meshlambert_vert,
|
|
meshphong_frag: meshphong_frag,
|
|
meshphong_vert: meshphong_vert,
|
|
meshphysical_frag: meshphysical_frag,
|
|
meshphysical_vert: meshphysical_vert,
|
|
normal_frag: normal_frag,
|
|
normal_vert: normal_vert,
|
|
points_frag: points_frag,
|
|
points_vert: points_vert,
|
|
shadow_frag: shadow_frag,
|
|
shadow_vert: shadow_vert
|
|
};
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
*/
|
|
|
|
var ShaderLib = {
|
|
|
|
basic: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.fog
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.meshbasic_vert,
|
|
fragmentShader: ShaderChunk.meshbasic_frag
|
|
|
|
},
|
|
|
|
lambert: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.emissivemap,
|
|
UniformsLib.fog,
|
|
UniformsLib.lights,
|
|
{
|
|
emissive: { value: new Color( 0x000000 ) }
|
|
}
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.meshlambert_vert,
|
|
fragmentShader: ShaderChunk.meshlambert_frag
|
|
|
|
},
|
|
|
|
phong: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.emissivemap,
|
|
UniformsLib.bumpmap,
|
|
UniformsLib.normalmap,
|
|
UniformsLib.displacementmap,
|
|
UniformsLib.gradientmap,
|
|
UniformsLib.fog,
|
|
UniformsLib.lights,
|
|
{
|
|
emissive: { value: new Color( 0x000000 ) },
|
|
specular: { value: new Color( 0x111111 ) },
|
|
shininess: { value: 30 }
|
|
}
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.meshphong_vert,
|
|
fragmentShader: ShaderChunk.meshphong_frag
|
|
|
|
},
|
|
|
|
standard: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.emissivemap,
|
|
UniformsLib.bumpmap,
|
|
UniformsLib.normalmap,
|
|
UniformsLib.displacementmap,
|
|
UniformsLib.roughnessmap,
|
|
UniformsLib.metalnessmap,
|
|
UniformsLib.fog,
|
|
UniformsLib.lights,
|
|
{
|
|
emissive: { value: new Color( 0x000000 ) },
|
|
roughness: { value: 0.5 },
|
|
metalness: { value: 0.5 },
|
|
envMapIntensity: { value: 1 } // temporary
|
|
}
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.meshphysical_vert,
|
|
fragmentShader: ShaderChunk.meshphysical_frag
|
|
|
|
},
|
|
|
|
points: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.points,
|
|
UniformsLib.fog
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.points_vert,
|
|
fragmentShader: ShaderChunk.points_frag
|
|
|
|
},
|
|
|
|
dashed: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.fog,
|
|
{
|
|
scale: { value: 1 },
|
|
dashSize: { value: 1 },
|
|
totalSize: { value: 2 }
|
|
}
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.linedashed_vert,
|
|
fragmentShader: ShaderChunk.linedashed_frag
|
|
|
|
},
|
|
|
|
depth: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.displacementmap
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.depth_vert,
|
|
fragmentShader: ShaderChunk.depth_frag
|
|
|
|
},
|
|
|
|
normal: {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.bumpmap,
|
|
UniformsLib.normalmap,
|
|
UniformsLib.displacementmap,
|
|
{
|
|
opacity: { value: 1.0 }
|
|
}
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.normal_vert,
|
|
fragmentShader: ShaderChunk.normal_frag
|
|
|
|
},
|
|
|
|
/* -------------------------------------------------------------------------
|
|
// Cube map shader
|
|
------------------------------------------------------------------------- */
|
|
|
|
cube: {
|
|
|
|
uniforms: {
|
|
tCube: { value: null },
|
|
tFlip: { value: - 1 },
|
|
opacity: { value: 1.0 }
|
|
},
|
|
|
|
vertexShader: ShaderChunk.cube_vert,
|
|
fragmentShader: ShaderChunk.cube_frag
|
|
|
|
},
|
|
|
|
/* -------------------------------------------------------------------------
|
|
// Cube map shader
|
|
------------------------------------------------------------------------- */
|
|
|
|
equirect: {
|
|
|
|
uniforms: {
|
|
tEquirect: { value: null },
|
|
tFlip: { value: - 1 }
|
|
},
|
|
|
|
vertexShader: ShaderChunk.equirect_vert,
|
|
fragmentShader: ShaderChunk.equirect_frag
|
|
|
|
},
|
|
|
|
distanceRGBA: {
|
|
|
|
uniforms: {
|
|
lightPos: { value: new Vector3() }
|
|
},
|
|
|
|
vertexShader: ShaderChunk.distanceRGBA_vert,
|
|
fragmentShader: ShaderChunk.distanceRGBA_frag
|
|
|
|
}
|
|
|
|
};
|
|
|
|
ShaderLib.physical = {
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
ShaderLib.standard.uniforms,
|
|
{
|
|
clearCoat: { value: 0 },
|
|
clearCoatRoughness: { value: 0 }
|
|
}
|
|
] ),
|
|
|
|
vertexShader: ShaderChunk.meshphysical_vert,
|
|
fragmentShader: ShaderChunk.meshphysical_frag
|
|
|
|
};
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Box2( min, max ) {
|
|
|
|
this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );
|
|
this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );
|
|
|
|
}
|
|
|
|
Object.assign( Box2.prototype, {
|
|
|
|
set: function ( min, max ) {
|
|
|
|
this.min.copy( min );
|
|
this.max.copy( max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromPoints: function ( points ) {
|
|
|
|
this.makeEmpty();
|
|
|
|
for ( var i = 0, il = points.length; i < il; i ++ ) {
|
|
|
|
this.expandByPoint( points[ i ] );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromCenterAndSize: function () {
|
|
|
|
var v1 = new Vector2();
|
|
|
|
return function setFromCenterAndSize( center, size ) {
|
|
|
|
var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
|
|
this.min.copy( center ).sub( halfSize );
|
|
this.max.copy( center ).add( halfSize );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( box ) {
|
|
|
|
this.min.copy( box.min );
|
|
this.max.copy( box.max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeEmpty: function () {
|
|
|
|
this.min.x = this.min.y = + Infinity;
|
|
this.max.x = this.max.y = - Infinity;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
isEmpty: function () {
|
|
|
|
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
|
|
|
|
return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
|
|
|
|
},
|
|
|
|
getCenter: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector2();
|
|
return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
|
|
|
|
},
|
|
|
|
getSize: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector2();
|
|
return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );
|
|
|
|
},
|
|
|
|
expandByPoint: function ( point ) {
|
|
|
|
this.min.min( point );
|
|
this.max.max( point );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
expandByVector: function ( vector ) {
|
|
|
|
this.min.sub( vector );
|
|
this.max.add( vector );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
expandByScalar: function ( scalar ) {
|
|
|
|
this.min.addScalar( - scalar );
|
|
this.max.addScalar( scalar );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
containsPoint: function ( point ) {
|
|
|
|
return point.x < this.min.x || point.x > this.max.x ||
|
|
point.y < this.min.y || point.y > this.max.y ? false : true;
|
|
|
|
},
|
|
|
|
containsBox: function ( box ) {
|
|
|
|
return this.min.x <= box.min.x && box.max.x <= this.max.x &&
|
|
this.min.y <= box.min.y && box.max.y <= this.max.y;
|
|
|
|
},
|
|
|
|
getParameter: function ( point, optionalTarget ) {
|
|
|
|
// This can potentially have a divide by zero if the box
|
|
// has a size dimension of 0.
|
|
|
|
var result = optionalTarget || new Vector2();
|
|
|
|
return result.set(
|
|
( point.x - this.min.x ) / ( this.max.x - this.min.x ),
|
|
( point.y - this.min.y ) / ( this.max.y - this.min.y )
|
|
);
|
|
|
|
},
|
|
|
|
intersectsBox: function ( box ) {
|
|
|
|
// using 4 splitting planes to rule out intersections
|
|
|
|
return box.max.x < this.min.x || box.min.x > this.max.x ||
|
|
box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
|
|
|
|
},
|
|
|
|
clampPoint: function ( point, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector2();
|
|
return result.copy( point ).clamp( this.min, this.max );
|
|
|
|
},
|
|
|
|
distanceToPoint: function () {
|
|
|
|
var v1 = new Vector2();
|
|
|
|
return function distanceToPoint( point ) {
|
|
|
|
var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
|
|
return clampedPoint.sub( point ).length();
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersect: function ( box ) {
|
|
|
|
this.min.max( box.min );
|
|
this.max.min( box.max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
union: function ( box ) {
|
|
|
|
this.min.min( box.min );
|
|
this.max.max( box.max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
translate: function ( offset ) {
|
|
|
|
this.min.add( offset );
|
|
this.max.add( offset );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( box ) {
|
|
|
|
return box.min.equals( this.min ) && box.max.equals( this.max );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function LensFlarePlugin( renderer, flares ) {
|
|
|
|
var gl = renderer.context;
|
|
var state = renderer.state;
|
|
|
|
var vertexBuffer, elementBuffer;
|
|
var shader, program, attributes, uniforms;
|
|
|
|
var tempTexture, occlusionTexture;
|
|
|
|
function init() {
|
|
|
|
var vertices = new Float32Array( [
|
|
- 1, - 1, 0, 0,
|
|
1, - 1, 1, 0,
|
|
1, 1, 1, 1,
|
|
- 1, 1, 0, 1
|
|
] );
|
|
|
|
var faces = new Uint16Array( [
|
|
0, 1, 2,
|
|
0, 2, 3
|
|
] );
|
|
|
|
// buffers
|
|
|
|
vertexBuffer = gl.createBuffer();
|
|
elementBuffer = gl.createBuffer();
|
|
|
|
gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
|
|
gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );
|
|
|
|
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );
|
|
|
|
// textures
|
|
|
|
tempTexture = gl.createTexture();
|
|
occlusionTexture = gl.createTexture();
|
|
|
|
state.bindTexture( gl.TEXTURE_2D, tempTexture );
|
|
gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );
|
|
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_MAG_FILTER, gl.NEAREST );
|
|
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
|
|
|
|
state.bindTexture( gl.TEXTURE_2D, occlusionTexture );
|
|
gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );
|
|
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_MAG_FILTER, gl.NEAREST );
|
|
gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
|
|
|
|
shader = {
|
|
|
|
vertexShader: [
|
|
|
|
"uniform lowp int renderType;",
|
|
|
|
"uniform vec3 screenPosition;",
|
|
"uniform vec2 scale;",
|
|
"uniform float rotation;",
|
|
|
|
"uniform sampler2D occlusionMap;",
|
|
|
|
"attribute vec2 position;",
|
|
"attribute vec2 uv;",
|
|
|
|
"varying vec2 vUV;",
|
|
"varying float vVisibility;",
|
|
|
|
"void main() {",
|
|
|
|
"vUV = uv;",
|
|
|
|
"vec2 pos = position;",
|
|
|
|
"if ( renderType == 2 ) {",
|
|
|
|
"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );",
|
|
"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );",
|
|
|
|
"vVisibility = visibility.r / 9.0;",
|
|
"vVisibility *= 1.0 - visibility.g / 9.0;",
|
|
"vVisibility *= visibility.b / 9.0;",
|
|
"vVisibility *= 1.0 - visibility.a / 9.0;",
|
|
|
|
"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;",
|
|
"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;",
|
|
|
|
"}",
|
|
|
|
"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );",
|
|
|
|
"}"
|
|
|
|
].join( "\n" ),
|
|
|
|
fragmentShader: [
|
|
|
|
"uniform lowp int renderType;",
|
|
|
|
"uniform sampler2D map;",
|
|
"uniform float opacity;",
|
|
"uniform vec3 color;",
|
|
|
|
"varying vec2 vUV;",
|
|
"varying float vVisibility;",
|
|
|
|
"void main() {",
|
|
|
|
// pink square
|
|
|
|
"if ( renderType == 0 ) {",
|
|
|
|
"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );",
|
|
|
|
// restore
|
|
|
|
"} else if ( renderType == 1 ) {",
|
|
|
|
"gl_FragColor = texture2D( map, vUV );",
|
|
|
|
// flare
|
|
|
|
"} else {",
|
|
|
|
"vec4 texture = texture2D( map, vUV );",
|
|
"texture.a *= opacity * vVisibility;",
|
|
"gl_FragColor = texture;",
|
|
"gl_FragColor.rgb *= color;",
|
|
|
|
"}",
|
|
|
|
"}"
|
|
|
|
].join( "\n" )
|
|
|
|
};
|
|
|
|
program = createProgram( shader );
|
|
|
|
attributes = {
|
|
vertex: gl.getAttribLocation ( program, "position" ),
|
|
uv: gl.getAttribLocation ( program, "uv" )
|
|
};
|
|
|
|
uniforms = {
|
|
renderType: gl.getUniformLocation( program, "renderType" ),
|
|
map: gl.getUniformLocation( program, "map" ),
|
|
occlusionMap: gl.getUniformLocation( program, "occlusionMap" ),
|
|
opacity: gl.getUniformLocation( program, "opacity" ),
|
|
color: gl.getUniformLocation( program, "color" ),
|
|
scale: gl.getUniformLocation( program, "scale" ),
|
|
rotation: gl.getUniformLocation( program, "rotation" ),
|
|
screenPosition: gl.getUniformLocation( program, "screenPosition" )
|
|
};
|
|
|
|
}
|
|
|
|
/*
|
|
* Render lens flares
|
|
* Method: renders 16x16 0xff00ff-colored points scattered over the light source area,
|
|
* reads these back and calculates occlusion.
|
|
*/
|
|
|
|
this.render = function ( scene, camera, viewport ) {
|
|
|
|
if ( flares.length === 0 ) return;
|
|
|
|
var tempPosition = new Vector3();
|
|
|
|
var invAspect = viewport.w / viewport.z,
|
|
halfViewportWidth = viewport.z * 0.5,
|
|
halfViewportHeight = viewport.w * 0.5;
|
|
|
|
var size = 16 / viewport.w,
|
|
scale = new Vector2( size * invAspect, size );
|
|
|
|
var screenPosition = new Vector3( 1, 1, 0 ),
|
|
screenPositionPixels = new Vector2( 1, 1 );
|
|
|
|
var validArea = new Box2();
|
|
|
|
validArea.min.set( viewport.x, viewport.y );
|
|
validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );
|
|
|
|
if ( program === undefined ) {
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
gl.useProgram( program );
|
|
|
|
state.initAttributes();
|
|
state.enableAttribute( attributes.vertex );
|
|
state.enableAttribute( attributes.uv );
|
|
state.disableUnusedAttributes();
|
|
|
|
// loop through all lens flares to update their occlusion and positions
|
|
// setup gl and common used attribs/uniforms
|
|
|
|
gl.uniform1i( uniforms.occlusionMap, 0 );
|
|
gl.uniform1i( uniforms.map, 1 );
|
|
|
|
gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
|
|
gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );
|
|
gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );
|
|
|
|
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
|
|
state.disable( gl.CULL_FACE );
|
|
state.buffers.depth.setMask( false );
|
|
|
|
for ( var i = 0, l = flares.length; i < l; i ++ ) {
|
|
|
|
size = 16 / viewport.w;
|
|
scale.set( size * invAspect, size );
|
|
|
|
// calc object screen position
|
|
|
|
var flare = flares[ i ];
|
|
|
|
tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );
|
|
|
|
tempPosition.applyMatrix4( camera.matrixWorldInverse );
|
|
tempPosition.applyMatrix4( camera.projectionMatrix );
|
|
|
|
// setup arrays for gl programs
|
|
|
|
screenPosition.copy( tempPosition );
|
|
|
|
// horizontal and vertical coordinate of the lower left corner of the pixels to copy
|
|
|
|
screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;
|
|
screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;
|
|
|
|
// screen cull
|
|
|
|
if ( validArea.containsPoint( screenPositionPixels ) === true ) {
|
|
|
|
// save current RGB to temp texture
|
|
|
|
state.activeTexture( gl.TEXTURE0 );
|
|
state.bindTexture( gl.TEXTURE_2D, null );
|
|
state.activeTexture( gl.TEXTURE1 );
|
|
state.bindTexture( gl.TEXTURE_2D, tempTexture );
|
|
gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );
|
|
|
|
|
|
// render pink quad
|
|
|
|
gl.uniform1i( uniforms.renderType, 0 );
|
|
gl.uniform2f( uniforms.scale, scale.x, scale.y );
|
|
gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
|
|
|
|
state.disable( gl.BLEND );
|
|
state.enable( gl.DEPTH_TEST );
|
|
|
|
gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
|
|
// copy result to occlusionMap
|
|
|
|
state.activeTexture( gl.TEXTURE0 );
|
|
state.bindTexture( gl.TEXTURE_2D, occlusionTexture );
|
|
gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );
|
|
|
|
|
|
// restore graphics
|
|
|
|
gl.uniform1i( uniforms.renderType, 1 );
|
|
state.disable( gl.DEPTH_TEST );
|
|
|
|
state.activeTexture( gl.TEXTURE1 );
|
|
state.bindTexture( gl.TEXTURE_2D, tempTexture );
|
|
gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
|
|
// update object positions
|
|
|
|
flare.positionScreen.copy( screenPosition );
|
|
|
|
if ( flare.customUpdateCallback ) {
|
|
|
|
flare.customUpdateCallback( flare );
|
|
|
|
} else {
|
|
|
|
flare.updateLensFlares();
|
|
|
|
}
|
|
|
|
// render flares
|
|
|
|
gl.uniform1i( uniforms.renderType, 2 );
|
|
state.enable( gl.BLEND );
|
|
|
|
for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {
|
|
|
|
var sprite = flare.lensFlares[ j ];
|
|
|
|
if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {
|
|
|
|
screenPosition.x = sprite.x;
|
|
screenPosition.y = sprite.y;
|
|
screenPosition.z = sprite.z;
|
|
|
|
size = sprite.size * sprite.scale / viewport.w;
|
|
|
|
scale.x = size * invAspect;
|
|
scale.y = size;
|
|
|
|
gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );
|
|
gl.uniform2f( uniforms.scale, scale.x, scale.y );
|
|
gl.uniform1f( uniforms.rotation, sprite.rotation );
|
|
|
|
gl.uniform1f( uniforms.opacity, sprite.opacity );
|
|
gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );
|
|
|
|
state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );
|
|
renderer.setTexture2D( sprite.texture, 1 );
|
|
|
|
gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// restore gl
|
|
|
|
state.enable( gl.CULL_FACE );
|
|
state.enable( gl.DEPTH_TEST );
|
|
state.buffers.depth.setMask( true );
|
|
|
|
renderer.resetGLState();
|
|
|
|
};
|
|
|
|
function createProgram( shader ) {
|
|
|
|
var program = gl.createProgram();
|
|
|
|
var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
|
|
var vertexShader = gl.createShader( gl.VERTEX_SHADER );
|
|
|
|
var prefix = "precision " + renderer.getPrecision() + " float;\n";
|
|
|
|
gl.shaderSource( fragmentShader, prefix + shader.fragmentShader );
|
|
gl.shaderSource( vertexShader, prefix + shader.vertexShader );
|
|
|
|
gl.compileShader( fragmentShader );
|
|
gl.compileShader( vertexShader );
|
|
|
|
gl.attachShader( program, fragmentShader );
|
|
gl.attachShader( program, vertexShader );
|
|
|
|
gl.linkProgram( program );
|
|
|
|
return program;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function SpritePlugin( renderer, sprites ) {
|
|
|
|
var gl = renderer.context;
|
|
var state = renderer.state;
|
|
|
|
var vertexBuffer, elementBuffer;
|
|
var program, attributes, uniforms;
|
|
|
|
var texture;
|
|
|
|
// decompose matrixWorld
|
|
|
|
var spritePosition = new Vector3();
|
|
var spriteRotation = new Quaternion();
|
|
var spriteScale = new Vector3();
|
|
|
|
function init() {
|
|
|
|
var vertices = new Float32Array( [
|
|
- 0.5, - 0.5, 0, 0,
|
|
0.5, - 0.5, 1, 0,
|
|
0.5, 0.5, 1, 1,
|
|
- 0.5, 0.5, 0, 1
|
|
] );
|
|
|
|
var faces = new Uint16Array( [
|
|
0, 1, 2,
|
|
0, 2, 3
|
|
] );
|
|
|
|
vertexBuffer = gl.createBuffer();
|
|
elementBuffer = gl.createBuffer();
|
|
|
|
gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
|
|
gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );
|
|
|
|
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );
|
|
|
|
program = createProgram();
|
|
|
|
attributes = {
|
|
position: gl.getAttribLocation ( program, 'position' ),
|
|
uv: gl.getAttribLocation ( program, 'uv' )
|
|
};
|
|
|
|
uniforms = {
|
|
uvOffset: gl.getUniformLocation( program, 'uvOffset' ),
|
|
uvScale: gl.getUniformLocation( program, 'uvScale' ),
|
|
|
|
rotation: gl.getUniformLocation( program, 'rotation' ),
|
|
scale: gl.getUniformLocation( program, 'scale' ),
|
|
|
|
color: gl.getUniformLocation( program, 'color' ),
|
|
map: gl.getUniformLocation( program, 'map' ),
|
|
opacity: gl.getUniformLocation( program, 'opacity' ),
|
|
|
|
modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ),
|
|
projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ),
|
|
|
|
fogType: gl.getUniformLocation( program, 'fogType' ),
|
|
fogDensity: gl.getUniformLocation( program, 'fogDensity' ),
|
|
fogNear: gl.getUniformLocation( program, 'fogNear' ),
|
|
fogFar: gl.getUniformLocation( program, 'fogFar' ),
|
|
fogColor: gl.getUniformLocation( program, 'fogColor' ),
|
|
|
|
alphaTest: gl.getUniformLocation( program, 'alphaTest' )
|
|
};
|
|
|
|
var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
|
|
canvas.width = 8;
|
|
canvas.height = 8;
|
|
|
|
var context = canvas.getContext( '2d' );
|
|
context.fillStyle = 'white';
|
|
context.fillRect( 0, 0, 8, 8 );
|
|
|
|
texture = new Texture( canvas );
|
|
texture.needsUpdate = true;
|
|
|
|
}
|
|
|
|
this.render = function ( scene, camera ) {
|
|
|
|
if ( sprites.length === 0 ) return;
|
|
|
|
// setup gl
|
|
|
|
if ( program === undefined ) {
|
|
|
|
init();
|
|
|
|
}
|
|
|
|
gl.useProgram( program );
|
|
|
|
state.initAttributes();
|
|
state.enableAttribute( attributes.position );
|
|
state.enableAttribute( attributes.uv );
|
|
state.disableUnusedAttributes();
|
|
|
|
state.disable( gl.CULL_FACE );
|
|
state.enable( gl.BLEND );
|
|
|
|
gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
|
|
gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );
|
|
gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );
|
|
|
|
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
|
|
|
|
gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
|
|
|
|
state.activeTexture( gl.TEXTURE0 );
|
|
gl.uniform1i( uniforms.map, 0 );
|
|
|
|
var oldFogType = 0;
|
|
var sceneFogType = 0;
|
|
var fog = scene.fog;
|
|
|
|
if ( fog ) {
|
|
|
|
gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );
|
|
|
|
if ( fog.isFog ) {
|
|
|
|
gl.uniform1f( uniforms.fogNear, fog.near );
|
|
gl.uniform1f( uniforms.fogFar, fog.far );
|
|
|
|
gl.uniform1i( uniforms.fogType, 1 );
|
|
oldFogType = 1;
|
|
sceneFogType = 1;
|
|
|
|
} else if ( fog.isFogExp2 ) {
|
|
|
|
gl.uniform1f( uniforms.fogDensity, fog.density );
|
|
|
|
gl.uniform1i( uniforms.fogType, 2 );
|
|
oldFogType = 2;
|
|
sceneFogType = 2;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
gl.uniform1i( uniforms.fogType, 0 );
|
|
oldFogType = 0;
|
|
sceneFogType = 0;
|
|
|
|
}
|
|
|
|
|
|
// update positions and sort
|
|
|
|
for ( var i = 0, l = sprites.length; i < l; i ++ ) {
|
|
|
|
var sprite = sprites[ i ];
|
|
|
|
sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );
|
|
sprite.z = - sprite.modelViewMatrix.elements[ 14 ];
|
|
|
|
}
|
|
|
|
sprites.sort( painterSortStable );
|
|
|
|
// render all sprites
|
|
|
|
var scale = [];
|
|
|
|
for ( var i = 0, l = sprites.length; i < l; i ++ ) {
|
|
|
|
var sprite = sprites[ i ];
|
|
var material = sprite.material;
|
|
|
|
if ( material.visible === false ) continue;
|
|
|
|
gl.uniform1f( uniforms.alphaTest, material.alphaTest );
|
|
gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );
|
|
|
|
sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );
|
|
|
|
scale[ 0 ] = spriteScale.x;
|
|
scale[ 1 ] = spriteScale.y;
|
|
|
|
var fogType = 0;
|
|
|
|
if ( scene.fog && material.fog ) {
|
|
|
|
fogType = sceneFogType;
|
|
|
|
}
|
|
|
|
if ( oldFogType !== fogType ) {
|
|
|
|
gl.uniform1i( uniforms.fogType, fogType );
|
|
oldFogType = fogType;
|
|
|
|
}
|
|
|
|
if ( material.map !== null ) {
|
|
|
|
gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );
|
|
gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );
|
|
|
|
} else {
|
|
|
|
gl.uniform2f( uniforms.uvOffset, 0, 0 );
|
|
gl.uniform2f( uniforms.uvScale, 1, 1 );
|
|
|
|
}
|
|
|
|
gl.uniform1f( uniforms.opacity, material.opacity );
|
|
gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );
|
|
|
|
gl.uniform1f( uniforms.rotation, material.rotation );
|
|
gl.uniform2fv( uniforms.scale, scale );
|
|
|
|
state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );
|
|
state.buffers.depth.setTest( material.depthTest );
|
|
state.buffers.depth.setMask( material.depthWrite );
|
|
|
|
if ( material.map ) {
|
|
|
|
renderer.setTexture2D( material.map, 0 );
|
|
|
|
} else {
|
|
|
|
renderer.setTexture2D( texture, 0 );
|
|
|
|
}
|
|
|
|
gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
|
|
|
|
}
|
|
|
|
// restore gl
|
|
|
|
state.enable( gl.CULL_FACE );
|
|
|
|
renderer.resetGLState();
|
|
|
|
};
|
|
|
|
function createProgram() {
|
|
|
|
var program = gl.createProgram();
|
|
|
|
var vertexShader = gl.createShader( gl.VERTEX_SHADER );
|
|
var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
|
|
|
|
gl.shaderSource( vertexShader, [
|
|
|
|
'precision ' + renderer.getPrecision() + ' float;',
|
|
|
|
'uniform mat4 modelViewMatrix;',
|
|
'uniform mat4 projectionMatrix;',
|
|
'uniform float rotation;',
|
|
'uniform vec2 scale;',
|
|
'uniform vec2 uvOffset;',
|
|
'uniform vec2 uvScale;',
|
|
|
|
'attribute vec2 position;',
|
|
'attribute vec2 uv;',
|
|
|
|
'varying vec2 vUV;',
|
|
|
|
'void main() {',
|
|
|
|
'vUV = uvOffset + uv * uvScale;',
|
|
|
|
'vec2 alignedPosition = position * scale;',
|
|
|
|
'vec2 rotatedPosition;',
|
|
'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',
|
|
'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',
|
|
|
|
'vec4 finalPosition;',
|
|
|
|
'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',
|
|
'finalPosition.xy += rotatedPosition;',
|
|
'finalPosition = projectionMatrix * finalPosition;',
|
|
|
|
'gl_Position = finalPosition;',
|
|
|
|
'}'
|
|
|
|
].join( '\n' ) );
|
|
|
|
gl.shaderSource( fragmentShader, [
|
|
|
|
'precision ' + renderer.getPrecision() + ' float;',
|
|
|
|
'uniform vec3 color;',
|
|
'uniform sampler2D map;',
|
|
'uniform float opacity;',
|
|
|
|
'uniform int fogType;',
|
|
'uniform vec3 fogColor;',
|
|
'uniform float fogDensity;',
|
|
'uniform float fogNear;',
|
|
'uniform float fogFar;',
|
|
'uniform float alphaTest;',
|
|
|
|
'varying vec2 vUV;',
|
|
|
|
'void main() {',
|
|
|
|
'vec4 texture = texture2D( map, vUV );',
|
|
|
|
'if ( texture.a < alphaTest ) discard;',
|
|
|
|
'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',
|
|
|
|
'if ( fogType > 0 ) {',
|
|
|
|
'float depth = gl_FragCoord.z / gl_FragCoord.w;',
|
|
'float fogFactor = 0.0;',
|
|
|
|
'if ( fogType == 1 ) {',
|
|
|
|
'fogFactor = smoothstep( fogNear, fogFar, depth );',
|
|
|
|
'} else {',
|
|
|
|
'const float LOG2 = 1.442695;',
|
|
'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',
|
|
'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',
|
|
|
|
'}',
|
|
|
|
'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',
|
|
|
|
'}',
|
|
|
|
'}'
|
|
|
|
].join( '\n' ) );
|
|
|
|
gl.compileShader( vertexShader );
|
|
gl.compileShader( fragmentShader );
|
|
|
|
gl.attachShader( program, vertexShader );
|
|
gl.attachShader( program, fragmentShader );
|
|
|
|
gl.linkProgram( program );
|
|
|
|
return program;
|
|
|
|
}
|
|
|
|
function painterSortStable( a, b ) {
|
|
|
|
if ( a.renderOrder !== b.renderOrder ) {
|
|
|
|
return a.renderOrder - b.renderOrder;
|
|
|
|
} else if ( a.z !== b.z ) {
|
|
|
|
return b.z - a.z;
|
|
|
|
} else {
|
|
|
|
return b.id - a.id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
var materialId = 0;
|
|
|
|
function Material() {
|
|
|
|
Object.defineProperty( this, 'id', { value: materialId ++ } );
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.name = '';
|
|
this.type = 'Material';
|
|
|
|
this.fog = true;
|
|
this.lights = true;
|
|
|
|
this.blending = NormalBlending;
|
|
this.side = FrontSide;
|
|
this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading
|
|
this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors
|
|
|
|
this.opacity = 1;
|
|
this.transparent = false;
|
|
|
|
this.blendSrc = SrcAlphaFactor;
|
|
this.blendDst = OneMinusSrcAlphaFactor;
|
|
this.blendEquation = AddEquation;
|
|
this.blendSrcAlpha = null;
|
|
this.blendDstAlpha = null;
|
|
this.blendEquationAlpha = null;
|
|
|
|
this.depthFunc = LessEqualDepth;
|
|
this.depthTest = true;
|
|
this.depthWrite = true;
|
|
|
|
this.clippingPlanes = null;
|
|
this.clipIntersection = false;
|
|
this.clipShadows = false;
|
|
|
|
this.colorWrite = true;
|
|
|
|
this.precision = null; // override the renderer's default precision for this material
|
|
|
|
this.polygonOffset = false;
|
|
this.polygonOffsetFactor = 0;
|
|
this.polygonOffsetUnits = 0;
|
|
|
|
this.dithering = false;
|
|
|
|
this.alphaTest = 0;
|
|
this.premultipliedAlpha = false;
|
|
|
|
this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer
|
|
|
|
this.visible = true;
|
|
|
|
this.needsUpdate = true;
|
|
|
|
}
|
|
|
|
Object.assign( Material.prototype, EventDispatcher.prototype, {
|
|
|
|
isMaterial: true,
|
|
|
|
setValues: function ( values ) {
|
|
|
|
if ( values === undefined ) return;
|
|
|
|
for ( var key in values ) {
|
|
|
|
var newValue = values[ key ];
|
|
|
|
if ( newValue === undefined ) {
|
|
|
|
console.warn( "THREE.Material: '" + key + "' parameter is undefined." );
|
|
continue;
|
|
|
|
}
|
|
|
|
var currentValue = this[ key ];
|
|
|
|
if ( currentValue === undefined ) {
|
|
|
|
console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." );
|
|
continue;
|
|
|
|
}
|
|
|
|
if ( currentValue && currentValue.isColor ) {
|
|
|
|
currentValue.set( newValue );
|
|
|
|
} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {
|
|
|
|
currentValue.copy( newValue );
|
|
|
|
} else if ( key === 'overdraw' ) {
|
|
|
|
// ensure overdraw is backwards-compatible with legacy boolean type
|
|
this[ key ] = Number( newValue );
|
|
|
|
} else {
|
|
|
|
this[ key ] = newValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var isRoot = meta === undefined;
|
|
|
|
if ( isRoot ) {
|
|
|
|
meta = {
|
|
textures: {},
|
|
images: {}
|
|
};
|
|
|
|
}
|
|
|
|
var data = {
|
|
metadata: {
|
|
version: 4.5,
|
|
type: 'Material',
|
|
generator: 'Material.toJSON'
|
|
}
|
|
};
|
|
|
|
// standard Material serialization
|
|
data.uuid = this.uuid;
|
|
data.type = this.type;
|
|
|
|
if ( this.name !== '' ) data.name = this.name;
|
|
|
|
if ( this.color && this.color.isColor ) data.color = this.color.getHex();
|
|
|
|
if ( this.roughness !== undefined ) data.roughness = this.roughness;
|
|
if ( this.metalness !== undefined ) data.metalness = this.metalness;
|
|
|
|
if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();
|
|
if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();
|
|
if ( this.shininess !== undefined ) data.shininess = this.shininess;
|
|
if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;
|
|
if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;
|
|
|
|
if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;
|
|
if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;
|
|
if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;
|
|
if ( this.bumpMap && this.bumpMap.isTexture ) {
|
|
|
|
data.bumpMap = this.bumpMap.toJSON( meta ).uuid;
|
|
data.bumpScale = this.bumpScale;
|
|
|
|
}
|
|
if ( this.normalMap && this.normalMap.isTexture ) {
|
|
|
|
data.normalMap = this.normalMap.toJSON( meta ).uuid;
|
|
data.normalScale = this.normalScale.toArray();
|
|
|
|
}
|
|
if ( this.displacementMap && this.displacementMap.isTexture ) {
|
|
|
|
data.displacementMap = this.displacementMap.toJSON( meta ).uuid;
|
|
data.displacementScale = this.displacementScale;
|
|
data.displacementBias = this.displacementBias;
|
|
|
|
}
|
|
if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;
|
|
if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;
|
|
|
|
if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;
|
|
if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;
|
|
|
|
if ( this.envMap && this.envMap.isTexture ) {
|
|
|
|
data.envMap = this.envMap.toJSON( meta ).uuid;
|
|
data.reflectivity = this.reflectivity; // Scale behind envMap
|
|
|
|
}
|
|
|
|
if ( this.gradientMap && this.gradientMap.isTexture ) {
|
|
|
|
data.gradientMap = this.gradientMap.toJSON( meta ).uuid;
|
|
|
|
}
|
|
|
|
if ( this.size !== undefined ) data.size = this.size;
|
|
if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;
|
|
|
|
if ( this.blending !== NormalBlending ) data.blending = this.blending;
|
|
if ( this.shading !== SmoothShading ) data.shading = this.shading;
|
|
if ( this.side !== FrontSide ) data.side = this.side;
|
|
if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;
|
|
|
|
if ( this.opacity < 1 ) data.opacity = this.opacity;
|
|
if ( this.transparent === true ) data.transparent = this.transparent;
|
|
|
|
data.depthFunc = this.depthFunc;
|
|
data.depthTest = this.depthTest;
|
|
data.depthWrite = this.depthWrite;
|
|
|
|
if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;
|
|
if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;
|
|
if ( this.wireframe === true ) data.wireframe = this.wireframe;
|
|
if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;
|
|
if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;
|
|
if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;
|
|
|
|
data.skinning = this.skinning;
|
|
data.morphTargets = this.morphTargets;
|
|
|
|
data.dithering = this.dithering;
|
|
|
|
// TODO: Copied from Object3D.toJSON
|
|
|
|
function extractFromCache( cache ) {
|
|
|
|
var values = [];
|
|
|
|
for ( var key in cache ) {
|
|
|
|
var data = cache[ key ];
|
|
delete data.metadata;
|
|
values.push( data );
|
|
|
|
}
|
|
|
|
return values;
|
|
|
|
}
|
|
|
|
if ( isRoot ) {
|
|
|
|
var textures = extractFromCache( meta.textures );
|
|
var images = extractFromCache( meta.images );
|
|
|
|
if ( textures.length > 0 ) data.textures = textures;
|
|
if ( images.length > 0 ) data.images = images;
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.name = source.name;
|
|
|
|
this.fog = source.fog;
|
|
this.lights = source.lights;
|
|
|
|
this.blending = source.blending;
|
|
this.side = source.side;
|
|
this.shading = source.shading;
|
|
this.vertexColors = source.vertexColors;
|
|
|
|
this.opacity = source.opacity;
|
|
this.transparent = source.transparent;
|
|
|
|
this.blendSrc = source.blendSrc;
|
|
this.blendDst = source.blendDst;
|
|
this.blendEquation = source.blendEquation;
|
|
this.blendSrcAlpha = source.blendSrcAlpha;
|
|
this.blendDstAlpha = source.blendDstAlpha;
|
|
this.blendEquationAlpha = source.blendEquationAlpha;
|
|
|
|
this.depthFunc = source.depthFunc;
|
|
this.depthTest = source.depthTest;
|
|
this.depthWrite = source.depthWrite;
|
|
|
|
this.colorWrite = source.colorWrite;
|
|
|
|
this.precision = source.precision;
|
|
|
|
this.polygonOffset = source.polygonOffset;
|
|
this.polygonOffsetFactor = source.polygonOffsetFactor;
|
|
this.polygonOffsetUnits = source.polygonOffsetUnits;
|
|
|
|
this.dithering = source.dithering;
|
|
|
|
this.alphaTest = source.alphaTest;
|
|
|
|
this.premultipliedAlpha = source.premultipliedAlpha;
|
|
|
|
this.overdraw = source.overdraw;
|
|
|
|
this.visible = source.visible;
|
|
this.clipShadows = source.clipShadows;
|
|
this.clipIntersection = source.clipIntersection;
|
|
|
|
var srcPlanes = source.clippingPlanes,
|
|
dstPlanes = null;
|
|
|
|
if ( srcPlanes !== null ) {
|
|
|
|
var n = srcPlanes.length;
|
|
dstPlanes = new Array( n );
|
|
|
|
for ( var i = 0; i !== n; ++ i )
|
|
dstPlanes[ i ] = srcPlanes[ i ].clone();
|
|
|
|
}
|
|
|
|
this.clippingPlanes = dstPlanes;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dispose: function () {
|
|
|
|
this.dispatchEvent( { type: 'dispose' } );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* defines: { "label" : "value" },
|
|
* uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
|
|
*
|
|
* fragmentShader: <string>,
|
|
* vertexShader: <string>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>,
|
|
*
|
|
* lights: <bool>,
|
|
*
|
|
* skinning: <bool>,
|
|
* morphTargets: <bool>,
|
|
* morphNormals: <bool>
|
|
* }
|
|
*/
|
|
|
|
function ShaderMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'ShaderMaterial';
|
|
|
|
this.defines = {};
|
|
this.uniforms = {};
|
|
|
|
this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';
|
|
this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';
|
|
|
|
this.linewidth = 1;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
|
|
this.fog = false; // set to use scene fog
|
|
this.lights = false; // set to use scene lights
|
|
this.clipping = false; // set to use user-defined clipping planes
|
|
|
|
this.skinning = false; // set to use skinning attribute streams
|
|
this.morphTargets = false; // set to use morph targets
|
|
this.morphNormals = false; // set to use morph normals
|
|
|
|
this.extensions = {
|
|
derivatives: false, // set to use derivatives
|
|
fragDepth: false, // set to use fragment depth values
|
|
drawBuffers: false, // set to use draw buffers
|
|
shaderTextureLOD: false // set to use shader texture LOD
|
|
};
|
|
|
|
// When rendered geometry doesn't include these attributes but the material does,
|
|
// use these default values in WebGL. This avoids errors when buffer data is missing.
|
|
this.defaultAttributeValues = {
|
|
'color': [ 1, 1, 1 ],
|
|
'uv': [ 0, 0 ],
|
|
'uv2': [ 0, 0 ]
|
|
};
|
|
|
|
this.index0AttributeName = undefined;
|
|
|
|
if ( parameters !== undefined ) {
|
|
|
|
if ( parameters.attributes !== undefined ) {
|
|
|
|
console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );
|
|
|
|
}
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ShaderMaterial.prototype = Object.create( Material.prototype );
|
|
ShaderMaterial.prototype.constructor = ShaderMaterial;
|
|
|
|
ShaderMaterial.prototype.isShaderMaterial = true;
|
|
|
|
ShaderMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.fragmentShader = source.fragmentShader;
|
|
this.vertexShader = source.vertexShader;
|
|
|
|
this.uniforms = UniformsUtils.clone( source.uniforms );
|
|
|
|
this.defines = source.defines;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
|
|
this.lights = source.lights;
|
|
this.clipping = source.clipping;
|
|
|
|
this.skinning = source.skinning;
|
|
|
|
this.morphTargets = source.morphTargets;
|
|
this.morphNormals = source.morphNormals;
|
|
|
|
this.extensions = source.extensions;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
ShaderMaterial.prototype.toJSON = function ( meta ) {
|
|
|
|
var data = Material.prototype.toJSON.call( this, meta );
|
|
|
|
data.uniforms = this.uniforms;
|
|
data.vertexShader = this.vertexShader;
|
|
data.fragmentShader = this.fragmentShader;
|
|
|
|
return data;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author bhouston / https://clara.io
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*
|
|
* parameters = {
|
|
*
|
|
* opacity: <float>,
|
|
*
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* alphaMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* displacementMap: new THREE.Texture( <Image> ),
|
|
* displacementScale: <float>,
|
|
* displacementBias: <float>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>
|
|
* }
|
|
*/
|
|
|
|
function MeshDepthMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'MeshDepthMaterial';
|
|
|
|
this.depthPacking = BasicDepthPacking;
|
|
|
|
this.skinning = false;
|
|
this.morphTargets = false;
|
|
|
|
this.map = null;
|
|
|
|
this.alphaMap = null;
|
|
|
|
this.displacementMap = null;
|
|
this.displacementScale = 1;
|
|
this.displacementBias = 0;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
|
|
this.fog = false;
|
|
this.lights = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshDepthMaterial.prototype = Object.create( Material.prototype );
|
|
MeshDepthMaterial.prototype.constructor = MeshDepthMaterial;
|
|
|
|
MeshDepthMaterial.prototype.isMeshDepthMaterial = true;
|
|
|
|
MeshDepthMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.depthPacking = source.depthPacking;
|
|
|
|
this.skinning = source.skinning;
|
|
this.morphTargets = source.morphTargets;
|
|
|
|
this.map = source.map;
|
|
|
|
this.alphaMap = source.alphaMap;
|
|
|
|
this.displacementMap = source.displacementMap;
|
|
this.displacementScale = source.displacementScale;
|
|
this.displacementBias = source.displacementBias;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function Box3( min, max ) {
|
|
|
|
this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );
|
|
this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );
|
|
|
|
}
|
|
|
|
Object.assign( Box3.prototype, {
|
|
|
|
isBox3: true,
|
|
|
|
set: function ( min, max ) {
|
|
|
|
this.min.copy( min );
|
|
this.max.copy( max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromArray: function ( array ) {
|
|
|
|
var minX = + Infinity;
|
|
var minY = + Infinity;
|
|
var minZ = + Infinity;
|
|
|
|
var maxX = - Infinity;
|
|
var maxY = - Infinity;
|
|
var maxZ = - Infinity;
|
|
|
|
for ( var i = 0, l = array.length; i < l; i += 3 ) {
|
|
|
|
var x = array[ i ];
|
|
var y = array[ i + 1 ];
|
|
var z = array[ i + 2 ];
|
|
|
|
if ( x < minX ) minX = x;
|
|
if ( y < minY ) minY = y;
|
|
if ( z < minZ ) minZ = z;
|
|
|
|
if ( x > maxX ) maxX = x;
|
|
if ( y > maxY ) maxY = y;
|
|
if ( z > maxZ ) maxZ = z;
|
|
|
|
}
|
|
|
|
this.min.set( minX, minY, minZ );
|
|
this.max.set( maxX, maxY, maxZ );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromBufferAttribute: function ( attribute ) {
|
|
|
|
var minX = + Infinity;
|
|
var minY = + Infinity;
|
|
var minZ = + Infinity;
|
|
|
|
var maxX = - Infinity;
|
|
var maxY = - Infinity;
|
|
var maxZ = - Infinity;
|
|
|
|
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
|
|
|
|
var x = attribute.getX( i );
|
|
var y = attribute.getY( i );
|
|
var z = attribute.getZ( i );
|
|
|
|
if ( x < minX ) minX = x;
|
|
if ( y < minY ) minY = y;
|
|
if ( z < minZ ) minZ = z;
|
|
|
|
if ( x > maxX ) maxX = x;
|
|
if ( y > maxY ) maxY = y;
|
|
if ( z > maxZ ) maxZ = z;
|
|
|
|
}
|
|
|
|
this.min.set( minX, minY, minZ );
|
|
this.max.set( maxX, maxY, maxZ );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromPoints: function ( points ) {
|
|
|
|
this.makeEmpty();
|
|
|
|
for ( var i = 0, il = points.length; i < il; i ++ ) {
|
|
|
|
this.expandByPoint( points[ i ] );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromCenterAndSize: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function setFromCenterAndSize( center, size ) {
|
|
|
|
var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
|
|
|
|
this.min.copy( center ).sub( halfSize );
|
|
this.max.copy( center ).add( halfSize );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
setFromObject: function ( object ) {
|
|
|
|
this.makeEmpty();
|
|
|
|
return this.expandByObject( object );
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( box ) {
|
|
|
|
this.min.copy( box.min );
|
|
this.max.copy( box.max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
makeEmpty: function () {
|
|
|
|
this.min.x = this.min.y = this.min.z = + Infinity;
|
|
this.max.x = this.max.y = this.max.z = - Infinity;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
isEmpty: function () {
|
|
|
|
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
|
|
|
|
return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );
|
|
|
|
},
|
|
|
|
getCenter: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
|
|
|
|
},
|
|
|
|
getSize: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );
|
|
|
|
},
|
|
|
|
expandByPoint: function ( point ) {
|
|
|
|
this.min.min( point );
|
|
this.max.max( point );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
expandByVector: function ( vector ) {
|
|
|
|
this.min.sub( vector );
|
|
this.max.add( vector );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
expandByScalar: function ( scalar ) {
|
|
|
|
this.min.addScalar( - scalar );
|
|
this.max.addScalar( scalar );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
expandByObject: function () {
|
|
|
|
// Computes the world-axis-aligned bounding box of an object (including its children),
|
|
// accounting for both the object's, and children's, world transforms
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function expandByObject( object ) {
|
|
|
|
var scope = this;
|
|
|
|
object.updateMatrixWorld( true );
|
|
|
|
object.traverse( function ( node ) {
|
|
|
|
var i, l;
|
|
|
|
var geometry = node.geometry;
|
|
|
|
if ( geometry !== undefined ) {
|
|
|
|
if ( geometry.isGeometry ) {
|
|
|
|
var vertices = geometry.vertices;
|
|
|
|
for ( i = 0, l = vertices.length; i < l; i ++ ) {
|
|
|
|
v1.copy( vertices[ i ] );
|
|
v1.applyMatrix4( node.matrixWorld );
|
|
|
|
scope.expandByPoint( v1 );
|
|
|
|
}
|
|
|
|
} else if ( geometry.isBufferGeometry ) {
|
|
|
|
var attribute = geometry.attributes.position;
|
|
|
|
if ( attribute !== undefined ) {
|
|
|
|
for ( i = 0, l = attribute.count; i < l; i ++ ) {
|
|
|
|
v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );
|
|
|
|
scope.expandByPoint( v1 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
containsPoint: function ( point ) {
|
|
|
|
return point.x < this.min.x || point.x > this.max.x ||
|
|
point.y < this.min.y || point.y > this.max.y ||
|
|
point.z < this.min.z || point.z > this.max.z ? false : true;
|
|
|
|
},
|
|
|
|
containsBox: function ( box ) {
|
|
|
|
return this.min.x <= box.min.x && box.max.x <= this.max.x &&
|
|
this.min.y <= box.min.y && box.max.y <= this.max.y &&
|
|
this.min.z <= box.min.z && box.max.z <= this.max.z;
|
|
|
|
},
|
|
|
|
getParameter: function ( point, optionalTarget ) {
|
|
|
|
// This can potentially have a divide by zero if the box
|
|
// has a size dimension of 0.
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
return result.set(
|
|
( point.x - this.min.x ) / ( this.max.x - this.min.x ),
|
|
( point.y - this.min.y ) / ( this.max.y - this.min.y ),
|
|
( point.z - this.min.z ) / ( this.max.z - this.min.z )
|
|
);
|
|
|
|
},
|
|
|
|
intersectsBox: function ( box ) {
|
|
|
|
// using 6 splitting planes to rule out intersections.
|
|
return box.max.x < this.min.x || box.min.x > this.max.x ||
|
|
box.max.y < this.min.y || box.min.y > this.max.y ||
|
|
box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
|
|
|
|
},
|
|
|
|
intersectsSphere: ( function () {
|
|
|
|
var closestPoint = new Vector3();
|
|
|
|
return function intersectsSphere( sphere ) {
|
|
|
|
// Find the point on the AABB closest to the sphere center.
|
|
this.clampPoint( sphere.center, closestPoint );
|
|
|
|
// If that point is inside the sphere, the AABB and sphere intersect.
|
|
return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );
|
|
|
|
};
|
|
|
|
} )(),
|
|
|
|
intersectsPlane: function ( plane ) {
|
|
|
|
// We compute the minimum and maximum dot product values. If those values
|
|
// are on the same side (back or front) of the plane, then there is no intersection.
|
|
|
|
var min, max;
|
|
|
|
if ( plane.normal.x > 0 ) {
|
|
|
|
min = plane.normal.x * this.min.x;
|
|
max = plane.normal.x * this.max.x;
|
|
|
|
} else {
|
|
|
|
min = plane.normal.x * this.max.x;
|
|
max = plane.normal.x * this.min.x;
|
|
|
|
}
|
|
|
|
if ( plane.normal.y > 0 ) {
|
|
|
|
min += plane.normal.y * this.min.y;
|
|
max += plane.normal.y * this.max.y;
|
|
|
|
} else {
|
|
|
|
min += plane.normal.y * this.max.y;
|
|
max += plane.normal.y * this.min.y;
|
|
|
|
}
|
|
|
|
if ( plane.normal.z > 0 ) {
|
|
|
|
min += plane.normal.z * this.min.z;
|
|
max += plane.normal.z * this.max.z;
|
|
|
|
} else {
|
|
|
|
min += plane.normal.z * this.max.z;
|
|
max += plane.normal.z * this.min.z;
|
|
|
|
}
|
|
|
|
return ( min <= plane.constant && max >= plane.constant );
|
|
|
|
},
|
|
|
|
clampPoint: function ( point, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return result.copy( point ).clamp( this.min, this.max );
|
|
|
|
},
|
|
|
|
distanceToPoint: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function distanceToPoint( point ) {
|
|
|
|
var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
|
|
return clampedPoint.sub( point ).length();
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
getBoundingSphere: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function getBoundingSphere( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Sphere();
|
|
|
|
this.getCenter( result.center );
|
|
|
|
result.radius = this.getSize( v1 ).length() * 0.5;
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersect: function ( box ) {
|
|
|
|
this.min.max( box.min );
|
|
this.max.min( box.max );
|
|
|
|
// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
|
|
if( this.isEmpty() ) this.makeEmpty();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
union: function ( box ) {
|
|
|
|
this.min.min( box.min );
|
|
this.max.max( box.max );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
applyMatrix4: function () {
|
|
|
|
var points = [
|
|
new Vector3(),
|
|
new Vector3(),
|
|
new Vector3(),
|
|
new Vector3(),
|
|
new Vector3(),
|
|
new Vector3(),
|
|
new Vector3(),
|
|
new Vector3()
|
|
];
|
|
|
|
return function applyMatrix4( matrix ) {
|
|
|
|
// transform of empty box is an empty box.
|
|
if( this.isEmpty() ) return this;
|
|
|
|
// NOTE: I am using a binary pattern to specify all 2^3 combinations below
|
|
points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000
|
|
points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001
|
|
points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010
|
|
points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011
|
|
points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100
|
|
points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101
|
|
points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110
|
|
points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111
|
|
|
|
this.setFromPoints( points );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translate: function ( offset ) {
|
|
|
|
this.min.add( offset );
|
|
this.max.add( offset );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( box ) {
|
|
|
|
return box.min.equals( this.min ) && box.max.equals( this.max );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Sphere( center, radius ) {
|
|
|
|
this.center = ( center !== undefined ) ? center : new Vector3();
|
|
this.radius = ( radius !== undefined ) ? radius : 0;
|
|
|
|
}
|
|
|
|
Object.assign( Sphere.prototype, {
|
|
|
|
set: function ( center, radius ) {
|
|
|
|
this.center.copy( center );
|
|
this.radius = radius;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromPoints: function () {
|
|
|
|
var box = new Box3();
|
|
|
|
return function setFromPoints( points, optionalCenter ) {
|
|
|
|
var center = this.center;
|
|
|
|
if ( optionalCenter !== undefined ) {
|
|
|
|
center.copy( optionalCenter );
|
|
|
|
} else {
|
|
|
|
box.setFromPoints( points ).getCenter( center );
|
|
|
|
}
|
|
|
|
var maxRadiusSq = 0;
|
|
|
|
for ( var i = 0, il = points.length; i < il; i ++ ) {
|
|
|
|
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );
|
|
|
|
}
|
|
|
|
this.radius = Math.sqrt( maxRadiusSq );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( sphere ) {
|
|
|
|
this.center.copy( sphere.center );
|
|
this.radius = sphere.radius;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
empty: function () {
|
|
|
|
return ( this.radius <= 0 );
|
|
|
|
},
|
|
|
|
containsPoint: function ( point ) {
|
|
|
|
return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );
|
|
|
|
},
|
|
|
|
distanceToPoint: function ( point ) {
|
|
|
|
return ( point.distanceTo( this.center ) - this.radius );
|
|
|
|
},
|
|
|
|
intersectsSphere: function ( sphere ) {
|
|
|
|
var radiusSum = this.radius + sphere.radius;
|
|
|
|
return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );
|
|
|
|
},
|
|
|
|
intersectsBox: function ( box ) {
|
|
|
|
return box.intersectsSphere( this );
|
|
|
|
},
|
|
|
|
intersectsPlane: function ( plane ) {
|
|
|
|
// We use the following equation to compute the signed distance from
|
|
// the center of the sphere to the plane.
|
|
//
|
|
// distance = q * n - d
|
|
//
|
|
// If this distance is greater than the radius of the sphere,
|
|
// then there is no intersection.
|
|
|
|
return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;
|
|
|
|
},
|
|
|
|
clampPoint: function ( point, optionalTarget ) {
|
|
|
|
var deltaLengthSq = this.center.distanceToSquared( point );
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
result.copy( point );
|
|
|
|
if ( deltaLengthSq > ( this.radius * this.radius ) ) {
|
|
|
|
result.sub( this.center ).normalize();
|
|
result.multiplyScalar( this.radius ).add( this.center );
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
getBoundingBox: function ( optionalTarget ) {
|
|
|
|
var box = optionalTarget || new Box3();
|
|
|
|
box.set( this.center, this.center );
|
|
box.expandByScalar( this.radius );
|
|
|
|
return box;
|
|
|
|
},
|
|
|
|
applyMatrix4: function ( matrix ) {
|
|
|
|
this.center.applyMatrix4( matrix );
|
|
this.radius = this.radius * matrix.getMaxScaleOnAxis();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
translate: function ( offset ) {
|
|
|
|
this.center.add( offset );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( sphere ) {
|
|
|
|
return sphere.center.equals( this.center ) && ( sphere.radius === this.radius );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author bhouston / http://clara.io
|
|
* @author tschw
|
|
*/
|
|
|
|
function Matrix3() {
|
|
|
|
this.elements = [
|
|
|
|
1, 0, 0,
|
|
0, 1, 0,
|
|
0, 0, 1
|
|
|
|
];
|
|
|
|
if ( arguments.length > 0 ) {
|
|
|
|
console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Object.assign( Matrix3.prototype, {
|
|
|
|
isMatrix3: true,
|
|
|
|
set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
|
|
|
|
var te = this.elements;
|
|
|
|
te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;
|
|
te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;
|
|
te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
identity: function () {
|
|
|
|
this.set(
|
|
|
|
1, 0, 0,
|
|
0, 1, 0,
|
|
0, 0, 1
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().fromArray( this.elements );
|
|
|
|
},
|
|
|
|
copy: function ( m ) {
|
|
|
|
var te = this.elements;
|
|
var me = m.elements;
|
|
|
|
te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];
|
|
te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];
|
|
te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromMatrix4: function ( m ) {
|
|
|
|
var me = m.elements;
|
|
|
|
this.set(
|
|
|
|
me[ 0 ], me[ 4 ], me[ 8 ],
|
|
me[ 1 ], me[ 5 ], me[ 9 ],
|
|
me[ 2 ], me[ 6 ], me[ 10 ]
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
applyToBufferAttribute: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function applyToBufferAttribute( attribute ) {
|
|
|
|
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
|
|
|
|
v1.x = attribute.getX( i );
|
|
v1.y = attribute.getY( i );
|
|
v1.z = attribute.getZ( i );
|
|
|
|
v1.applyMatrix3( this );
|
|
|
|
attribute.setXYZ( i, v1.x, v1.y, v1.z );
|
|
|
|
}
|
|
|
|
return attribute;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
multiply: function ( m ) {
|
|
|
|
return this.multiplyMatrices( this, m );
|
|
|
|
},
|
|
|
|
premultiply: function ( m ) {
|
|
|
|
return this.multiplyMatrices( m, this );
|
|
|
|
},
|
|
|
|
multiplyMatrices: function ( a, b ) {
|
|
|
|
var ae = a.elements;
|
|
var be = b.elements;
|
|
var te = this.elements;
|
|
|
|
var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];
|
|
var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];
|
|
var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];
|
|
|
|
var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];
|
|
var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];
|
|
var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];
|
|
|
|
te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;
|
|
te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;
|
|
te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;
|
|
|
|
te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;
|
|
te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;
|
|
te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;
|
|
|
|
te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;
|
|
te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;
|
|
te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
multiplyScalar: function ( s ) {
|
|
|
|
var te = this.elements;
|
|
|
|
te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;
|
|
te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;
|
|
te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
determinant: function () {
|
|
|
|
var te = this.elements;
|
|
|
|
var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],
|
|
d = te[ 3 ], e = te[ 4 ], f = te[ 5 ],
|
|
g = te[ 6 ], h = te[ 7 ], i = te[ 8 ];
|
|
|
|
return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
|
|
|
|
},
|
|
|
|
getInverse: function ( matrix, throwOnDegenerate ) {
|
|
|
|
if ( matrix && matrix.isMatrix4 ) {
|
|
|
|
console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." );
|
|
|
|
}
|
|
|
|
var me = matrix.elements,
|
|
te = this.elements,
|
|
|
|
n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],
|
|
n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],
|
|
n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],
|
|
|
|
t11 = n33 * n22 - n32 * n23,
|
|
t12 = n32 * n13 - n33 * n12,
|
|
t13 = n23 * n12 - n22 * n13,
|
|
|
|
det = n11 * t11 + n21 * t12 + n31 * t13;
|
|
|
|
if ( det === 0 ) {
|
|
|
|
var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0";
|
|
|
|
if ( throwOnDegenerate === true ) {
|
|
|
|
throw new Error( msg );
|
|
|
|
} else {
|
|
|
|
console.warn( msg );
|
|
|
|
}
|
|
|
|
return this.identity();
|
|
|
|
}
|
|
|
|
var detInv = 1 / det;
|
|
|
|
te[ 0 ] = t11 * detInv;
|
|
te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;
|
|
te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;
|
|
|
|
te[ 3 ] = t12 * detInv;
|
|
te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;
|
|
te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;
|
|
|
|
te[ 6 ] = t13 * detInv;
|
|
te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;
|
|
te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
transpose: function () {
|
|
|
|
var tmp, m = this.elements;
|
|
|
|
tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;
|
|
tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;
|
|
tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getNormalMatrix: function ( matrix4 ) {
|
|
|
|
return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();
|
|
|
|
},
|
|
|
|
transposeIntoArray: function ( r ) {
|
|
|
|
var m = this.elements;
|
|
|
|
r[ 0 ] = m[ 0 ];
|
|
r[ 1 ] = m[ 3 ];
|
|
r[ 2 ] = m[ 6 ];
|
|
r[ 3 ] = m[ 1 ];
|
|
r[ 4 ] = m[ 4 ];
|
|
r[ 5 ] = m[ 7 ];
|
|
r[ 6 ] = m[ 2 ];
|
|
r[ 7 ] = m[ 5 ];
|
|
r[ 8 ] = m[ 8 ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( matrix ) {
|
|
|
|
var te = this.elements;
|
|
var me = matrix.elements;
|
|
|
|
for ( var i = 0; i < 9; i ++ ) {
|
|
|
|
if ( te[ i ] !== me[ i ] ) return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
fromArray: function ( array, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
for ( var i = 0; i < 9; i ++ ) {
|
|
|
|
this.elements[ i ] = array[ i + offset ];
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
var te = this.elements;
|
|
|
|
array[ offset ] = te[ 0 ];
|
|
array[ offset + 1 ] = te[ 1 ];
|
|
array[ offset + 2 ] = te[ 2 ];
|
|
|
|
array[ offset + 3 ] = te[ 3 ];
|
|
array[ offset + 4 ] = te[ 4 ];
|
|
array[ offset + 5 ] = te[ 5 ];
|
|
|
|
array[ offset + 6 ] = te[ 6 ];
|
|
array[ offset + 7 ] = te[ 7 ];
|
|
array[ offset + 8 ] = te[ 8 ];
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Plane( normal, constant ) {
|
|
|
|
this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );
|
|
this.constant = ( constant !== undefined ) ? constant : 0;
|
|
|
|
}
|
|
|
|
Object.assign( Plane.prototype, {
|
|
|
|
set: function ( normal, constant ) {
|
|
|
|
this.normal.copy( normal );
|
|
this.constant = constant;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setComponents: function ( x, y, z, w ) {
|
|
|
|
this.normal.set( x, y, z );
|
|
this.constant = w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromNormalAndCoplanarPoint: function ( normal, point ) {
|
|
|
|
this.normal.copy( normal );
|
|
this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromCoplanarPoints: function () {
|
|
|
|
var v1 = new Vector3();
|
|
var v2 = new Vector3();
|
|
|
|
return function setFromCoplanarPoints( a, b, c ) {
|
|
|
|
var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();
|
|
|
|
// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
|
|
|
|
this.setFromNormalAndCoplanarPoint( normal, a );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( plane ) {
|
|
|
|
this.normal.copy( plane.normal );
|
|
this.constant = plane.constant;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
normalize: function () {
|
|
|
|
// Note: will lead to a divide by zero if the plane is invalid.
|
|
|
|
var inverseNormalLength = 1.0 / this.normal.length();
|
|
this.normal.multiplyScalar( inverseNormalLength );
|
|
this.constant *= inverseNormalLength;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
negate: function () {
|
|
|
|
this.constant *= - 1;
|
|
this.normal.negate();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
distanceToPoint: function ( point ) {
|
|
|
|
return this.normal.dot( point ) + this.constant;
|
|
|
|
},
|
|
|
|
distanceToSphere: function ( sphere ) {
|
|
|
|
return this.distanceToPoint( sphere.center ) - sphere.radius;
|
|
|
|
},
|
|
|
|
projectPoint: function ( point, optionalTarget ) {
|
|
|
|
return this.orthoPoint( point, optionalTarget ).sub( point ).negate();
|
|
|
|
},
|
|
|
|
orthoPoint: function ( point, optionalTarget ) {
|
|
|
|
var perpendicularMagnitude = this.distanceToPoint( point );
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );
|
|
|
|
},
|
|
|
|
intersectLine: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function intersectLine( line, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
var direction = line.delta( v1 );
|
|
|
|
var denominator = this.normal.dot( direction );
|
|
|
|
if ( denominator === 0 ) {
|
|
|
|
// line is coplanar, return origin
|
|
if ( this.distanceToPoint( line.start ) === 0 ) {
|
|
|
|
return result.copy( line.start );
|
|
|
|
}
|
|
|
|
// Unsure if this is the correct method to handle this case.
|
|
return undefined;
|
|
|
|
}
|
|
|
|
var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;
|
|
|
|
if ( t < 0 || t > 1 ) {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
return result.copy( direction ).multiplyScalar( t ).add( line.start );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersectsLine: function ( line ) {
|
|
|
|
// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
|
|
|
|
var startSign = this.distanceToPoint( line.start );
|
|
var endSign = this.distanceToPoint( line.end );
|
|
|
|
return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );
|
|
|
|
},
|
|
|
|
intersectsBox: function ( box ) {
|
|
|
|
return box.intersectsPlane( this );
|
|
|
|
},
|
|
|
|
intersectsSphere: function ( sphere ) {
|
|
|
|
return sphere.intersectsPlane( this );
|
|
|
|
},
|
|
|
|
coplanarPoint: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return result.copy( this.normal ).multiplyScalar( - this.constant );
|
|
|
|
},
|
|
|
|
applyMatrix4: function () {
|
|
|
|
var v1 = new Vector3();
|
|
var m1 = new Matrix3();
|
|
|
|
return function applyMatrix4( matrix, optionalNormalMatrix ) {
|
|
|
|
var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );
|
|
|
|
// transform normal based on theory here:
|
|
// http://www.songho.ca/opengl/gl_normaltransform.html
|
|
var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );
|
|
var normal = this.normal.applyMatrix3( normalMatrix ).normalize();
|
|
|
|
// recalculate constant (like in setFromNormalAndCoplanarPoint)
|
|
this.constant = - referencePoint.dot( normal );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translate: function ( offset ) {
|
|
|
|
this.constant = this.constant - offset.dot( this.normal );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( plane ) {
|
|
|
|
return plane.normal.equals( this.normal ) && ( plane.constant === this.constant );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Frustum( p0, p1, p2, p3, p4, p5 ) {
|
|
|
|
this.planes = [
|
|
|
|
( p0 !== undefined ) ? p0 : new Plane(),
|
|
( p1 !== undefined ) ? p1 : new Plane(),
|
|
( p2 !== undefined ) ? p2 : new Plane(),
|
|
( p3 !== undefined ) ? p3 : new Plane(),
|
|
( p4 !== undefined ) ? p4 : new Plane(),
|
|
( p5 !== undefined ) ? p5 : new Plane()
|
|
|
|
];
|
|
|
|
}
|
|
|
|
Object.assign( Frustum.prototype, {
|
|
|
|
set: function ( p0, p1, p2, p3, p4, p5 ) {
|
|
|
|
var planes = this.planes;
|
|
|
|
planes[ 0 ].copy( p0 );
|
|
planes[ 1 ].copy( p1 );
|
|
planes[ 2 ].copy( p2 );
|
|
planes[ 3 ].copy( p3 );
|
|
planes[ 4 ].copy( p4 );
|
|
planes[ 5 ].copy( p5 );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( frustum ) {
|
|
|
|
var planes = this.planes;
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
planes[ i ].copy( frustum.planes[ i ] );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromMatrix: function ( m ) {
|
|
|
|
var planes = this.planes;
|
|
var me = m.elements;
|
|
var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
|
|
var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
|
|
var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
|
|
var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
|
|
|
|
planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
|
|
planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
|
|
planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
|
|
planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
|
|
planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
|
|
planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
intersectsObject: function () {
|
|
|
|
var sphere = new Sphere();
|
|
|
|
return function intersectsObject( object ) {
|
|
|
|
var geometry = object.geometry;
|
|
|
|
if ( geometry.boundingSphere === null )
|
|
geometry.computeBoundingSphere();
|
|
|
|
sphere.copy( geometry.boundingSphere )
|
|
.applyMatrix4( object.matrixWorld );
|
|
|
|
return this.intersectsSphere( sphere );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersectsSprite: function () {
|
|
|
|
var sphere = new Sphere();
|
|
|
|
return function intersectsSprite( sprite ) {
|
|
|
|
sphere.center.set( 0, 0, 0 );
|
|
sphere.radius = 0.7071067811865476;
|
|
sphere.applyMatrix4( sprite.matrixWorld );
|
|
|
|
return this.intersectsSphere( sphere );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersectsSphere: function ( sphere ) {
|
|
|
|
var planes = this.planes;
|
|
var center = sphere.center;
|
|
var negRadius = - sphere.radius;
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
var distance = planes[ i ].distanceToPoint( center );
|
|
|
|
if ( distance < negRadius ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
intersectsBox: function () {
|
|
|
|
var p1 = new Vector3(),
|
|
p2 = new Vector3();
|
|
|
|
return function intersectsBox( box ) {
|
|
|
|
var planes = this.planes;
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
var plane = planes[ i ];
|
|
|
|
p1.x = plane.normal.x > 0 ? box.min.x : box.max.x;
|
|
p2.x = plane.normal.x > 0 ? box.max.x : box.min.x;
|
|
p1.y = plane.normal.y > 0 ? box.min.y : box.max.y;
|
|
p2.y = plane.normal.y > 0 ? box.max.y : box.min.y;
|
|
p1.z = plane.normal.z > 0 ? box.min.z : box.max.z;
|
|
p2.z = plane.normal.z > 0 ? box.max.z : box.min.z;
|
|
|
|
var d1 = plane.distanceToPoint( p1 );
|
|
var d2 = plane.distanceToPoint( p2 );
|
|
|
|
// if both outside plane, no intersection
|
|
|
|
if ( d1 < 0 && d2 < 0 ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
containsPoint: function ( point ) {
|
|
|
|
var planes = this.planes;
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
if ( planes[ i ].distanceToPoint( point ) < 0 ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {
|
|
|
|
var _gl = _renderer.context,
|
|
_state = _renderer.state,
|
|
_frustum = new Frustum(),
|
|
_projScreenMatrix = new Matrix4(),
|
|
|
|
_lightShadows = _lights.shadows,
|
|
|
|
_shadowMapSize = new Vector2(),
|
|
_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),
|
|
|
|
_lookTarget = new Vector3(),
|
|
_lightPositionWorld = new Vector3(),
|
|
|
|
_MorphingFlag = 1,
|
|
_SkinningFlag = 2,
|
|
|
|
_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,
|
|
|
|
_depthMaterials = new Array( _NumberOfMaterialVariants ),
|
|
_distanceMaterials = new Array( _NumberOfMaterialVariants ),
|
|
|
|
_materialCache = {};
|
|
|
|
var cubeDirections = [
|
|
new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
|
|
new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
|
|
];
|
|
|
|
var cubeUps = [
|
|
new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
|
|
new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
|
|
];
|
|
|
|
var cube2DViewPorts = [
|
|
new Vector4(), new Vector4(), new Vector4(),
|
|
new Vector4(), new Vector4(), new Vector4()
|
|
];
|
|
|
|
// init
|
|
|
|
var depthMaterialTemplate = new MeshDepthMaterial();
|
|
depthMaterialTemplate.depthPacking = RGBADepthPacking;
|
|
depthMaterialTemplate.clipping = true;
|
|
|
|
var distanceShader = ShaderLib[ "distanceRGBA" ];
|
|
var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );
|
|
|
|
for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {
|
|
|
|
var useMorphing = ( i & _MorphingFlag ) !== 0;
|
|
var useSkinning = ( i & _SkinningFlag ) !== 0;
|
|
|
|
var depthMaterial = depthMaterialTemplate.clone();
|
|
depthMaterial.morphTargets = useMorphing;
|
|
depthMaterial.skinning = useSkinning;
|
|
|
|
_depthMaterials[ i ] = depthMaterial;
|
|
|
|
var distanceMaterial = new ShaderMaterial( {
|
|
defines: {
|
|
'USE_SHADOWMAP': ''
|
|
},
|
|
uniforms: distanceUniforms,
|
|
vertexShader: distanceShader.vertexShader,
|
|
fragmentShader: distanceShader.fragmentShader,
|
|
morphTargets: useMorphing,
|
|
skinning: useSkinning,
|
|
clipping: true
|
|
} );
|
|
|
|
_distanceMaterials[ i ] = distanceMaterial;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var scope = this;
|
|
|
|
this.enabled = false;
|
|
|
|
this.autoUpdate = true;
|
|
this.needsUpdate = false;
|
|
|
|
this.type = PCFShadowMap;
|
|
|
|
this.renderReverseSided = true;
|
|
this.renderSingleSided = true;
|
|
|
|
this.render = function ( scene, camera ) {
|
|
|
|
if ( scope.enabled === false ) return;
|
|
if ( scope.autoUpdate === false && scope.needsUpdate === false ) return;
|
|
|
|
if ( _lightShadows.length === 0 ) return;
|
|
|
|
// Set GL state for depth map.
|
|
_state.disable( _gl.BLEND );
|
|
_state.buffers.color.setClear( 1, 1, 1, 1 );
|
|
_state.buffers.depth.setTest( true );
|
|
_state.setScissorTest( false );
|
|
|
|
// render depth map
|
|
|
|
var faceCount, isPointLight;
|
|
|
|
for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {
|
|
|
|
var light = _lightShadows[ i ];
|
|
var shadow = light.shadow;
|
|
|
|
if ( shadow === undefined ) {
|
|
|
|
console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );
|
|
continue;
|
|
|
|
}
|
|
|
|
var shadowCamera = shadow.camera;
|
|
var shadowMatrix = shadow.matrix;
|
|
|
|
_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
|
|
shadowCamera.position.copy( _lightPositionWorld );
|
|
|
|
_shadowMapSize.copy( shadow.mapSize );
|
|
_shadowMapSize.min( _maxShadowMapSize );
|
|
|
|
if ( light && light.isPointLight ) {
|
|
|
|
faceCount = 6;
|
|
isPointLight = true;
|
|
|
|
var vpWidth = _shadowMapSize.x;
|
|
var vpHeight = _shadowMapSize.y;
|
|
|
|
// These viewports map a cube-map onto a 2D texture with the
|
|
// following orientation:
|
|
//
|
|
// xzXZ
|
|
// y Y
|
|
//
|
|
// X - Positive x direction
|
|
// x - Negative x direction
|
|
// Y - Positive y direction
|
|
// y - Negative y direction
|
|
// Z - Positive z direction
|
|
// z - Negative z direction
|
|
|
|
// positive X
|
|
cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );
|
|
// negative X
|
|
cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );
|
|
// positive Z
|
|
cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );
|
|
// negative Z
|
|
cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );
|
|
// positive Y
|
|
cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );
|
|
// negative Y
|
|
cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );
|
|
|
|
_shadowMapSize.x *= 4.0;
|
|
_shadowMapSize.y *= 2.0;
|
|
|
|
|
|
// for point lights we set the shadow matrix to be a translation-only matrix
|
|
// equal to inverse of the light's position
|
|
|
|
shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
|
|
|
|
} else {
|
|
|
|
faceCount = 1;
|
|
isPointLight = false;
|
|
|
|
_lookTarget.setFromMatrixPosition( light.target.matrixWorld );
|
|
shadowCamera.lookAt( _lookTarget );
|
|
shadowCamera.updateMatrixWorld();
|
|
shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );
|
|
|
|
// compute shadow matrix
|
|
|
|
shadowMatrix.set(
|
|
0.5, 0.0, 0.0, 0.5,
|
|
0.0, 0.5, 0.0, 0.5,
|
|
0.0, 0.0, 0.5, 0.5,
|
|
0.0, 0.0, 0.0, 1.0
|
|
);
|
|
|
|
shadowMatrix.multiply( shadowCamera.projectionMatrix );
|
|
shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
|
|
|
|
}
|
|
|
|
if ( shadow.map === null ) {
|
|
|
|
var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };
|
|
|
|
shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );
|
|
shadow.map.texture.name = light.name + ".shadowMap";
|
|
|
|
shadowCamera.updateProjectionMatrix();
|
|
|
|
}
|
|
|
|
if ( shadow.isSpotLightShadow ) {
|
|
|
|
shadow.update( light );
|
|
|
|
}
|
|
|
|
var shadowMap = shadow.map;
|
|
|
|
_renderer.setRenderTarget( shadowMap );
|
|
_renderer.clear();
|
|
|
|
// render shadow map for each cube face (if omni-directional) or
|
|
// run a single pass if not
|
|
|
|
for ( var face = 0; face < faceCount; face ++ ) {
|
|
|
|
if ( isPointLight ) {
|
|
|
|
_lookTarget.copy( shadowCamera.position );
|
|
_lookTarget.add( cubeDirections[ face ] );
|
|
shadowCamera.up.copy( cubeUps[ face ] );
|
|
shadowCamera.lookAt( _lookTarget );
|
|
shadowCamera.updateMatrixWorld();
|
|
shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );
|
|
|
|
var vpDimensions = cube2DViewPorts[ face ];
|
|
_state.viewport( vpDimensions );
|
|
|
|
}
|
|
|
|
// update camera matrices and frustum
|
|
|
|
_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
|
|
_frustum.setFromMatrix( _projScreenMatrix );
|
|
|
|
// set object matrices & frustum culling
|
|
|
|
renderObject( scene, camera, shadowCamera, isPointLight );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Restore GL state.
|
|
var clearColor = _renderer.getClearColor();
|
|
var clearAlpha = _renderer.getClearAlpha();
|
|
_renderer.setClearColor( clearColor, clearAlpha );
|
|
|
|
scope.needsUpdate = false;
|
|
|
|
};
|
|
|
|
function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {
|
|
|
|
var geometry = object.geometry;
|
|
|
|
var result = null;
|
|
|
|
var materialVariants = _depthMaterials;
|
|
var customMaterial = object.customDepthMaterial;
|
|
|
|
if ( isPointLight ) {
|
|
|
|
materialVariants = _distanceMaterials;
|
|
customMaterial = object.customDistanceMaterial;
|
|
|
|
}
|
|
|
|
if ( ! customMaterial ) {
|
|
|
|
var useMorphing = false;
|
|
|
|
if ( material.morphTargets ) {
|
|
|
|
if ( geometry && geometry.isBufferGeometry ) {
|
|
|
|
useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;
|
|
|
|
} else if ( geometry && geometry.isGeometry ) {
|
|
|
|
useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( object.isSkinnedMesh && material.skinning === false ) {
|
|
|
|
console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );
|
|
|
|
}
|
|
|
|
var useSkinning = object.isSkinnedMesh && material.skinning;
|
|
|
|
var variantIndex = 0;
|
|
|
|
if ( useMorphing ) variantIndex |= _MorphingFlag;
|
|
if ( useSkinning ) variantIndex |= _SkinningFlag;
|
|
|
|
result = materialVariants[ variantIndex ];
|
|
|
|
} else {
|
|
|
|
result = customMaterial;
|
|
|
|
}
|
|
|
|
if ( _renderer.localClippingEnabled &&
|
|
material.clipShadows === true &&
|
|
material.clippingPlanes.length !== 0 ) {
|
|
|
|
// in this case we need a unique material instance reflecting the
|
|
// appropriate state
|
|
|
|
var keyA = result.uuid, keyB = material.uuid;
|
|
|
|
var materialsForVariant = _materialCache[ keyA ];
|
|
|
|
if ( materialsForVariant === undefined ) {
|
|
|
|
materialsForVariant = {};
|
|
_materialCache[ keyA ] = materialsForVariant;
|
|
|
|
}
|
|
|
|
var cachedMaterial = materialsForVariant[ keyB ];
|
|
|
|
if ( cachedMaterial === undefined ) {
|
|
|
|
cachedMaterial = result.clone();
|
|
materialsForVariant[ keyB ] = cachedMaterial;
|
|
|
|
}
|
|
|
|
result = cachedMaterial;
|
|
|
|
}
|
|
|
|
result.visible = material.visible;
|
|
result.wireframe = material.wireframe;
|
|
|
|
var side = material.side;
|
|
|
|
if ( scope.renderSingleSided && side == DoubleSide ) {
|
|
|
|
side = FrontSide;
|
|
|
|
}
|
|
|
|
if ( scope.renderReverseSided ) {
|
|
|
|
if ( side === FrontSide ) side = BackSide;
|
|
else if ( side === BackSide ) side = FrontSide;
|
|
|
|
}
|
|
|
|
result.side = side;
|
|
|
|
result.clipShadows = material.clipShadows;
|
|
result.clippingPlanes = material.clippingPlanes;
|
|
|
|
result.wireframeLinewidth = material.wireframeLinewidth;
|
|
result.linewidth = material.linewidth;
|
|
|
|
if ( isPointLight && result.uniforms.lightPos !== undefined ) {
|
|
|
|
result.uniforms.lightPos.value.copy( lightPositionWorld );
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
function renderObject( object, camera, shadowCamera, isPointLight ) {
|
|
|
|
if ( object.visible === false ) return;
|
|
|
|
var visible = object.layers.test( camera.layers );
|
|
|
|
if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {
|
|
|
|
if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {
|
|
|
|
object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
|
|
|
|
var geometry = _objects.update( object );
|
|
var material = object.material;
|
|
|
|
if ( Array.isArray( material ) ) {
|
|
|
|
var groups = geometry.groups;
|
|
|
|
for ( var k = 0, kl = groups.length; k < kl; k ++ ) {
|
|
|
|
var group = groups[ k ];
|
|
var groupMaterial = material[ group.materialIndex ];
|
|
|
|
if ( groupMaterial && groupMaterial.visible ) {
|
|
|
|
var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );
|
|
_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ( material.visible ) {
|
|
|
|
var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );
|
|
_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var children = object.children;
|
|
|
|
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
renderObject( children[ i ], camera, shadowCamera, isPointLight );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Ray( origin, direction ) {
|
|
|
|
this.origin = ( origin !== undefined ) ? origin : new Vector3();
|
|
this.direction = ( direction !== undefined ) ? direction : new Vector3();
|
|
|
|
}
|
|
|
|
Object.assign( Ray.prototype, {
|
|
|
|
set: function ( origin, direction ) {
|
|
|
|
this.origin.copy( origin );
|
|
this.direction.copy( direction );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( ray ) {
|
|
|
|
this.origin.copy( ray.origin );
|
|
this.direction.copy( ray.direction );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
at: function ( t, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
return result.copy( this.direction ).multiplyScalar( t ).add( this.origin );
|
|
|
|
},
|
|
|
|
lookAt: function ( v ) {
|
|
|
|
this.direction.copy( v ).sub( this.origin ).normalize();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
recast: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function recast( t ) {
|
|
|
|
this.origin.copy( this.at( t, v1 ) );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
closestPointToPoint: function ( point, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
result.subVectors( point, this.origin );
|
|
var directionDistance = result.dot( this.direction );
|
|
|
|
if ( directionDistance < 0 ) {
|
|
|
|
return result.copy( this.origin );
|
|
|
|
}
|
|
|
|
return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
|
|
|
|
},
|
|
|
|
distanceToPoint: function ( point ) {
|
|
|
|
return Math.sqrt( this.distanceSqToPoint( point ) );
|
|
|
|
},
|
|
|
|
distanceSqToPoint: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function distanceSqToPoint( point ) {
|
|
|
|
var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );
|
|
|
|
// point behind the ray
|
|
|
|
if ( directionDistance < 0 ) {
|
|
|
|
return this.origin.distanceToSquared( point );
|
|
|
|
}
|
|
|
|
v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
|
|
|
|
return v1.distanceToSquared( point );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
distanceSqToSegment: function () {
|
|
|
|
var segCenter = new Vector3();
|
|
var segDir = new Vector3();
|
|
var diff = new Vector3();
|
|
|
|
return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {
|
|
|
|
// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
|
|
// It returns the min distance between the ray and the segment
|
|
// defined by v0 and v1
|
|
// It can also set two optional targets :
|
|
// - The closest point on the ray
|
|
// - The closest point on the segment
|
|
|
|
segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );
|
|
segDir.copy( v1 ).sub( v0 ).normalize();
|
|
diff.copy( this.origin ).sub( segCenter );
|
|
|
|
var segExtent = v0.distanceTo( v1 ) * 0.5;
|
|
var a01 = - this.direction.dot( segDir );
|
|
var b0 = diff.dot( this.direction );
|
|
var b1 = - diff.dot( segDir );
|
|
var c = diff.lengthSq();
|
|
var det = Math.abs( 1 - a01 * a01 );
|
|
var s0, s1, sqrDist, extDet;
|
|
|
|
if ( det > 0 ) {
|
|
|
|
// The ray and segment are not parallel.
|
|
|
|
s0 = a01 * b1 - b0;
|
|
s1 = a01 * b0 - b1;
|
|
extDet = segExtent * det;
|
|
|
|
if ( s0 >= 0 ) {
|
|
|
|
if ( s1 >= - extDet ) {
|
|
|
|
if ( s1 <= extDet ) {
|
|
|
|
// region 0
|
|
// Minimum at interior points of ray and segment.
|
|
|
|
var invDet = 1 / det;
|
|
s0 *= invDet;
|
|
s1 *= invDet;
|
|
sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;
|
|
|
|
} else {
|
|
|
|
// region 1
|
|
|
|
s1 = segExtent;
|
|
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
|
|
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// region 5
|
|
|
|
s1 = - segExtent;
|
|
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
|
|
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( s1 <= - extDet ) {
|
|
|
|
// region 4
|
|
|
|
s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );
|
|
s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
|
|
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
|
|
|
|
} else if ( s1 <= extDet ) {
|
|
|
|
// region 3
|
|
|
|
s0 = 0;
|
|
s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );
|
|
sqrDist = s1 * ( s1 + 2 * b1 ) + c;
|
|
|
|
} else {
|
|
|
|
// region 2
|
|
|
|
s0 = Math.max( 0, - ( a01 * segExtent + b0 ) );
|
|
s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
|
|
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Ray and segment are parallel.
|
|
|
|
s1 = ( a01 > 0 ) ? - segExtent : segExtent;
|
|
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
|
|
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
|
|
|
|
}
|
|
|
|
if ( optionalPointOnRay ) {
|
|
|
|
optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );
|
|
|
|
}
|
|
|
|
if ( optionalPointOnSegment ) {
|
|
|
|
optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );
|
|
|
|
}
|
|
|
|
return sqrDist;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersectSphere: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function intersectSphere( sphere, optionalTarget ) {
|
|
|
|
v1.subVectors( sphere.center, this.origin );
|
|
var tca = v1.dot( this.direction );
|
|
var d2 = v1.dot( v1 ) - tca * tca;
|
|
var radius2 = sphere.radius * sphere.radius;
|
|
|
|
if ( d2 > radius2 ) return null;
|
|
|
|
var thc = Math.sqrt( radius2 - d2 );
|
|
|
|
// t0 = first intersect point - entrance on front of sphere
|
|
var t0 = tca - thc;
|
|
|
|
// t1 = second intersect point - exit point on back of sphere
|
|
var t1 = tca + thc;
|
|
|
|
// test to see if both t0 and t1 are behind the ray - if so, return null
|
|
if ( t0 < 0 && t1 < 0 ) return null;
|
|
|
|
// test to see if t0 is behind the ray:
|
|
// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
|
|
// in order to always return an intersect point that is in front of the ray.
|
|
if ( t0 < 0 ) return this.at( t1, optionalTarget );
|
|
|
|
// else t0 is in front of the ray, so return the first collision point scaled by t0
|
|
return this.at( t0, optionalTarget );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
intersectsSphere: function ( sphere ) {
|
|
|
|
return this.distanceToPoint( sphere.center ) <= sphere.radius;
|
|
|
|
},
|
|
|
|
distanceToPlane: function ( plane ) {
|
|
|
|
var denominator = plane.normal.dot( this.direction );
|
|
|
|
if ( denominator === 0 ) {
|
|
|
|
// line is coplanar, return origin
|
|
if ( plane.distanceToPoint( this.origin ) === 0 ) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
// Null is preferable to undefined since undefined means.... it is undefined
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;
|
|
|
|
// Return if the ray never intersects the plane
|
|
|
|
return t >= 0 ? t : null;
|
|
|
|
},
|
|
|
|
intersectPlane: function ( plane, optionalTarget ) {
|
|
|
|
var t = this.distanceToPlane( plane );
|
|
|
|
if ( t === null ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return this.at( t, optionalTarget );
|
|
|
|
},
|
|
|
|
intersectsPlane: function ( plane ) {
|
|
|
|
// check if the ray lies on the plane first
|
|
|
|
var distToPoint = plane.distanceToPoint( this.origin );
|
|
|
|
if ( distToPoint === 0 ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
var denominator = plane.normal.dot( this.direction );
|
|
|
|
if ( denominator * distToPoint < 0 ) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// ray origin is behind the plane (and is pointing behind it)
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
intersectBox: function ( box, optionalTarget ) {
|
|
|
|
var tmin, tmax, tymin, tymax, tzmin, tzmax;
|
|
|
|
var invdirx = 1 / this.direction.x,
|
|
invdiry = 1 / this.direction.y,
|
|
invdirz = 1 / this.direction.z;
|
|
|
|
var origin = this.origin;
|
|
|
|
if ( invdirx >= 0 ) {
|
|
|
|
tmin = ( box.min.x - origin.x ) * invdirx;
|
|
tmax = ( box.max.x - origin.x ) * invdirx;
|
|
|
|
} else {
|
|
|
|
tmin = ( box.max.x - origin.x ) * invdirx;
|
|
tmax = ( box.min.x - origin.x ) * invdirx;
|
|
|
|
}
|
|
|
|
if ( invdiry >= 0 ) {
|
|
|
|
tymin = ( box.min.y - origin.y ) * invdiry;
|
|
tymax = ( box.max.y - origin.y ) * invdiry;
|
|
|
|
} else {
|
|
|
|
tymin = ( box.max.y - origin.y ) * invdiry;
|
|
tymax = ( box.min.y - origin.y ) * invdiry;
|
|
|
|
}
|
|
|
|
if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;
|
|
|
|
// These lines also handle the case where tmin or tmax is NaN
|
|
// (result of 0 * Infinity). x !== x returns true if x is NaN
|
|
|
|
if ( tymin > tmin || tmin !== tmin ) tmin = tymin;
|
|
|
|
if ( tymax < tmax || tmax !== tmax ) tmax = tymax;
|
|
|
|
if ( invdirz >= 0 ) {
|
|
|
|
tzmin = ( box.min.z - origin.z ) * invdirz;
|
|
tzmax = ( box.max.z - origin.z ) * invdirz;
|
|
|
|
} else {
|
|
|
|
tzmin = ( box.max.z - origin.z ) * invdirz;
|
|
tzmax = ( box.min.z - origin.z ) * invdirz;
|
|
|
|
}
|
|
|
|
if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;
|
|
|
|
if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;
|
|
|
|
if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;
|
|
|
|
//return point closest to the ray (positive side)
|
|
|
|
if ( tmax < 0 ) return null;
|
|
|
|
return this.at( tmin >= 0 ? tmin : tmax, optionalTarget );
|
|
|
|
},
|
|
|
|
intersectsBox: ( function () {
|
|
|
|
var v = new Vector3();
|
|
|
|
return function intersectsBox( box ) {
|
|
|
|
return this.intersectBox( box, v ) !== null;
|
|
|
|
};
|
|
|
|
} )(),
|
|
|
|
intersectTriangle: function () {
|
|
|
|
// Compute the offset origin, edges, and normal.
|
|
var diff = new Vector3();
|
|
var edge1 = new Vector3();
|
|
var edge2 = new Vector3();
|
|
var normal = new Vector3();
|
|
|
|
return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {
|
|
|
|
// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
|
|
|
|
edge1.subVectors( b, a );
|
|
edge2.subVectors( c, a );
|
|
normal.crossVectors( edge1, edge2 );
|
|
|
|
// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
|
|
// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
|
|
// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
|
|
// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
|
|
// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
|
|
var DdN = this.direction.dot( normal );
|
|
var sign;
|
|
|
|
if ( DdN > 0 ) {
|
|
|
|
if ( backfaceCulling ) return null;
|
|
sign = 1;
|
|
|
|
} else if ( DdN < 0 ) {
|
|
|
|
sign = - 1;
|
|
DdN = - DdN;
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
diff.subVectors( this.origin, a );
|
|
var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );
|
|
|
|
// b1 < 0, no intersection
|
|
if ( DdQxE2 < 0 ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );
|
|
|
|
// b2 < 0, no intersection
|
|
if ( DdE1xQ < 0 ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// b1+b2 > 1, no intersection
|
|
if ( DdQxE2 + DdE1xQ > DdN ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// Line intersects triangle, check if ray does.
|
|
var QdN = - sign * diff.dot( normal );
|
|
|
|
// t < 0, no intersection
|
|
if ( QdN < 0 ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
// Ray intersects triangle.
|
|
return this.at( QdN / DdN, optionalTarget );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
applyMatrix4: function ( matrix4 ) {
|
|
|
|
this.direction.add( this.origin ).applyMatrix4( matrix4 );
|
|
this.origin.applyMatrix4( matrix4 );
|
|
this.direction.sub( this.origin );
|
|
this.direction.normalize();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( ray ) {
|
|
|
|
return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Euler( x, y, z, order ) {
|
|
|
|
this._x = x || 0;
|
|
this._y = y || 0;
|
|
this._z = z || 0;
|
|
this._order = order || Euler.DefaultOrder;
|
|
|
|
}
|
|
|
|
Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
|
|
|
|
Euler.DefaultOrder = 'XYZ';
|
|
|
|
Object.defineProperties( Euler.prototype, {
|
|
|
|
x: {
|
|
|
|
get: function () {
|
|
|
|
return this._x;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._x = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
y: {
|
|
|
|
get: function () {
|
|
|
|
return this._y;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._y = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
z: {
|
|
|
|
get: function () {
|
|
|
|
return this._z;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._z = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
order: {
|
|
|
|
get: function () {
|
|
|
|
return this._order;
|
|
|
|
},
|
|
|
|
set: function ( value ) {
|
|
|
|
this._order = value;
|
|
this.onChangeCallback();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Euler.prototype, {
|
|
|
|
isEuler: true,
|
|
|
|
set: function ( x, y, z, order ) {
|
|
|
|
this._x = x;
|
|
this._y = y;
|
|
this._z = z;
|
|
this._order = order || this._order;
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this._x, this._y, this._z, this._order );
|
|
|
|
},
|
|
|
|
copy: function ( euler ) {
|
|
|
|
this._x = euler._x;
|
|
this._y = euler._y;
|
|
this._z = euler._z;
|
|
this._order = euler._order;
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromRotationMatrix: function ( m, order, update ) {
|
|
|
|
var clamp = _Math.clamp;
|
|
|
|
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
|
|
var te = m.elements;
|
|
var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];
|
|
var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];
|
|
var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
|
|
|
|
order = order || this._order;
|
|
|
|
if ( order === 'XYZ' ) {
|
|
|
|
this._y = Math.asin( clamp( m13, - 1, 1 ) );
|
|
|
|
if ( Math.abs( m13 ) < 0.99999 ) {
|
|
|
|
this._x = Math.atan2( - m23, m33 );
|
|
this._z = Math.atan2( - m12, m11 );
|
|
|
|
} else {
|
|
|
|
this._x = Math.atan2( m32, m22 );
|
|
this._z = 0;
|
|
|
|
}
|
|
|
|
} else if ( order === 'YXZ' ) {
|
|
|
|
this._x = Math.asin( - clamp( m23, - 1, 1 ) );
|
|
|
|
if ( Math.abs( m23 ) < 0.99999 ) {
|
|
|
|
this._y = Math.atan2( m13, m33 );
|
|
this._z = Math.atan2( m21, m22 );
|
|
|
|
} else {
|
|
|
|
this._y = Math.atan2( - m31, m11 );
|
|
this._z = 0;
|
|
|
|
}
|
|
|
|
} else if ( order === 'ZXY' ) {
|
|
|
|
this._x = Math.asin( clamp( m32, - 1, 1 ) );
|
|
|
|
if ( Math.abs( m32 ) < 0.99999 ) {
|
|
|
|
this._y = Math.atan2( - m31, m33 );
|
|
this._z = Math.atan2( - m12, m22 );
|
|
|
|
} else {
|
|
|
|
this._y = 0;
|
|
this._z = Math.atan2( m21, m11 );
|
|
|
|
}
|
|
|
|
} else if ( order === 'ZYX' ) {
|
|
|
|
this._y = Math.asin( - clamp( m31, - 1, 1 ) );
|
|
|
|
if ( Math.abs( m31 ) < 0.99999 ) {
|
|
|
|
this._x = Math.atan2( m32, m33 );
|
|
this._z = Math.atan2( m21, m11 );
|
|
|
|
} else {
|
|
|
|
this._x = 0;
|
|
this._z = Math.atan2( - m12, m22 );
|
|
|
|
}
|
|
|
|
} else if ( order === 'YZX' ) {
|
|
|
|
this._z = Math.asin( clamp( m21, - 1, 1 ) );
|
|
|
|
if ( Math.abs( m21 ) < 0.99999 ) {
|
|
|
|
this._x = Math.atan2( - m23, m22 );
|
|
this._y = Math.atan2( - m31, m11 );
|
|
|
|
} else {
|
|
|
|
this._x = 0;
|
|
this._y = Math.atan2( m13, m33 );
|
|
|
|
}
|
|
|
|
} else if ( order === 'XZY' ) {
|
|
|
|
this._z = Math.asin( - clamp( m12, - 1, 1 ) );
|
|
|
|
if ( Math.abs( m12 ) < 0.99999 ) {
|
|
|
|
this._x = Math.atan2( m32, m22 );
|
|
this._y = Math.atan2( m13, m11 );
|
|
|
|
} else {
|
|
|
|
this._x = Math.atan2( - m23, m33 );
|
|
this._y = 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );
|
|
|
|
}
|
|
|
|
this._order = order;
|
|
|
|
if ( update !== false ) this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromQuaternion: function () {
|
|
|
|
var matrix = new Matrix4();
|
|
|
|
return function setFromQuaternion( q, order, update ) {
|
|
|
|
matrix.makeRotationFromQuaternion( q );
|
|
|
|
return this.setFromRotationMatrix( matrix, order, update );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
setFromVector3: function ( v, order ) {
|
|
|
|
return this.set( v.x, v.y, v.z, order || this._order );
|
|
|
|
},
|
|
|
|
reorder: function () {
|
|
|
|
// WARNING: this discards revolution information -bhouston
|
|
|
|
var q = new Quaternion();
|
|
|
|
return function reorder( newOrder ) {
|
|
|
|
q.setFromEuler( this );
|
|
|
|
return this.setFromQuaternion( q, newOrder );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
equals: function ( euler ) {
|
|
|
|
return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
|
|
|
|
},
|
|
|
|
fromArray: function ( array ) {
|
|
|
|
this._x = array[ 0 ];
|
|
this._y = array[ 1 ];
|
|
this._z = array[ 2 ];
|
|
if ( array[ 3 ] !== undefined ) this._order = array[ 3 ];
|
|
|
|
this.onChangeCallback();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toArray: function ( array, offset ) {
|
|
|
|
if ( array === undefined ) array = [];
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
array[ offset ] = this._x;
|
|
array[ offset + 1 ] = this._y;
|
|
array[ offset + 2 ] = this._z;
|
|
array[ offset + 3 ] = this._order;
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
toVector3: function ( optionalResult ) {
|
|
|
|
if ( optionalResult ) {
|
|
|
|
return optionalResult.set( this._x, this._y, this._z );
|
|
|
|
} else {
|
|
|
|
return new Vector3( this._x, this._y, this._z );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
onChange: function ( callback ) {
|
|
|
|
this.onChangeCallback = callback;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
onChangeCallback: function () {}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Layers() {
|
|
|
|
this.mask = 1 | 0;
|
|
|
|
}
|
|
|
|
Object.assign( Layers.prototype, {
|
|
|
|
set: function ( channel ) {
|
|
|
|
this.mask = 1 << channel | 0;
|
|
|
|
},
|
|
|
|
enable: function ( channel ) {
|
|
|
|
this.mask |= 1 << channel | 0;
|
|
|
|
},
|
|
|
|
toggle: function ( channel ) {
|
|
|
|
this.mask ^= 1 << channel | 0;
|
|
|
|
},
|
|
|
|
disable: function ( channel ) {
|
|
|
|
this.mask &= ~ ( 1 << channel | 0 );
|
|
|
|
},
|
|
|
|
test: function ( layers ) {
|
|
|
|
return ( this.mask & layers.mask ) !== 0;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author elephantatwork / www.elephantatwork.ch
|
|
*/
|
|
|
|
var object3DId = 0;
|
|
|
|
function Object3D() {
|
|
|
|
Object.defineProperty( this, 'id', { value: object3DId ++ } );
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.name = '';
|
|
this.type = 'Object3D';
|
|
|
|
this.parent = null;
|
|
this.children = [];
|
|
|
|
this.up = Object3D.DefaultUp.clone();
|
|
|
|
var position = new Vector3();
|
|
var rotation = new Euler();
|
|
var quaternion = new Quaternion();
|
|
var scale = new Vector3( 1, 1, 1 );
|
|
|
|
function onRotationChange() {
|
|
|
|
quaternion.setFromEuler( rotation, false );
|
|
|
|
}
|
|
|
|
function onQuaternionChange() {
|
|
|
|
rotation.setFromQuaternion( quaternion, undefined, false );
|
|
|
|
}
|
|
|
|
rotation.onChange( onRotationChange );
|
|
quaternion.onChange( onQuaternionChange );
|
|
|
|
Object.defineProperties( this, {
|
|
position: {
|
|
enumerable: true,
|
|
value: position
|
|
},
|
|
rotation: {
|
|
enumerable: true,
|
|
value: rotation
|
|
},
|
|
quaternion: {
|
|
enumerable: true,
|
|
value: quaternion
|
|
},
|
|
scale: {
|
|
enumerable: true,
|
|
value: scale
|
|
},
|
|
modelViewMatrix: {
|
|
value: new Matrix4()
|
|
},
|
|
normalMatrix: {
|
|
value: new Matrix3()
|
|
}
|
|
} );
|
|
|
|
this.matrix = new Matrix4();
|
|
this.matrixWorld = new Matrix4();
|
|
|
|
this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
|
|
this.matrixWorldNeedsUpdate = false;
|
|
|
|
this.layers = new Layers();
|
|
this.visible = true;
|
|
|
|
this.castShadow = false;
|
|
this.receiveShadow = false;
|
|
|
|
this.frustumCulled = true;
|
|
this.renderOrder = 0;
|
|
|
|
this.userData = {};
|
|
|
|
this.onBeforeRender = function () {};
|
|
this.onAfterRender = function () {};
|
|
|
|
}
|
|
|
|
Object3D.DefaultUp = new Vector3( 0, 1, 0 );
|
|
Object3D.DefaultMatrixAutoUpdate = true;
|
|
|
|
Object.assign( Object3D.prototype, EventDispatcher.prototype, {
|
|
|
|
isObject3D: true,
|
|
|
|
applyMatrix: function ( matrix ) {
|
|
|
|
this.matrix.multiplyMatrices( matrix, this.matrix );
|
|
|
|
this.matrix.decompose( this.position, this.quaternion, this.scale );
|
|
|
|
},
|
|
|
|
setRotationFromAxisAngle: function ( axis, angle ) {
|
|
|
|
// assumes axis is normalized
|
|
|
|
this.quaternion.setFromAxisAngle( axis, angle );
|
|
|
|
},
|
|
|
|
setRotationFromEuler: function ( euler ) {
|
|
|
|
this.quaternion.setFromEuler( euler, true );
|
|
|
|
},
|
|
|
|
setRotationFromMatrix: function ( m ) {
|
|
|
|
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
|
|
|
|
this.quaternion.setFromRotationMatrix( m );
|
|
|
|
},
|
|
|
|
setRotationFromQuaternion: function ( q ) {
|
|
|
|
// assumes q is normalized
|
|
|
|
this.quaternion.copy( q );
|
|
|
|
},
|
|
|
|
rotateOnAxis: function () {
|
|
|
|
// rotate object on axis in object space
|
|
// axis is assumed to be normalized
|
|
|
|
var q1 = new Quaternion();
|
|
|
|
return function rotateOnAxis( axis, angle ) {
|
|
|
|
q1.setFromAxisAngle( axis, angle );
|
|
|
|
this.quaternion.multiply( q1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateX: function () {
|
|
|
|
var v1 = new Vector3( 1, 0, 0 );
|
|
|
|
return function rotateX( angle ) {
|
|
|
|
return this.rotateOnAxis( v1, angle );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateY: function () {
|
|
|
|
var v1 = new Vector3( 0, 1, 0 );
|
|
|
|
return function rotateY( angle ) {
|
|
|
|
return this.rotateOnAxis( v1, angle );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateZ: function () {
|
|
|
|
var v1 = new Vector3( 0, 0, 1 );
|
|
|
|
return function rotateZ( angle ) {
|
|
|
|
return this.rotateOnAxis( v1, angle );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translateOnAxis: function () {
|
|
|
|
// translate object by distance along axis in object space
|
|
// axis is assumed to be normalized
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function translateOnAxis( axis, distance ) {
|
|
|
|
v1.copy( axis ).applyQuaternion( this.quaternion );
|
|
|
|
this.position.add( v1.multiplyScalar( distance ) );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translateX: function () {
|
|
|
|
var v1 = new Vector3( 1, 0, 0 );
|
|
|
|
return function translateX( distance ) {
|
|
|
|
return this.translateOnAxis( v1, distance );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translateY: function () {
|
|
|
|
var v1 = new Vector3( 0, 1, 0 );
|
|
|
|
return function translateY( distance ) {
|
|
|
|
return this.translateOnAxis( v1, distance );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translateZ: function () {
|
|
|
|
var v1 = new Vector3( 0, 0, 1 );
|
|
|
|
return function translateZ( distance ) {
|
|
|
|
return this.translateOnAxis( v1, distance );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
localToWorld: function ( vector ) {
|
|
|
|
return vector.applyMatrix4( this.matrixWorld );
|
|
|
|
},
|
|
|
|
worldToLocal: function () {
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function worldToLocal( vector ) {
|
|
|
|
return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
lookAt: function () {
|
|
|
|
// This routine does not support objects with rotated and/or translated parent(s)
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function lookAt( vector ) {
|
|
|
|
if ( this.isCamera ) {
|
|
|
|
m1.lookAt( this.position, vector, this.up );
|
|
|
|
} else {
|
|
|
|
m1.lookAt( vector, this.position, this.up );
|
|
|
|
}
|
|
|
|
this.quaternion.setFromRotationMatrix( m1 );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
add: function ( object ) {
|
|
|
|
if ( arguments.length > 1 ) {
|
|
|
|
for ( var i = 0; i < arguments.length; i ++ ) {
|
|
|
|
this.add( arguments[ i ] );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
if ( object === this ) {
|
|
|
|
console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object );
|
|
return this;
|
|
|
|
}
|
|
|
|
if ( ( object && object.isObject3D ) ) {
|
|
|
|
if ( object.parent !== null ) {
|
|
|
|
object.parent.remove( object );
|
|
|
|
}
|
|
|
|
object.parent = this;
|
|
object.dispatchEvent( { type: 'added' } );
|
|
|
|
this.children.push( object );
|
|
|
|
} else {
|
|
|
|
console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
remove: function ( object ) {
|
|
|
|
if ( arguments.length > 1 ) {
|
|
|
|
for ( var i = 0; i < arguments.length; i ++ ) {
|
|
|
|
this.remove( arguments[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var index = this.children.indexOf( object );
|
|
|
|
if ( index !== - 1 ) {
|
|
|
|
object.parent = null;
|
|
|
|
object.dispatchEvent( { type: 'removed' } );
|
|
|
|
this.children.splice( index, 1 );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
getObjectById: function ( id ) {
|
|
|
|
return this.getObjectByProperty( 'id', id );
|
|
|
|
},
|
|
|
|
getObjectByName: function ( name ) {
|
|
|
|
return this.getObjectByProperty( 'name', name );
|
|
|
|
},
|
|
|
|
getObjectByProperty: function ( name, value ) {
|
|
|
|
if ( this[ name ] === value ) return this;
|
|
|
|
for ( var i = 0, l = this.children.length; i < l; i ++ ) {
|
|
|
|
var child = this.children[ i ];
|
|
var object = child.getObjectByProperty( name, value );
|
|
|
|
if ( object !== undefined ) {
|
|
|
|
return object;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return undefined;
|
|
|
|
},
|
|
|
|
getWorldPosition: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
this.updateMatrixWorld( true );
|
|
|
|
return result.setFromMatrixPosition( this.matrixWorld );
|
|
|
|
},
|
|
|
|
getWorldQuaternion: function () {
|
|
|
|
var position = new Vector3();
|
|
var scale = new Vector3();
|
|
|
|
return function getWorldQuaternion( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Quaternion();
|
|
|
|
this.updateMatrixWorld( true );
|
|
|
|
this.matrixWorld.decompose( position, result, scale );
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
getWorldRotation: function () {
|
|
|
|
var quaternion = new Quaternion();
|
|
|
|
return function getWorldRotation( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Euler();
|
|
|
|
this.getWorldQuaternion( quaternion );
|
|
|
|
return result.setFromQuaternion( quaternion, this.rotation.order, false );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
getWorldScale: function () {
|
|
|
|
var position = new Vector3();
|
|
var quaternion = new Quaternion();
|
|
|
|
return function getWorldScale( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
this.updateMatrixWorld( true );
|
|
|
|
this.matrixWorld.decompose( position, quaternion, result );
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
getWorldDirection: function () {
|
|
|
|
var quaternion = new Quaternion();
|
|
|
|
return function getWorldDirection( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
this.getWorldQuaternion( quaternion );
|
|
|
|
return result.set( 0, 0, 1 ).applyQuaternion( quaternion );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
raycast: function () {},
|
|
|
|
traverse: function ( callback ) {
|
|
|
|
callback( this );
|
|
|
|
var children = this.children;
|
|
|
|
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
children[ i ].traverse( callback );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
traverseVisible: function ( callback ) {
|
|
|
|
if ( this.visible === false ) return;
|
|
|
|
callback( this );
|
|
|
|
var children = this.children;
|
|
|
|
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
children[ i ].traverseVisible( callback );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
traverseAncestors: function ( callback ) {
|
|
|
|
var parent = this.parent;
|
|
|
|
if ( parent !== null ) {
|
|
|
|
callback( parent );
|
|
|
|
parent.traverseAncestors( callback );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
updateMatrix: function () {
|
|
|
|
this.matrix.compose( this.position, this.quaternion, this.scale );
|
|
|
|
this.matrixWorldNeedsUpdate = true;
|
|
|
|
},
|
|
|
|
updateMatrixWorld: function ( force ) {
|
|
|
|
if ( this.matrixAutoUpdate ) this.updateMatrix();
|
|
|
|
if ( this.matrixWorldNeedsUpdate || force ) {
|
|
|
|
if ( this.parent === null ) {
|
|
|
|
this.matrixWorld.copy( this.matrix );
|
|
|
|
} else {
|
|
|
|
this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
|
|
|
|
}
|
|
|
|
this.matrixWorldNeedsUpdate = false;
|
|
|
|
force = true;
|
|
|
|
}
|
|
|
|
// update children
|
|
|
|
var children = this.children;
|
|
|
|
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
children[ i ].updateMatrixWorld( force );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
// meta is '' when called from JSON.stringify
|
|
var isRootObject = ( meta === undefined || meta === '' );
|
|
|
|
var output = {};
|
|
|
|
// meta is a hash used to collect geometries, materials.
|
|
// not providing it implies that this is the root object
|
|
// being serialized.
|
|
if ( isRootObject ) {
|
|
|
|
// initialize meta obj
|
|
meta = {
|
|
geometries: {},
|
|
materials: {},
|
|
textures: {},
|
|
images: {}
|
|
};
|
|
|
|
output.metadata = {
|
|
version: 4.5,
|
|
type: 'Object',
|
|
generator: 'Object3D.toJSON'
|
|
};
|
|
|
|
}
|
|
|
|
// standard Object3D serialization
|
|
|
|
var object = {};
|
|
|
|
object.uuid = this.uuid;
|
|
object.type = this.type;
|
|
|
|
if ( this.name !== '' ) object.name = this.name;
|
|
if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;
|
|
if ( this.castShadow === true ) object.castShadow = true;
|
|
if ( this.receiveShadow === true ) object.receiveShadow = true;
|
|
if ( this.visible === false ) object.visible = false;
|
|
|
|
object.matrix = this.matrix.toArray();
|
|
|
|
//
|
|
|
|
function serialize( library, element ) {
|
|
|
|
if ( library[ element.uuid ] === undefined ) {
|
|
|
|
library[ element.uuid ] = element.toJSON( meta );
|
|
|
|
}
|
|
|
|
return element.uuid;
|
|
|
|
}
|
|
|
|
if ( this.geometry !== undefined ) {
|
|
|
|
object.geometry = serialize( meta.geometries, this.geometry );
|
|
|
|
}
|
|
|
|
if ( this.material !== undefined ) {
|
|
|
|
if ( Array.isArray( this.material ) ) {
|
|
|
|
var uuids = [];
|
|
|
|
for ( var i = 0, l = this.material.length; i < l; i ++ ) {
|
|
|
|
uuids.push( serialize( meta.materials, this.material[ i ] ) );
|
|
|
|
}
|
|
|
|
object.material = uuids;
|
|
|
|
} else {
|
|
|
|
object.material = serialize( meta.materials, this.material );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if ( this.children.length > 0 ) {
|
|
|
|
object.children = [];
|
|
|
|
for ( var i = 0; i < this.children.length; i ++ ) {
|
|
|
|
object.children.push( this.children[ i ].toJSON( meta ).object );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( isRootObject ) {
|
|
|
|
var geometries = extractFromCache( meta.geometries );
|
|
var materials = extractFromCache( meta.materials );
|
|
var textures = extractFromCache( meta.textures );
|
|
var images = extractFromCache( meta.images );
|
|
|
|
if ( geometries.length > 0 ) output.geometries = geometries;
|
|
if ( materials.length > 0 ) output.materials = materials;
|
|
if ( textures.length > 0 ) output.textures = textures;
|
|
if ( images.length > 0 ) output.images = images;
|
|
|
|
}
|
|
|
|
output.object = object;
|
|
|
|
return output;
|
|
|
|
// extract data from the cache hash
|
|
// remove metadata on each item
|
|
// and return as array
|
|
function extractFromCache( cache ) {
|
|
|
|
var values = [];
|
|
for ( var key in cache ) {
|
|
|
|
var data = cache[ key ];
|
|
delete data.metadata;
|
|
values.push( data );
|
|
|
|
}
|
|
return values;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
clone: function ( recursive ) {
|
|
|
|
return new this.constructor().copy( this, recursive );
|
|
|
|
},
|
|
|
|
copy: function ( source, recursive ) {
|
|
|
|
if ( recursive === undefined ) recursive = true;
|
|
|
|
this.name = source.name;
|
|
|
|
this.up.copy( source.up );
|
|
|
|
this.position.copy( source.position );
|
|
this.quaternion.copy( source.quaternion );
|
|
this.scale.copy( source.scale );
|
|
|
|
this.matrix.copy( source.matrix );
|
|
this.matrixWorld.copy( source.matrixWorld );
|
|
|
|
this.matrixAutoUpdate = source.matrixAutoUpdate;
|
|
this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
|
|
|
|
this.layers.mask = source.layers.mask;
|
|
this.visible = source.visible;
|
|
|
|
this.castShadow = source.castShadow;
|
|
this.receiveShadow = source.receiveShadow;
|
|
|
|
this.frustumCulled = source.frustumCulled;
|
|
this.renderOrder = source.renderOrder;
|
|
|
|
this.userData = JSON.parse( JSON.stringify( source.userData ) );
|
|
|
|
if ( recursive === true ) {
|
|
|
|
for ( var i = 0; i < source.children.length; i ++ ) {
|
|
|
|
var child = source.children[ i ];
|
|
this.add( child.clone() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
function Line3( start, end ) {
|
|
|
|
this.start = ( start !== undefined ) ? start : new Vector3();
|
|
this.end = ( end !== undefined ) ? end : new Vector3();
|
|
|
|
}
|
|
|
|
Object.assign( Line3.prototype, {
|
|
|
|
set: function ( start, end ) {
|
|
|
|
this.start.copy( start );
|
|
this.end.copy( end );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( line ) {
|
|
|
|
this.start.copy( line.start );
|
|
this.end.copy( line.end );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getCenter: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
|
|
|
|
},
|
|
|
|
delta: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return result.subVectors( this.end, this.start );
|
|
|
|
},
|
|
|
|
distanceSq: function () {
|
|
|
|
return this.start.distanceToSquared( this.end );
|
|
|
|
},
|
|
|
|
distance: function () {
|
|
|
|
return this.start.distanceTo( this.end );
|
|
|
|
},
|
|
|
|
at: function ( t, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
return this.delta( result ).multiplyScalar( t ).add( this.start );
|
|
|
|
},
|
|
|
|
closestPointToPointParameter: function () {
|
|
|
|
var startP = new Vector3();
|
|
var startEnd = new Vector3();
|
|
|
|
return function closestPointToPointParameter( point, clampToLine ) {
|
|
|
|
startP.subVectors( point, this.start );
|
|
startEnd.subVectors( this.end, this.start );
|
|
|
|
var startEnd2 = startEnd.dot( startEnd );
|
|
var startEnd_startP = startEnd.dot( startP );
|
|
|
|
var t = startEnd_startP / startEnd2;
|
|
|
|
if ( clampToLine ) {
|
|
|
|
t = _Math.clamp( t, 0, 1 );
|
|
|
|
}
|
|
|
|
return t;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
closestPointToPoint: function ( point, clampToLine, optionalTarget ) {
|
|
|
|
var t = this.closestPointToPointParameter( point, clampToLine );
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
return this.delta( result ).multiplyScalar( t ).add( this.start );
|
|
|
|
},
|
|
|
|
applyMatrix4: function ( matrix ) {
|
|
|
|
this.start.applyMatrix4( matrix );
|
|
this.end.applyMatrix4( matrix );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
equals: function ( line ) {
|
|
|
|
return line.start.equals( this.start ) && line.end.equals( this.end );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Triangle( a, b, c ) {
|
|
|
|
this.a = ( a !== undefined ) ? a : new Vector3();
|
|
this.b = ( b !== undefined ) ? b : new Vector3();
|
|
this.c = ( c !== undefined ) ? c : new Vector3();
|
|
|
|
}
|
|
|
|
Object.assign( Triangle, {
|
|
|
|
normal: function () {
|
|
|
|
var v0 = new Vector3();
|
|
|
|
return function normal( a, b, c, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
result.subVectors( c, b );
|
|
v0.subVectors( a, b );
|
|
result.cross( v0 );
|
|
|
|
var resultLengthSq = result.lengthSq();
|
|
if ( resultLengthSq > 0 ) {
|
|
|
|
return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );
|
|
|
|
}
|
|
|
|
return result.set( 0, 0, 0 );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
// static/instance method to calculate barycentric coordinates
|
|
// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
|
|
barycoordFromPoint: function () {
|
|
|
|
var v0 = new Vector3();
|
|
var v1 = new Vector3();
|
|
var v2 = new Vector3();
|
|
|
|
return function barycoordFromPoint( point, a, b, c, optionalTarget ) {
|
|
|
|
v0.subVectors( c, a );
|
|
v1.subVectors( b, a );
|
|
v2.subVectors( point, a );
|
|
|
|
var dot00 = v0.dot( v0 );
|
|
var dot01 = v0.dot( v1 );
|
|
var dot02 = v0.dot( v2 );
|
|
var dot11 = v1.dot( v1 );
|
|
var dot12 = v1.dot( v2 );
|
|
|
|
var denom = ( dot00 * dot11 - dot01 * dot01 );
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
// collinear or singular triangle
|
|
if ( denom === 0 ) {
|
|
|
|
// arbitrary location outside of triangle?
|
|
// not sure if this is the best idea, maybe should be returning undefined
|
|
return result.set( - 2, - 1, - 1 );
|
|
|
|
}
|
|
|
|
var invDenom = 1 / denom;
|
|
var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
|
|
var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
|
|
|
|
// barycentric coordinates must always sum to 1
|
|
return result.set( 1 - u - v, v, u );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
containsPoint: function () {
|
|
|
|
var v1 = new Vector3();
|
|
|
|
return function containsPoint( point, a, b, c ) {
|
|
|
|
var result = Triangle.barycoordFromPoint( point, a, b, c, v1 );
|
|
|
|
return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );
|
|
|
|
};
|
|
|
|
}()
|
|
|
|
} );
|
|
|
|
Object.assign( Triangle.prototype, {
|
|
|
|
set: function ( a, b, c ) {
|
|
|
|
this.a.copy( a );
|
|
this.b.copy( b );
|
|
this.c.copy( c );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromPointsAndIndices: function ( points, i0, i1, i2 ) {
|
|
|
|
this.a.copy( points[ i0 ] );
|
|
this.b.copy( points[ i1 ] );
|
|
this.c.copy( points[ i2 ] );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( triangle ) {
|
|
|
|
this.a.copy( triangle.a );
|
|
this.b.copy( triangle.b );
|
|
this.c.copy( triangle.c );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
area: function () {
|
|
|
|
var v0 = new Vector3();
|
|
var v1 = new Vector3();
|
|
|
|
return function area() {
|
|
|
|
v0.subVectors( this.c, this.b );
|
|
v1.subVectors( this.a, this.b );
|
|
|
|
return v0.cross( v1 ).length() * 0.5;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
midpoint: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );
|
|
|
|
},
|
|
|
|
normal: function ( optionalTarget ) {
|
|
|
|
return Triangle.normal( this.a, this.b, this.c, optionalTarget );
|
|
|
|
},
|
|
|
|
plane: function ( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Plane();
|
|
|
|
return result.setFromCoplanarPoints( this.a, this.b, this.c );
|
|
|
|
},
|
|
|
|
barycoordFromPoint: function ( point, optionalTarget ) {
|
|
|
|
return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );
|
|
|
|
},
|
|
|
|
containsPoint: function ( point ) {
|
|
|
|
return Triangle.containsPoint( point, this.a, this.b, this.c );
|
|
|
|
},
|
|
|
|
closestPointToPoint: function () {
|
|
|
|
var plane = new Plane();
|
|
var edgeList = [ new Line3(), new Line3(), new Line3() ];
|
|
var projectedPoint = new Vector3();
|
|
var closestPoint = new Vector3();
|
|
|
|
return function closestPointToPoint( point, optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
var minDistance = Infinity;
|
|
|
|
// project the point onto the plane of the triangle
|
|
|
|
plane.setFromCoplanarPoints( this.a, this.b, this.c );
|
|
plane.projectPoint( point, projectedPoint );
|
|
|
|
// check if the projection lies within the triangle
|
|
|
|
if( this.containsPoint( projectedPoint ) === true ) {
|
|
|
|
// if so, this is the closest point
|
|
|
|
result.copy( projectedPoint );
|
|
|
|
} else {
|
|
|
|
// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices
|
|
|
|
edgeList[ 0 ].set( this.a, this.b );
|
|
edgeList[ 1 ].set( this.b, this.c );
|
|
edgeList[ 2 ].set( this.c, this.a );
|
|
|
|
for( var i = 0; i < edgeList.length; i ++ ) {
|
|
|
|
edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );
|
|
|
|
var distance = projectedPoint.distanceToSquared( closestPoint );
|
|
|
|
if( distance < minDistance ) {
|
|
|
|
minDistance = distance;
|
|
|
|
result.copy( closestPoint );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
equals: function ( triangle ) {
|
|
|
|
return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Face3( a, b, c, normal, color, materialIndex ) {
|
|
|
|
this.a = a;
|
|
this.b = b;
|
|
this.c = c;
|
|
|
|
this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();
|
|
this.vertexNormals = Array.isArray( normal ) ? normal : [];
|
|
|
|
this.color = ( color && color.isColor ) ? color : new Color();
|
|
this.vertexColors = Array.isArray( color ) ? color : [];
|
|
|
|
this.materialIndex = materialIndex !== undefined ? materialIndex : 0;
|
|
|
|
}
|
|
|
|
Object.assign( Face3.prototype, {
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.a = source.a;
|
|
this.b = source.b;
|
|
this.c = source.c;
|
|
|
|
this.normal.copy( source.normal );
|
|
this.color.copy( source.color );
|
|
|
|
this.materialIndex = source.materialIndex;
|
|
|
|
for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {
|
|
|
|
this.vertexNormals[ i ] = source.vertexNormals[ i ].clone();
|
|
|
|
}
|
|
|
|
for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {
|
|
|
|
this.vertexColors[ i ] = source.vertexColors[ i ].clone();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* opacity: <float>,
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* lightMap: new THREE.Texture( <Image> ),
|
|
* lightMapIntensity: <float>
|
|
*
|
|
* aoMap: new THREE.Texture( <Image> ),
|
|
* aoMapIntensity: <float>
|
|
*
|
|
* specularMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* alphaMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
|
|
* combine: THREE.Multiply,
|
|
* reflectivity: <float>,
|
|
* refractionRatio: <float>,
|
|
*
|
|
* shading: THREE.SmoothShading,
|
|
* depthTest: <bool>,
|
|
* depthWrite: <bool>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>,
|
|
*
|
|
* skinning: <bool>,
|
|
* morphTargets: <bool>
|
|
* }
|
|
*/
|
|
|
|
function MeshBasicMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'MeshBasicMaterial';
|
|
|
|
this.color = new Color( 0xffffff ); // emissive
|
|
|
|
this.map = null;
|
|
|
|
this.lightMap = null;
|
|
this.lightMapIntensity = 1.0;
|
|
|
|
this.aoMap = null;
|
|
this.aoMapIntensity = 1.0;
|
|
|
|
this.specularMap = null;
|
|
|
|
this.alphaMap = null;
|
|
|
|
this.envMap = null;
|
|
this.combine = MultiplyOperation;
|
|
this.reflectivity = 1;
|
|
this.refractionRatio = 0.98;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
this.wireframeLinecap = 'round';
|
|
this.wireframeLinejoin = 'round';
|
|
|
|
this.skinning = false;
|
|
this.morphTargets = false;
|
|
|
|
this.lights = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshBasicMaterial.prototype = Object.create( Material.prototype );
|
|
MeshBasicMaterial.prototype.constructor = MeshBasicMaterial;
|
|
|
|
MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
|
|
|
|
MeshBasicMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
|
|
this.map = source.map;
|
|
|
|
this.lightMap = source.lightMap;
|
|
this.lightMapIntensity = source.lightMapIntensity;
|
|
|
|
this.aoMap = source.aoMap;
|
|
this.aoMapIntensity = source.aoMapIntensity;
|
|
|
|
this.specularMap = source.specularMap;
|
|
|
|
this.alphaMap = source.alphaMap;
|
|
|
|
this.envMap = source.envMap;
|
|
this.combine = source.combine;
|
|
this.reflectivity = source.reflectivity;
|
|
this.refractionRatio = source.refractionRatio;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
this.wireframeLinecap = source.wireframeLinecap;
|
|
this.wireframeLinejoin = source.wireframeLinejoin;
|
|
|
|
this.skinning = source.skinning;
|
|
this.morphTargets = source.morphTargets;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function BufferAttribute( array, itemSize, normalized ) {
|
|
|
|
if ( Array.isArray( array ) ) {
|
|
|
|
throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
|
|
|
|
}
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.array = array;
|
|
this.itemSize = itemSize;
|
|
this.count = array !== undefined ? array.length / itemSize : 0;
|
|
this.normalized = normalized === true;
|
|
|
|
this.dynamic = false;
|
|
this.updateRange = { offset: 0, count: - 1 };
|
|
|
|
this.onUploadCallback = function () {};
|
|
|
|
this.version = 0;
|
|
|
|
}
|
|
|
|
Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', {
|
|
|
|
set: function ( value ) {
|
|
|
|
if ( value === true ) this.version ++;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( BufferAttribute.prototype, {
|
|
|
|
isBufferAttribute: true,
|
|
|
|
setArray: function ( array ) {
|
|
|
|
if ( Array.isArray( array ) ) {
|
|
|
|
throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
|
|
|
|
}
|
|
|
|
this.count = array !== undefined ? array.length / this.itemSize : 0;
|
|
this.array = array;
|
|
|
|
},
|
|
|
|
setDynamic: function ( value ) {
|
|
|
|
this.dynamic = value;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.array = new source.array.constructor( source.array );
|
|
this.itemSize = source.itemSize;
|
|
this.count = source.count;
|
|
this.normalized = source.normalized;
|
|
|
|
this.dynamic = source.dynamic;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyAt: function ( index1, attribute, index2 ) {
|
|
|
|
index1 *= this.itemSize;
|
|
index2 *= attribute.itemSize;
|
|
|
|
for ( var i = 0, l = this.itemSize; i < l; i ++ ) {
|
|
|
|
this.array[ index1 + i ] = attribute.array[ index2 + i ];
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyArray: function ( array ) {
|
|
|
|
this.array.set( array );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyColorsArray: function ( colors ) {
|
|
|
|
var array = this.array, offset = 0;
|
|
|
|
for ( var i = 0, l = colors.length; i < l; i ++ ) {
|
|
|
|
var color = colors[ i ];
|
|
|
|
if ( color === undefined ) {
|
|
|
|
console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );
|
|
color = new Color();
|
|
|
|
}
|
|
|
|
array[ offset ++ ] = color.r;
|
|
array[ offset ++ ] = color.g;
|
|
array[ offset ++ ] = color.b;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyIndicesArray: function ( indices ) {
|
|
|
|
var array = this.array, offset = 0;
|
|
|
|
for ( var i = 0, l = indices.length; i < l; i ++ ) {
|
|
|
|
var index = indices[ i ];
|
|
|
|
array[ offset ++ ] = index.a;
|
|
array[ offset ++ ] = index.b;
|
|
array[ offset ++ ] = index.c;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyVector2sArray: function ( vectors ) {
|
|
|
|
var array = this.array, offset = 0;
|
|
|
|
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
|
|
|
|
var vector = vectors[ i ];
|
|
|
|
if ( vector === undefined ) {
|
|
|
|
console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );
|
|
vector = new Vector2();
|
|
|
|
}
|
|
|
|
array[ offset ++ ] = vector.x;
|
|
array[ offset ++ ] = vector.y;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyVector3sArray: function ( vectors ) {
|
|
|
|
var array = this.array, offset = 0;
|
|
|
|
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
|
|
|
|
var vector = vectors[ i ];
|
|
|
|
if ( vector === undefined ) {
|
|
|
|
console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );
|
|
vector = new Vector3();
|
|
|
|
}
|
|
|
|
array[ offset ++ ] = vector.x;
|
|
array[ offset ++ ] = vector.y;
|
|
array[ offset ++ ] = vector.z;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyVector4sArray: function ( vectors ) {
|
|
|
|
var array = this.array, offset = 0;
|
|
|
|
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
|
|
|
|
var vector = vectors[ i ];
|
|
|
|
if ( vector === undefined ) {
|
|
|
|
console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );
|
|
vector = new Vector4();
|
|
|
|
}
|
|
|
|
array[ offset ++ ] = vector.x;
|
|
array[ offset ++ ] = vector.y;
|
|
array[ offset ++ ] = vector.z;
|
|
array[ offset ++ ] = vector.w;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
set: function ( value, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this.array.set( value, offset );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getX: function ( index ) {
|
|
|
|
return this.array[ index * this.itemSize ];
|
|
|
|
},
|
|
|
|
setX: function ( index, x ) {
|
|
|
|
this.array[ index * this.itemSize ] = x;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getY: function ( index ) {
|
|
|
|
return this.array[ index * this.itemSize + 1 ];
|
|
|
|
},
|
|
|
|
setY: function ( index, y ) {
|
|
|
|
this.array[ index * this.itemSize + 1 ] = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getZ: function ( index ) {
|
|
|
|
return this.array[ index * this.itemSize + 2 ];
|
|
|
|
},
|
|
|
|
setZ: function ( index, z ) {
|
|
|
|
this.array[ index * this.itemSize + 2 ] = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getW: function ( index ) {
|
|
|
|
return this.array[ index * this.itemSize + 3 ];
|
|
|
|
},
|
|
|
|
setW: function ( index, w ) {
|
|
|
|
this.array[ index * this.itemSize + 3 ] = w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setXY: function ( index, x, y ) {
|
|
|
|
index *= this.itemSize;
|
|
|
|
this.array[ index + 0 ] = x;
|
|
this.array[ index + 1 ] = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setXYZ: function ( index, x, y, z ) {
|
|
|
|
index *= this.itemSize;
|
|
|
|
this.array[ index + 0 ] = x;
|
|
this.array[ index + 1 ] = y;
|
|
this.array[ index + 2 ] = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setXYZW: function ( index, x, y, z, w ) {
|
|
|
|
index *= this.itemSize;
|
|
|
|
this.array[ index + 0 ] = x;
|
|
this.array[ index + 1 ] = y;
|
|
this.array[ index + 2 ] = z;
|
|
this.array[ index + 3 ] = w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
onUpload: function ( callback ) {
|
|
|
|
this.onUploadCallback = callback;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.array, this.itemSize ).copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
function Int8BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Int8Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Int8BufferAttribute.prototype.constructor = Int8BufferAttribute;
|
|
|
|
|
|
function Uint8BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Uint8Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;
|
|
|
|
|
|
function Uint8ClampedBufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );
|
|
|
|
}
|
|
|
|
Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;
|
|
|
|
|
|
function Int16BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Int16Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Int16BufferAttribute.prototype.constructor = Int16BufferAttribute;
|
|
|
|
|
|
function Uint16BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Uint16Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;
|
|
|
|
|
|
function Int32BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Int32Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Int32BufferAttribute.prototype.constructor = Int32BufferAttribute;
|
|
|
|
|
|
function Uint32BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Uint32Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;
|
|
|
|
|
|
function Float32BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Float32Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Float32BufferAttribute.prototype.constructor = Float32BufferAttribute;
|
|
|
|
|
|
function Float64BufferAttribute( array, itemSize ) {
|
|
|
|
BufferAttribute.call( this, new Float64Array( array ), itemSize );
|
|
|
|
}
|
|
|
|
Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
|
|
Float64BufferAttribute.prototype.constructor = Float64BufferAttribute;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function DirectGeometry() {
|
|
|
|
this.indices = [];
|
|
this.vertices = [];
|
|
this.normals = [];
|
|
this.colors = [];
|
|
this.uvs = [];
|
|
this.uvs2 = [];
|
|
|
|
this.groups = [];
|
|
|
|
this.morphTargets = {};
|
|
|
|
this.skinWeights = [];
|
|
this.skinIndices = [];
|
|
|
|
// this.lineDistances = [];
|
|
|
|
this.boundingBox = null;
|
|
this.boundingSphere = null;
|
|
|
|
// update flags
|
|
|
|
this.verticesNeedUpdate = false;
|
|
this.normalsNeedUpdate = false;
|
|
this.colorsNeedUpdate = false;
|
|
this.uvsNeedUpdate = false;
|
|
this.groupsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
Object.assign( DirectGeometry.prototype, {
|
|
|
|
computeGroups: function ( geometry ) {
|
|
|
|
var group;
|
|
var groups = [];
|
|
var materialIndex = undefined;
|
|
|
|
var faces = geometry.faces;
|
|
|
|
for ( var i = 0; i < faces.length; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
// materials
|
|
|
|
if ( face.materialIndex !== materialIndex ) {
|
|
|
|
materialIndex = face.materialIndex;
|
|
|
|
if ( group !== undefined ) {
|
|
|
|
group.count = ( i * 3 ) - group.start;
|
|
groups.push( group );
|
|
|
|
}
|
|
|
|
group = {
|
|
start: i * 3,
|
|
materialIndex: materialIndex
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( group !== undefined ) {
|
|
|
|
group.count = ( i * 3 ) - group.start;
|
|
groups.push( group );
|
|
|
|
}
|
|
|
|
this.groups = groups;
|
|
|
|
},
|
|
|
|
fromGeometry: function ( geometry ) {
|
|
|
|
var faces = geometry.faces;
|
|
var vertices = geometry.vertices;
|
|
var faceVertexUvs = geometry.faceVertexUvs;
|
|
|
|
var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;
|
|
var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
|
|
|
|
// morphs
|
|
|
|
var morphTargets = geometry.morphTargets;
|
|
var morphTargetsLength = morphTargets.length;
|
|
|
|
var morphTargetsPosition;
|
|
|
|
if ( morphTargetsLength > 0 ) {
|
|
|
|
morphTargetsPosition = [];
|
|
|
|
for ( var i = 0; i < morphTargetsLength; i ++ ) {
|
|
|
|
morphTargetsPosition[ i ] = [];
|
|
|
|
}
|
|
|
|
this.morphTargets.position = morphTargetsPosition;
|
|
|
|
}
|
|
|
|
var morphNormals = geometry.morphNormals;
|
|
var morphNormalsLength = morphNormals.length;
|
|
|
|
var morphTargetsNormal;
|
|
|
|
if ( morphNormalsLength > 0 ) {
|
|
|
|
morphTargetsNormal = [];
|
|
|
|
for ( var i = 0; i < morphNormalsLength; i ++ ) {
|
|
|
|
morphTargetsNormal[ i ] = [];
|
|
|
|
}
|
|
|
|
this.morphTargets.normal = morphTargetsNormal;
|
|
|
|
}
|
|
|
|
// skins
|
|
|
|
var skinIndices = geometry.skinIndices;
|
|
var skinWeights = geometry.skinWeights;
|
|
|
|
var hasSkinIndices = skinIndices.length === vertices.length;
|
|
var hasSkinWeights = skinWeights.length === vertices.length;
|
|
|
|
//
|
|
|
|
for ( var i = 0; i < faces.length; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );
|
|
|
|
var vertexNormals = face.vertexNormals;
|
|
|
|
if ( vertexNormals.length === 3 ) {
|
|
|
|
this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );
|
|
|
|
} else {
|
|
|
|
var normal = face.normal;
|
|
|
|
this.normals.push( normal, normal, normal );
|
|
|
|
}
|
|
|
|
var vertexColors = face.vertexColors;
|
|
|
|
if ( vertexColors.length === 3 ) {
|
|
|
|
this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );
|
|
|
|
} else {
|
|
|
|
var color = face.color;
|
|
|
|
this.colors.push( color, color, color );
|
|
|
|
}
|
|
|
|
if ( hasFaceVertexUv === true ) {
|
|
|
|
var vertexUvs = faceVertexUvs[ 0 ][ i ];
|
|
|
|
if ( vertexUvs !== undefined ) {
|
|
|
|
this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
|
|
|
|
} else {
|
|
|
|
console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );
|
|
|
|
this.uvs.push( new Vector2(), new Vector2(), new Vector2() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( hasFaceVertexUv2 === true ) {
|
|
|
|
var vertexUvs = faceVertexUvs[ 1 ][ i ];
|
|
|
|
if ( vertexUvs !== undefined ) {
|
|
|
|
this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
|
|
|
|
} else {
|
|
|
|
console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );
|
|
|
|
this.uvs2.push( new Vector2(), new Vector2(), new Vector2() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// morphs
|
|
|
|
for ( var j = 0; j < morphTargetsLength; j ++ ) {
|
|
|
|
var morphTarget = morphTargets[ j ].vertices;
|
|
|
|
morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );
|
|
|
|
}
|
|
|
|
for ( var j = 0; j < morphNormalsLength; j ++ ) {
|
|
|
|
var morphNormal = morphNormals[ j ].vertexNormals[ i ];
|
|
|
|
morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );
|
|
|
|
}
|
|
|
|
// skins
|
|
|
|
if ( hasSkinIndices ) {
|
|
|
|
this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );
|
|
|
|
}
|
|
|
|
if ( hasSkinWeights ) {
|
|
|
|
this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.computeGroups( geometry );
|
|
|
|
this.verticesNeedUpdate = geometry.verticesNeedUpdate;
|
|
this.normalsNeedUpdate = geometry.normalsNeedUpdate;
|
|
this.colorsNeedUpdate = geometry.colorsNeedUpdate;
|
|
this.uvsNeedUpdate = geometry.uvsNeedUpdate;
|
|
this.groupsNeedUpdate = geometry.groupsNeedUpdate;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
function arrayMax( array ) {
|
|
|
|
if ( array.length === 0 ) return - Infinity;
|
|
|
|
var max = array[ 0 ];
|
|
|
|
for ( var i = 1, l = array.length; i < l; ++ i ) {
|
|
|
|
if ( array[ i ] > max ) max = array[ i ];
|
|
|
|
}
|
|
|
|
return max;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author kile / http://kile.stravaganza.org/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* @author bhouston / http://clara.io
|
|
*/
|
|
|
|
var count = 0;
|
|
function GeometryIdCount() { return count++; }
|
|
|
|
function Geometry() {
|
|
|
|
Object.defineProperty( this, 'id', { value: GeometryIdCount() } );
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.name = '';
|
|
this.type = 'Geometry';
|
|
|
|
this.vertices = [];
|
|
this.colors = [];
|
|
this.faces = [];
|
|
this.faceVertexUvs = [[]];
|
|
|
|
this.morphTargets = [];
|
|
this.morphNormals = [];
|
|
|
|
this.skinWeights = [];
|
|
this.skinIndices = [];
|
|
|
|
this.lineDistances = [];
|
|
|
|
this.boundingBox = null;
|
|
this.boundingSphere = null;
|
|
|
|
// update flags
|
|
|
|
this.elementsNeedUpdate = false;
|
|
this.verticesNeedUpdate = false;
|
|
this.uvsNeedUpdate = false;
|
|
this.normalsNeedUpdate = false;
|
|
this.colorsNeedUpdate = false;
|
|
this.lineDistancesNeedUpdate = false;
|
|
this.groupsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
Object.assign( Geometry.prototype, EventDispatcher.prototype, {
|
|
|
|
isGeometry: true,
|
|
|
|
applyMatrix: function ( matrix ) {
|
|
|
|
var normalMatrix = new Matrix3().getNormalMatrix( matrix );
|
|
|
|
for ( var i = 0, il = this.vertices.length; i < il; i ++ ) {
|
|
|
|
var vertex = this.vertices[ i ];
|
|
vertex.applyMatrix4( matrix );
|
|
|
|
}
|
|
|
|
for ( var i = 0, il = this.faces.length; i < il; i ++ ) {
|
|
|
|
var face = this.faces[ i ];
|
|
face.normal.applyMatrix3( normalMatrix ).normalize();
|
|
|
|
for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
|
|
|
|
face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( this.boundingBox !== null ) {
|
|
|
|
this.computeBoundingBox();
|
|
|
|
}
|
|
|
|
if ( this.boundingSphere !== null ) {
|
|
|
|
this.computeBoundingSphere();
|
|
|
|
}
|
|
|
|
this.verticesNeedUpdate = true;
|
|
this.normalsNeedUpdate = true;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
rotateX: function () {
|
|
|
|
// rotate geometry around world x-axis
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function rotateX( angle ) {
|
|
|
|
m1.makeRotationX( angle );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateY: function () {
|
|
|
|
// rotate geometry around world y-axis
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function rotateY( angle ) {
|
|
|
|
m1.makeRotationY( angle );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateZ: function () {
|
|
|
|
// rotate geometry around world z-axis
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function rotateZ( angle ) {
|
|
|
|
m1.makeRotationZ( angle );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translate: function () {
|
|
|
|
// translate geometry
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function translate( x, y, z ) {
|
|
|
|
m1.makeTranslation( x, y, z );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
scale: function () {
|
|
|
|
// scale geometry
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function scale( x, y, z ) {
|
|
|
|
m1.makeScale( x, y, z );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
lookAt: function () {
|
|
|
|
var obj = new Object3D();
|
|
|
|
return function lookAt( vector ) {
|
|
|
|
obj.lookAt( vector );
|
|
|
|
obj.updateMatrix();
|
|
|
|
this.applyMatrix( obj.matrix );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
fromBufferGeometry: function ( geometry ) {
|
|
|
|
var scope = this;
|
|
|
|
var indices = geometry.index !== null ? geometry.index.array : undefined;
|
|
var attributes = geometry.attributes;
|
|
|
|
var positions = attributes.position.array;
|
|
var normals = attributes.normal !== undefined ? attributes.normal.array : undefined;
|
|
var colors = attributes.color !== undefined ? attributes.color.array : undefined;
|
|
var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;
|
|
var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;
|
|
|
|
if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];
|
|
|
|
var tempNormals = [];
|
|
var tempUVs = [];
|
|
var tempUVs2 = [];
|
|
|
|
for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {
|
|
|
|
scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );
|
|
|
|
if ( normals !== undefined ) {
|
|
|
|
tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );
|
|
|
|
}
|
|
|
|
if ( colors !== undefined ) {
|
|
|
|
scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );
|
|
|
|
}
|
|
|
|
if ( uvs !== undefined ) {
|
|
|
|
tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );
|
|
|
|
}
|
|
|
|
if ( uvs2 !== undefined ) {
|
|
|
|
tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function addFace( a, b, c, materialIndex ) {
|
|
|
|
var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];
|
|
var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];
|
|
|
|
var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );
|
|
|
|
scope.faces.push( face );
|
|
|
|
if ( uvs !== undefined ) {
|
|
|
|
scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );
|
|
|
|
}
|
|
|
|
if ( uvs2 !== undefined ) {
|
|
|
|
scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var groups = geometry.groups;
|
|
|
|
if ( groups.length > 0 ) {
|
|
|
|
for ( var i = 0; i < groups.length; i ++ ) {
|
|
|
|
var group = groups[ i ];
|
|
|
|
var start = group.start;
|
|
var count = group.count;
|
|
|
|
for ( var j = start, jl = start + count; j < jl; j += 3 ) {
|
|
|
|
if ( indices !== undefined ) {
|
|
|
|
addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );
|
|
|
|
} else {
|
|
|
|
addFace( j, j + 1, j + 2, group.materialIndex );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( indices !== undefined ) {
|
|
|
|
for ( var i = 0; i < indices.length; i += 3 ) {
|
|
|
|
addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for ( var i = 0; i < positions.length / 3; i += 3 ) {
|
|
|
|
addFace( i, i + 1, i + 2 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.computeFaceNormals();
|
|
|
|
if ( geometry.boundingBox !== null ) {
|
|
|
|
this.boundingBox = geometry.boundingBox.clone();
|
|
|
|
}
|
|
|
|
if ( geometry.boundingSphere !== null ) {
|
|
|
|
this.boundingSphere = geometry.boundingSphere.clone();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
center: function () {
|
|
|
|
this.computeBoundingBox();
|
|
|
|
var offset = this.boundingBox.getCenter().negate();
|
|
|
|
this.translate( offset.x, offset.y, offset.z );
|
|
|
|
return offset;
|
|
|
|
},
|
|
|
|
normalize: function () {
|
|
|
|
this.computeBoundingSphere();
|
|
|
|
var center = this.boundingSphere.center;
|
|
var radius = this.boundingSphere.radius;
|
|
|
|
var s = radius === 0 ? 1 : 1.0 / radius;
|
|
|
|
var matrix = new Matrix4();
|
|
matrix.set(
|
|
s, 0, 0, - s * center.x,
|
|
0, s, 0, - s * center.y,
|
|
0, 0, s, - s * center.z,
|
|
0, 0, 0, 1
|
|
);
|
|
|
|
this.applyMatrix( matrix );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
computeFaceNormals: function () {
|
|
|
|
var cb = new Vector3(), ab = new Vector3();
|
|
|
|
for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
var face = this.faces[ f ];
|
|
|
|
var vA = this.vertices[ face.a ];
|
|
var vB = this.vertices[ face.b ];
|
|
var vC = this.vertices[ face.c ];
|
|
|
|
cb.subVectors( vC, vB );
|
|
ab.subVectors( vA, vB );
|
|
cb.cross( ab );
|
|
|
|
cb.normalize();
|
|
|
|
face.normal.copy( cb );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computeVertexNormals: function ( areaWeighted ) {
|
|
|
|
if ( areaWeighted === undefined ) areaWeighted = true;
|
|
|
|
var v, vl, f, fl, face, vertices;
|
|
|
|
vertices = new Array( this.vertices.length );
|
|
|
|
for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
|
|
|
|
vertices[ v ] = new Vector3();
|
|
|
|
}
|
|
|
|
if ( areaWeighted ) {
|
|
|
|
// vertex normals weighted by triangle areas
|
|
// http://www.iquilezles.org/www/articles/normals/normals.htm
|
|
|
|
var vA, vB, vC;
|
|
var cb = new Vector3(), ab = new Vector3();
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
vA = this.vertices[ face.a ];
|
|
vB = this.vertices[ face.b ];
|
|
vC = this.vertices[ face.c ];
|
|
|
|
cb.subVectors( vC, vB );
|
|
ab.subVectors( vA, vB );
|
|
cb.cross( ab );
|
|
|
|
vertices[ face.a ].add( cb );
|
|
vertices[ face.b ].add( cb );
|
|
vertices[ face.c ].add( cb );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
this.computeFaceNormals();
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
vertices[ face.a ].add( face.normal );
|
|
vertices[ face.b ].add( face.normal );
|
|
vertices[ face.c ].add( face.normal );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
|
|
|
|
vertices[ v ].normalize();
|
|
|
|
}
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
var vertexNormals = face.vertexNormals;
|
|
|
|
if ( vertexNormals.length === 3 ) {
|
|
|
|
vertexNormals[ 0 ].copy( vertices[ face.a ] );
|
|
vertexNormals[ 1 ].copy( vertices[ face.b ] );
|
|
vertexNormals[ 2 ].copy( vertices[ face.c ] );
|
|
|
|
} else {
|
|
|
|
vertexNormals[ 0 ] = vertices[ face.a ].clone();
|
|
vertexNormals[ 1 ] = vertices[ face.b ].clone();
|
|
vertexNormals[ 2 ] = vertices[ face.c ].clone();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( this.faces.length > 0 ) {
|
|
|
|
this.normalsNeedUpdate = true;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computeFlatVertexNormals: function () {
|
|
|
|
var f, fl, face;
|
|
|
|
this.computeFaceNormals();
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
var vertexNormals = face.vertexNormals;
|
|
|
|
if ( vertexNormals.length === 3 ) {
|
|
|
|
vertexNormals[ 0 ].copy( face.normal );
|
|
vertexNormals[ 1 ].copy( face.normal );
|
|
vertexNormals[ 2 ].copy( face.normal );
|
|
|
|
} else {
|
|
|
|
vertexNormals[ 0 ] = face.normal.clone();
|
|
vertexNormals[ 1 ] = face.normal.clone();
|
|
vertexNormals[ 2 ] = face.normal.clone();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( this.faces.length > 0 ) {
|
|
|
|
this.normalsNeedUpdate = true;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computeMorphNormals: function () {
|
|
|
|
var i, il, f, fl, face;
|
|
|
|
// save original normals
|
|
// - create temp variables on first access
|
|
// otherwise just copy (for faster repeated calls)
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
if ( ! face.__originalFaceNormal ) {
|
|
|
|
face.__originalFaceNormal = face.normal.clone();
|
|
|
|
} else {
|
|
|
|
face.__originalFaceNormal.copy( face.normal );
|
|
|
|
}
|
|
|
|
if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];
|
|
|
|
for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {
|
|
|
|
if ( ! face.__originalVertexNormals[ i ] ) {
|
|
|
|
face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();
|
|
|
|
} else {
|
|
|
|
face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// use temp geometry to compute face and vertex normals for each morph
|
|
|
|
var tmpGeo = new Geometry();
|
|
tmpGeo.faces = this.faces;
|
|
|
|
for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {
|
|
|
|
// create on first access
|
|
|
|
if ( ! this.morphNormals[ i ] ) {
|
|
|
|
this.morphNormals[ i ] = {};
|
|
this.morphNormals[ i ].faceNormals = [];
|
|
this.morphNormals[ i ].vertexNormals = [];
|
|
|
|
var dstNormalsFace = this.morphNormals[ i ].faceNormals;
|
|
var dstNormalsVertex = this.morphNormals[ i ].vertexNormals;
|
|
|
|
var faceNormal, vertexNormals;
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
faceNormal = new Vector3();
|
|
vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };
|
|
|
|
dstNormalsFace.push( faceNormal );
|
|
dstNormalsVertex.push( vertexNormals );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var morphNormals = this.morphNormals[ i ];
|
|
|
|
// set vertices to morph target
|
|
|
|
tmpGeo.vertices = this.morphTargets[ i ].vertices;
|
|
|
|
// compute morph normals
|
|
|
|
tmpGeo.computeFaceNormals();
|
|
tmpGeo.computeVertexNormals();
|
|
|
|
// store morph normals
|
|
|
|
var faceNormal, vertexNormals;
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
faceNormal = morphNormals.faceNormals[ f ];
|
|
vertexNormals = morphNormals.vertexNormals[ f ];
|
|
|
|
faceNormal.copy( face.normal );
|
|
|
|
vertexNormals.a.copy( face.vertexNormals[ 0 ] );
|
|
vertexNormals.b.copy( face.vertexNormals[ 1 ] );
|
|
vertexNormals.c.copy( face.vertexNormals[ 2 ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// restore original normals
|
|
|
|
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
|
|
|
|
face = this.faces[ f ];
|
|
|
|
face.normal = face.__originalFaceNormal;
|
|
face.vertexNormals = face.__originalVertexNormals;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computeLineDistances: function () {
|
|
|
|
var d = 0;
|
|
var vertices = this.vertices;
|
|
|
|
for ( var i = 0, il = vertices.length; i < il; i ++ ) {
|
|
|
|
if ( i > 0 ) {
|
|
|
|
d += vertices[ i ].distanceTo( vertices[ i - 1 ] );
|
|
|
|
}
|
|
|
|
this.lineDistances[ i ] = d;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computeBoundingBox: function () {
|
|
|
|
if ( this.boundingBox === null ) {
|
|
|
|
this.boundingBox = new Box3();
|
|
|
|
}
|
|
|
|
this.boundingBox.setFromPoints( this.vertices );
|
|
|
|
},
|
|
|
|
computeBoundingSphere: function () {
|
|
|
|
if ( this.boundingSphere === null ) {
|
|
|
|
this.boundingSphere = new Sphere();
|
|
|
|
}
|
|
|
|
this.boundingSphere.setFromPoints( this.vertices );
|
|
|
|
},
|
|
|
|
merge: function ( geometry, matrix, materialIndexOffset ) {
|
|
|
|
if ( ( geometry && geometry.isGeometry ) === false ) {
|
|
|
|
console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );
|
|
return;
|
|
|
|
}
|
|
|
|
var normalMatrix,
|
|
vertexOffset = this.vertices.length,
|
|
vertices1 = this.vertices,
|
|
vertices2 = geometry.vertices,
|
|
faces1 = this.faces,
|
|
faces2 = geometry.faces,
|
|
uvs1 = this.faceVertexUvs[ 0 ],
|
|
uvs2 = geometry.faceVertexUvs[ 0 ],
|
|
colors1 = this.colors,
|
|
colors2 = geometry.colors;
|
|
|
|
if ( materialIndexOffset === undefined ) materialIndexOffset = 0;
|
|
|
|
if ( matrix !== undefined ) {
|
|
|
|
normalMatrix = new Matrix3().getNormalMatrix( matrix );
|
|
|
|
}
|
|
|
|
// vertices
|
|
|
|
for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
|
|
|
|
var vertex = vertices2[ i ];
|
|
|
|
var vertexCopy = vertex.clone();
|
|
|
|
if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );
|
|
|
|
vertices1.push( vertexCopy );
|
|
|
|
}
|
|
|
|
// colors
|
|
|
|
for ( var i = 0, il = colors2.length; i < il; i ++ ) {
|
|
|
|
colors1.push( colors2[ i ].clone() );
|
|
|
|
}
|
|
|
|
// faces
|
|
|
|
for ( i = 0, il = faces2.length; i < il; i ++ ) {
|
|
|
|
var face = faces2[ i ], faceCopy, normal, color,
|
|
faceVertexNormals = face.vertexNormals,
|
|
faceVertexColors = face.vertexColors;
|
|
|
|
faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
|
|
faceCopy.normal.copy( face.normal );
|
|
|
|
if ( normalMatrix !== undefined ) {
|
|
|
|
faceCopy.normal.applyMatrix3( normalMatrix ).normalize();
|
|
|
|
}
|
|
|
|
for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
|
|
|
|
normal = faceVertexNormals[ j ].clone();
|
|
|
|
if ( normalMatrix !== undefined ) {
|
|
|
|
normal.applyMatrix3( normalMatrix ).normalize();
|
|
|
|
}
|
|
|
|
faceCopy.vertexNormals.push( normal );
|
|
|
|
}
|
|
|
|
faceCopy.color.copy( face.color );
|
|
|
|
for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
|
|
|
|
color = faceVertexColors[ j ];
|
|
faceCopy.vertexColors.push( color.clone() );
|
|
|
|
}
|
|
|
|
faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
|
|
|
|
faces1.push( faceCopy );
|
|
|
|
}
|
|
|
|
// uvs
|
|
|
|
for ( i = 0, il = uvs2.length; i < il; i ++ ) {
|
|
|
|
var uv = uvs2[ i ], uvCopy = [];
|
|
|
|
if ( uv === undefined ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
|
|
|
|
uvCopy.push( uv[ j ].clone() );
|
|
|
|
}
|
|
|
|
uvs1.push( uvCopy );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
mergeMesh: function ( mesh ) {
|
|
|
|
if ( ( mesh && mesh.isMesh ) === false ) {
|
|
|
|
console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );
|
|
return;
|
|
|
|
}
|
|
|
|
mesh.matrixAutoUpdate && mesh.updateMatrix();
|
|
|
|
this.merge( mesh.geometry, mesh.matrix );
|
|
|
|
},
|
|
|
|
/*
|
|
* Checks for duplicate vertices with hashmap.
|
|
* Duplicated vertices are removed
|
|
* and faces' vertices are updated.
|
|
*/
|
|
|
|
mergeVertices: function () {
|
|
|
|
var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)
|
|
var unique = [], changes = [];
|
|
|
|
var v, key;
|
|
var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001
|
|
var precision = Math.pow( 10, precisionPoints );
|
|
var i, il, face;
|
|
var indices, j, jl;
|
|
|
|
for ( i = 0, il = this.vertices.length; i < il; i ++ ) {
|
|
|
|
v = this.vertices[ i ];
|
|
key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );
|
|
|
|
if ( verticesMap[ key ] === undefined ) {
|
|
|
|
verticesMap[ key ] = i;
|
|
unique.push( this.vertices[ i ] );
|
|
changes[ i ] = unique.length - 1;
|
|
|
|
} else {
|
|
|
|
//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
|
|
changes[ i ] = changes[ verticesMap[ key ] ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// if faces are completely degenerate after merging vertices, we
|
|
// have to remove them from the geometry.
|
|
var faceIndicesToRemove = [];
|
|
|
|
for ( i = 0, il = this.faces.length; i < il; i ++ ) {
|
|
|
|
face = this.faces[ i ];
|
|
|
|
face.a = changes[ face.a ];
|
|
face.b = changes[ face.b ];
|
|
face.c = changes[ face.c ];
|
|
|
|
indices = [ face.a, face.b, face.c ];
|
|
|
|
// if any duplicate vertices are found in a Face3
|
|
// we have to remove the face as nothing can be saved
|
|
for ( var n = 0; n < 3; n ++ ) {
|
|
|
|
if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {
|
|
|
|
faceIndicesToRemove.push( i );
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {
|
|
|
|
var idx = faceIndicesToRemove[ i ];
|
|
|
|
this.faces.splice( idx, 1 );
|
|
|
|
for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {
|
|
|
|
this.faceVertexUvs[ j ].splice( idx, 1 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Use unique set of vertices
|
|
|
|
var diff = this.vertices.length - unique.length;
|
|
this.vertices = unique;
|
|
return diff;
|
|
|
|
},
|
|
|
|
sortFacesByMaterialIndex: function () {
|
|
|
|
var faces = this.faces;
|
|
var length = faces.length;
|
|
|
|
// tag faces
|
|
|
|
for ( var i = 0; i < length; i ++ ) {
|
|
|
|
faces[ i ]._id = i;
|
|
|
|
}
|
|
|
|
// sort faces
|
|
|
|
function materialIndexSort( a, b ) {
|
|
|
|
return a.materialIndex - b.materialIndex;
|
|
|
|
}
|
|
|
|
faces.sort( materialIndexSort );
|
|
|
|
// sort uvs
|
|
|
|
var uvs1 = this.faceVertexUvs[ 0 ];
|
|
var uvs2 = this.faceVertexUvs[ 1 ];
|
|
|
|
var newUvs1, newUvs2;
|
|
|
|
if ( uvs1 && uvs1.length === length ) newUvs1 = [];
|
|
if ( uvs2 && uvs2.length === length ) newUvs2 = [];
|
|
|
|
for ( var i = 0; i < length; i ++ ) {
|
|
|
|
var id = faces[ i ]._id;
|
|
|
|
if ( newUvs1 ) newUvs1.push( uvs1[ id ] );
|
|
if ( newUvs2 ) newUvs2.push( uvs2[ id ] );
|
|
|
|
}
|
|
|
|
if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;
|
|
if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;
|
|
|
|
},
|
|
|
|
toJSON: function () {
|
|
|
|
var data = {
|
|
metadata: {
|
|
version: 4.5,
|
|
type: 'Geometry',
|
|
generator: 'Geometry.toJSON'
|
|
}
|
|
};
|
|
|
|
// standard Geometry serialization
|
|
|
|
data.uuid = this.uuid;
|
|
data.type = this.type;
|
|
if ( this.name !== '' ) data.name = this.name;
|
|
|
|
if ( this.parameters !== undefined ) {
|
|
|
|
var parameters = this.parameters;
|
|
|
|
for ( var key in parameters ) {
|
|
|
|
if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
var vertices = [];
|
|
|
|
for ( var i = 0; i < this.vertices.length; i ++ ) {
|
|
|
|
var vertex = this.vertices[ i ];
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
var faces = [];
|
|
var normals = [];
|
|
var normalsHash = {};
|
|
var colors = [];
|
|
var colorsHash = {};
|
|
var uvs = [];
|
|
var uvsHash = {};
|
|
|
|
for ( var i = 0; i < this.faces.length; i ++ ) {
|
|
|
|
var face = this.faces[ i ];
|
|
|
|
var hasMaterial = true;
|
|
var hasFaceUv = false; // deprecated
|
|
var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;
|
|
var hasFaceNormal = face.normal.length() > 0;
|
|
var hasFaceVertexNormal = face.vertexNormals.length > 0;
|
|
var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
|
|
var hasFaceVertexColor = face.vertexColors.length > 0;
|
|
|
|
var faceType = 0;
|
|
|
|
faceType = setBit( faceType, 0, 0 ); // isQuad
|
|
faceType = setBit( faceType, 1, hasMaterial );
|
|
faceType = setBit( faceType, 2, hasFaceUv );
|
|
faceType = setBit( faceType, 3, hasFaceVertexUv );
|
|
faceType = setBit( faceType, 4, hasFaceNormal );
|
|
faceType = setBit( faceType, 5, hasFaceVertexNormal );
|
|
faceType = setBit( faceType, 6, hasFaceColor );
|
|
faceType = setBit( faceType, 7, hasFaceVertexColor );
|
|
|
|
faces.push( faceType );
|
|
faces.push( face.a, face.b, face.c );
|
|
faces.push( face.materialIndex );
|
|
|
|
if ( hasFaceVertexUv ) {
|
|
|
|
var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];
|
|
|
|
faces.push(
|
|
getUvIndex( faceVertexUvs[ 0 ] ),
|
|
getUvIndex( faceVertexUvs[ 1 ] ),
|
|
getUvIndex( faceVertexUvs[ 2 ] )
|
|
);
|
|
|
|
}
|
|
|
|
if ( hasFaceNormal ) {
|
|
|
|
faces.push( getNormalIndex( face.normal ) );
|
|
|
|
}
|
|
|
|
if ( hasFaceVertexNormal ) {
|
|
|
|
var vertexNormals = face.vertexNormals;
|
|
|
|
faces.push(
|
|
getNormalIndex( vertexNormals[ 0 ] ),
|
|
getNormalIndex( vertexNormals[ 1 ] ),
|
|
getNormalIndex( vertexNormals[ 2 ] )
|
|
);
|
|
|
|
}
|
|
|
|
if ( hasFaceColor ) {
|
|
|
|
faces.push( getColorIndex( face.color ) );
|
|
|
|
}
|
|
|
|
if ( hasFaceVertexColor ) {
|
|
|
|
var vertexColors = face.vertexColors;
|
|
|
|
faces.push(
|
|
getColorIndex( vertexColors[ 0 ] ),
|
|
getColorIndex( vertexColors[ 1 ] ),
|
|
getColorIndex( vertexColors[ 2 ] )
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setBit( value, position, enabled ) {
|
|
|
|
return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );
|
|
|
|
}
|
|
|
|
function getNormalIndex( normal ) {
|
|
|
|
var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
|
|
|
|
if ( normalsHash[ hash ] !== undefined ) {
|
|
|
|
return normalsHash[ hash ];
|
|
|
|
}
|
|
|
|
normalsHash[ hash ] = normals.length / 3;
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
return normalsHash[ hash ];
|
|
|
|
}
|
|
|
|
function getColorIndex( color ) {
|
|
|
|
var hash = color.r.toString() + color.g.toString() + color.b.toString();
|
|
|
|
if ( colorsHash[ hash ] !== undefined ) {
|
|
|
|
return colorsHash[ hash ];
|
|
|
|
}
|
|
|
|
colorsHash[ hash ] = colors.length;
|
|
colors.push( color.getHex() );
|
|
|
|
return colorsHash[ hash ];
|
|
|
|
}
|
|
|
|
function getUvIndex( uv ) {
|
|
|
|
var hash = uv.x.toString() + uv.y.toString();
|
|
|
|
if ( uvsHash[ hash ] !== undefined ) {
|
|
|
|
return uvsHash[ hash ];
|
|
|
|
}
|
|
|
|
uvsHash[ hash ] = uvs.length / 2;
|
|
uvs.push( uv.x, uv.y );
|
|
|
|
return uvsHash[ hash ];
|
|
|
|
}
|
|
|
|
data.data = {};
|
|
|
|
data.data.vertices = vertices;
|
|
data.data.normals = normals;
|
|
if ( colors.length > 0 ) data.data.colors = colors;
|
|
if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility
|
|
data.data.faces = faces;
|
|
|
|
return data;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
/*
|
|
// Handle primitives
|
|
|
|
var parameters = this.parameters;
|
|
|
|
if ( parameters !== undefined ) {
|
|
|
|
var values = [];
|
|
|
|
for ( var key in parameters ) {
|
|
|
|
values.push( parameters[ key ] );
|
|
|
|
}
|
|
|
|
var geometry = Object.create( this.constructor.prototype );
|
|
this.constructor.apply( geometry, values );
|
|
return geometry;
|
|
|
|
}
|
|
|
|
return new this.constructor().copy( this );
|
|
*/
|
|
|
|
return new Geometry().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
var i, il, j, jl, k, kl;
|
|
|
|
// reset
|
|
|
|
this.vertices = [];
|
|
this.colors = [];
|
|
this.faces = [];
|
|
this.faceVertexUvs = [[]];
|
|
this.morphTargets = [];
|
|
this.morphNormals = [];
|
|
this.skinWeights = [];
|
|
this.skinIndices = [];
|
|
this.lineDistances = [];
|
|
this.boundingBox = null;
|
|
this.boundingSphere = null;
|
|
|
|
// name
|
|
|
|
this.name = source.name;
|
|
|
|
// vertices
|
|
|
|
var vertices = source.vertices;
|
|
|
|
for ( i = 0, il = vertices.length; i < il; i ++ ) {
|
|
|
|
this.vertices.push( vertices[ i ].clone() );
|
|
|
|
}
|
|
|
|
// colors
|
|
|
|
var colors = source.colors;
|
|
|
|
for ( i = 0, il = colors.length; i < il; i ++ ) {
|
|
|
|
this.colors.push( colors[ i ].clone() );
|
|
|
|
}
|
|
|
|
// faces
|
|
|
|
var faces = source.faces;
|
|
|
|
for ( i = 0, il = faces.length; i < il; i ++ ) {
|
|
|
|
this.faces.push( faces[ i ].clone() );
|
|
|
|
}
|
|
|
|
// face vertex uvs
|
|
|
|
for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {
|
|
|
|
var faceVertexUvs = source.faceVertexUvs[ i ];
|
|
|
|
if ( this.faceVertexUvs[ i ] === undefined ) {
|
|
|
|
this.faceVertexUvs[ i ] = [];
|
|
|
|
}
|
|
|
|
for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {
|
|
|
|
var uvs = faceVertexUvs[ j ], uvsCopy = [];
|
|
|
|
for ( k = 0, kl = uvs.length; k < kl; k ++ ) {
|
|
|
|
var uv = uvs[ k ];
|
|
|
|
uvsCopy.push( uv.clone() );
|
|
|
|
}
|
|
|
|
this.faceVertexUvs[ i ].push( uvsCopy );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// morph targets
|
|
|
|
var morphTargets = source.morphTargets;
|
|
|
|
for ( i = 0, il = morphTargets.length; i < il; i ++ ) {
|
|
|
|
var morphTarget = {};
|
|
morphTarget.name = morphTargets[ i ].name;
|
|
|
|
// vertices
|
|
|
|
if ( morphTargets[ i ].vertices !== undefined ) {
|
|
|
|
morphTarget.vertices = [];
|
|
|
|
for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {
|
|
|
|
morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// normals
|
|
|
|
if ( morphTargets[ i ].normals !== undefined ) {
|
|
|
|
morphTarget.normals = [];
|
|
|
|
for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {
|
|
|
|
morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.morphTargets.push( morphTarget );
|
|
|
|
}
|
|
|
|
// morph normals
|
|
|
|
var morphNormals = source.morphNormals;
|
|
|
|
for ( i = 0, il = morphNormals.length; i < il; i ++ ) {
|
|
|
|
var morphNormal = {};
|
|
|
|
// vertex normals
|
|
|
|
if ( morphNormals[ i ].vertexNormals !== undefined ) {
|
|
|
|
morphNormal.vertexNormals = [];
|
|
|
|
for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {
|
|
|
|
var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];
|
|
var destVertexNormal = {};
|
|
|
|
destVertexNormal.a = srcVertexNormal.a.clone();
|
|
destVertexNormal.b = srcVertexNormal.b.clone();
|
|
destVertexNormal.c = srcVertexNormal.c.clone();
|
|
|
|
morphNormal.vertexNormals.push( destVertexNormal );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// face normals
|
|
|
|
if ( morphNormals[ i ].faceNormals !== undefined ) {
|
|
|
|
morphNormal.faceNormals = [];
|
|
|
|
for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {
|
|
|
|
morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.morphNormals.push( morphNormal );
|
|
|
|
}
|
|
|
|
// skin weights
|
|
|
|
var skinWeights = source.skinWeights;
|
|
|
|
for ( i = 0, il = skinWeights.length; i < il; i ++ ) {
|
|
|
|
this.skinWeights.push( skinWeights[ i ].clone() );
|
|
|
|
}
|
|
|
|
// skin indices
|
|
|
|
var skinIndices = source.skinIndices;
|
|
|
|
for ( i = 0, il = skinIndices.length; i < il; i ++ ) {
|
|
|
|
this.skinIndices.push( skinIndices[ i ].clone() );
|
|
|
|
}
|
|
|
|
// line distances
|
|
|
|
var lineDistances = source.lineDistances;
|
|
|
|
for ( i = 0, il = lineDistances.length; i < il; i ++ ) {
|
|
|
|
this.lineDistances.push( lineDistances[ i ] );
|
|
|
|
}
|
|
|
|
// bounding box
|
|
|
|
var boundingBox = source.boundingBox;
|
|
|
|
if ( boundingBox !== null ) {
|
|
|
|
this.boundingBox = boundingBox.clone();
|
|
|
|
}
|
|
|
|
// bounding sphere
|
|
|
|
var boundingSphere = source.boundingSphere;
|
|
|
|
if ( boundingSphere !== null ) {
|
|
|
|
this.boundingSphere = boundingSphere.clone();
|
|
|
|
}
|
|
|
|
// update flags
|
|
|
|
this.elementsNeedUpdate = source.elementsNeedUpdate;
|
|
this.verticesNeedUpdate = source.verticesNeedUpdate;
|
|
this.uvsNeedUpdate = source.uvsNeedUpdate;
|
|
this.normalsNeedUpdate = source.normalsNeedUpdate;
|
|
this.colorsNeedUpdate = source.colorsNeedUpdate;
|
|
this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
|
|
this.groupsNeedUpdate = source.groupsNeedUpdate;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dispose: function () {
|
|
|
|
this.dispatchEvent( { type: 'dispose' } );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function BufferGeometry() {
|
|
|
|
Object.defineProperty( this, 'id', { value: GeometryIdCount() } );
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.name = '';
|
|
this.type = 'BufferGeometry';
|
|
|
|
this.index = null;
|
|
this.attributes = {};
|
|
|
|
this.morphAttributes = {};
|
|
|
|
this.groups = [];
|
|
|
|
this.boundingBox = null;
|
|
this.boundingSphere = null;
|
|
|
|
this.drawRange = { start: 0, count: Infinity };
|
|
|
|
}
|
|
|
|
BufferGeometry.MaxIndex = 65535;
|
|
|
|
Object.assign( BufferGeometry.prototype, EventDispatcher.prototype, {
|
|
|
|
isBufferGeometry: true,
|
|
|
|
getIndex: function () {
|
|
|
|
return this.index;
|
|
|
|
},
|
|
|
|
setIndex: function ( index ) {
|
|
|
|
if ( Array.isArray( index ) ) {
|
|
|
|
this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );
|
|
|
|
} else {
|
|
|
|
this.index = index;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
addAttribute: function ( name, attribute ) {
|
|
|
|
if ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );
|
|
|
|
this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ( name === 'index' ) {
|
|
|
|
console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );
|
|
this.setIndex( attribute );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.attributes[ name ] = attribute;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getAttribute: function ( name ) {
|
|
|
|
return this.attributes[ name ];
|
|
|
|
},
|
|
|
|
removeAttribute: function ( name ) {
|
|
|
|
delete this.attributes[ name ];
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addGroup: function ( start, count, materialIndex ) {
|
|
|
|
this.groups.push( {
|
|
|
|
start: start,
|
|
count: count,
|
|
materialIndex: materialIndex !== undefined ? materialIndex : 0
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
clearGroups: function () {
|
|
|
|
this.groups = [];
|
|
|
|
},
|
|
|
|
setDrawRange: function ( start, count ) {
|
|
|
|
this.drawRange.start = start;
|
|
this.drawRange.count = count;
|
|
|
|
},
|
|
|
|
applyMatrix: function ( matrix ) {
|
|
|
|
var position = this.attributes.position;
|
|
|
|
if ( position !== undefined ) {
|
|
|
|
matrix.applyToBufferAttribute( position );
|
|
position.needsUpdate = true;
|
|
|
|
}
|
|
|
|
var normal = this.attributes.normal;
|
|
|
|
if ( normal !== undefined ) {
|
|
|
|
var normalMatrix = new Matrix3().getNormalMatrix( matrix );
|
|
|
|
normalMatrix.applyToBufferAttribute( normal );
|
|
normal.needsUpdate = true;
|
|
|
|
}
|
|
|
|
if ( this.boundingBox !== null ) {
|
|
|
|
this.computeBoundingBox();
|
|
|
|
}
|
|
|
|
if ( this.boundingSphere !== null ) {
|
|
|
|
this.computeBoundingSphere();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
rotateX: function () {
|
|
|
|
// rotate geometry around world x-axis
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function rotateX( angle ) {
|
|
|
|
m1.makeRotationX( angle );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateY: function () {
|
|
|
|
// rotate geometry around world y-axis
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function rotateY( angle ) {
|
|
|
|
m1.makeRotationY( angle );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
rotateZ: function () {
|
|
|
|
// rotate geometry around world z-axis
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function rotateZ( angle ) {
|
|
|
|
m1.makeRotationZ( angle );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
translate: function () {
|
|
|
|
// translate geometry
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function translate( x, y, z ) {
|
|
|
|
m1.makeTranslation( x, y, z );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
scale: function () {
|
|
|
|
// scale geometry
|
|
|
|
var m1 = new Matrix4();
|
|
|
|
return function scale( x, y, z ) {
|
|
|
|
m1.makeScale( x, y, z );
|
|
|
|
this.applyMatrix( m1 );
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
lookAt: function () {
|
|
|
|
var obj = new Object3D();
|
|
|
|
return function lookAt( vector ) {
|
|
|
|
obj.lookAt( vector );
|
|
|
|
obj.updateMatrix();
|
|
|
|
this.applyMatrix( obj.matrix );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
center: function () {
|
|
|
|
this.computeBoundingBox();
|
|
|
|
var offset = this.boundingBox.getCenter().negate();
|
|
|
|
this.translate( offset.x, offset.y, offset.z );
|
|
|
|
return offset;
|
|
|
|
},
|
|
|
|
setFromObject: function ( object ) {
|
|
|
|
// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );
|
|
|
|
var geometry = object.geometry;
|
|
|
|
if ( object.isPoints || object.isLine ) {
|
|
|
|
var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );
|
|
var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );
|
|
|
|
this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );
|
|
this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );
|
|
|
|
if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {
|
|
|
|
var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );
|
|
|
|
this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );
|
|
|
|
}
|
|
|
|
if ( geometry.boundingSphere !== null ) {
|
|
|
|
this.boundingSphere = geometry.boundingSphere.clone();
|
|
|
|
}
|
|
|
|
if ( geometry.boundingBox !== null ) {
|
|
|
|
this.boundingBox = geometry.boundingBox.clone();
|
|
|
|
}
|
|
|
|
} else if ( object.isMesh ) {
|
|
|
|
if ( geometry && geometry.isGeometry ) {
|
|
|
|
this.fromGeometry( geometry );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
updateFromObject: function ( object ) {
|
|
|
|
var geometry = object.geometry;
|
|
|
|
if ( object.isMesh ) {
|
|
|
|
var direct = geometry.__directGeometry;
|
|
|
|
if ( geometry.elementsNeedUpdate === true ) {
|
|
|
|
direct = undefined;
|
|
geometry.elementsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
if ( direct === undefined ) {
|
|
|
|
return this.fromGeometry( geometry );
|
|
|
|
}
|
|
|
|
direct.verticesNeedUpdate = geometry.verticesNeedUpdate;
|
|
direct.normalsNeedUpdate = geometry.normalsNeedUpdate;
|
|
direct.colorsNeedUpdate = geometry.colorsNeedUpdate;
|
|
direct.uvsNeedUpdate = geometry.uvsNeedUpdate;
|
|
direct.groupsNeedUpdate = geometry.groupsNeedUpdate;
|
|
|
|
geometry.verticesNeedUpdate = false;
|
|
geometry.normalsNeedUpdate = false;
|
|
geometry.colorsNeedUpdate = false;
|
|
geometry.uvsNeedUpdate = false;
|
|
geometry.groupsNeedUpdate = false;
|
|
|
|
geometry = direct;
|
|
|
|
}
|
|
|
|
var attribute;
|
|
|
|
if ( geometry.verticesNeedUpdate === true ) {
|
|
|
|
attribute = this.attributes.position;
|
|
|
|
if ( attribute !== undefined ) {
|
|
|
|
attribute.copyVector3sArray( geometry.vertices );
|
|
attribute.needsUpdate = true;
|
|
|
|
}
|
|
|
|
geometry.verticesNeedUpdate = false;
|
|
|
|
}
|
|
|
|
if ( geometry.normalsNeedUpdate === true ) {
|
|
|
|
attribute = this.attributes.normal;
|
|
|
|
if ( attribute !== undefined ) {
|
|
|
|
attribute.copyVector3sArray( geometry.normals );
|
|
attribute.needsUpdate = true;
|
|
|
|
}
|
|
|
|
geometry.normalsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
if ( geometry.colorsNeedUpdate === true ) {
|
|
|
|
attribute = this.attributes.color;
|
|
|
|
if ( attribute !== undefined ) {
|
|
|
|
attribute.copyColorsArray( geometry.colors );
|
|
attribute.needsUpdate = true;
|
|
|
|
}
|
|
|
|
geometry.colorsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
if ( geometry.uvsNeedUpdate ) {
|
|
|
|
attribute = this.attributes.uv;
|
|
|
|
if ( attribute !== undefined ) {
|
|
|
|
attribute.copyVector2sArray( geometry.uvs );
|
|
attribute.needsUpdate = true;
|
|
|
|
}
|
|
|
|
geometry.uvsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
if ( geometry.lineDistancesNeedUpdate ) {
|
|
|
|
attribute = this.attributes.lineDistance;
|
|
|
|
if ( attribute !== undefined ) {
|
|
|
|
attribute.copyArray( geometry.lineDistances );
|
|
attribute.needsUpdate = true;
|
|
|
|
}
|
|
|
|
geometry.lineDistancesNeedUpdate = false;
|
|
|
|
}
|
|
|
|
if ( geometry.groupsNeedUpdate ) {
|
|
|
|
geometry.computeGroups( object.geometry );
|
|
this.groups = geometry.groups;
|
|
|
|
geometry.groupsNeedUpdate = false;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
fromGeometry: function ( geometry ) {
|
|
|
|
geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );
|
|
|
|
return this.fromDirectGeometry( geometry.__directGeometry );
|
|
|
|
},
|
|
|
|
fromDirectGeometry: function ( geometry ) {
|
|
|
|
var positions = new Float32Array( geometry.vertices.length * 3 );
|
|
this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );
|
|
|
|
if ( geometry.normals.length > 0 ) {
|
|
|
|
var normals = new Float32Array( geometry.normals.length * 3 );
|
|
this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );
|
|
|
|
}
|
|
|
|
if ( geometry.colors.length > 0 ) {
|
|
|
|
var colors = new Float32Array( geometry.colors.length * 3 );
|
|
this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );
|
|
|
|
}
|
|
|
|
if ( geometry.uvs.length > 0 ) {
|
|
|
|
var uvs = new Float32Array( geometry.uvs.length * 2 );
|
|
this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );
|
|
|
|
}
|
|
|
|
if ( geometry.uvs2.length > 0 ) {
|
|
|
|
var uvs2 = new Float32Array( geometry.uvs2.length * 2 );
|
|
this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );
|
|
|
|
}
|
|
|
|
if ( geometry.indices.length > 0 ) {
|
|
|
|
var TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;
|
|
var indices = new TypeArray( geometry.indices.length * 3 );
|
|
this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );
|
|
|
|
}
|
|
|
|
// groups
|
|
|
|
this.groups = geometry.groups;
|
|
|
|
// morphs
|
|
|
|
for ( var name in geometry.morphTargets ) {
|
|
|
|
var array = [];
|
|
var morphTargets = geometry.morphTargets[ name ];
|
|
|
|
for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
|
|
|
|
var morphTarget = morphTargets[ i ];
|
|
|
|
var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );
|
|
|
|
array.push( attribute.copyVector3sArray( morphTarget ) );
|
|
|
|
}
|
|
|
|
this.morphAttributes[ name ] = array;
|
|
|
|
}
|
|
|
|
// skinning
|
|
|
|
if ( geometry.skinIndices.length > 0 ) {
|
|
|
|
var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );
|
|
this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
|
|
|
|
}
|
|
|
|
if ( geometry.skinWeights.length > 0 ) {
|
|
|
|
var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );
|
|
this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if ( geometry.boundingSphere !== null ) {
|
|
|
|
this.boundingSphere = geometry.boundingSphere.clone();
|
|
|
|
}
|
|
|
|
if ( geometry.boundingBox !== null ) {
|
|
|
|
this.boundingBox = geometry.boundingBox.clone();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
computeBoundingBox: function () {
|
|
|
|
if ( this.boundingBox === null ) {
|
|
|
|
this.boundingBox = new Box3();
|
|
|
|
}
|
|
|
|
var position = this.attributes.position;
|
|
|
|
if ( position !== undefined ) {
|
|
|
|
this.boundingBox.setFromBufferAttribute( position );
|
|
|
|
} else {
|
|
|
|
this.boundingBox.makeEmpty();
|
|
|
|
}
|
|
|
|
if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
|
|
|
|
console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computeBoundingSphere: function () {
|
|
|
|
var box = new Box3();
|
|
var vector = new Vector3();
|
|
|
|
return function computeBoundingSphere() {
|
|
|
|
if ( this.boundingSphere === null ) {
|
|
|
|
this.boundingSphere = new Sphere();
|
|
|
|
}
|
|
|
|
var position = this.attributes.position;
|
|
|
|
if ( position ) {
|
|
|
|
var center = this.boundingSphere.center;
|
|
|
|
box.setFromBufferAttribute( position );
|
|
box.getCenter( center );
|
|
|
|
// hoping to find a boundingSphere with a radius smaller than the
|
|
// boundingSphere of the boundingBox: sqrt(3) smaller in the best case
|
|
|
|
var maxRadiusSq = 0;
|
|
|
|
for ( var i = 0, il = position.count; i < il; i ++ ) {
|
|
|
|
vector.x = position.getX( i );
|
|
vector.y = position.getY( i );
|
|
vector.z = position.getZ( i );
|
|
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
|
|
|
|
}
|
|
|
|
this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
|
|
|
|
if ( isNaN( this.boundingSphere.radius ) ) {
|
|
|
|
console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
computeFaceNormals: function () {
|
|
|
|
// backwards compatibility
|
|
|
|
},
|
|
|
|
computeVertexNormals: function () {
|
|
|
|
var index = this.index;
|
|
var attributes = this.attributes;
|
|
var groups = this.groups;
|
|
|
|
if ( attributes.position ) {
|
|
|
|
var positions = attributes.position.array;
|
|
|
|
if ( attributes.normal === undefined ) {
|
|
|
|
this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );
|
|
|
|
} else {
|
|
|
|
// reset existing normals to zero
|
|
|
|
var array = attributes.normal.array;
|
|
|
|
for ( var i = 0, il = array.length; i < il; i ++ ) {
|
|
|
|
array[ i ] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var normals = attributes.normal.array;
|
|
|
|
var vA, vB, vC;
|
|
var pA = new Vector3(), pB = new Vector3(), pC = new Vector3();
|
|
var cb = new Vector3(), ab = new Vector3();
|
|
|
|
// indexed elements
|
|
|
|
if ( index ) {
|
|
|
|
var indices = index.array;
|
|
|
|
if ( groups.length === 0 ) {
|
|
|
|
this.addGroup( 0, indices.length );
|
|
|
|
}
|
|
|
|
for ( var j = 0, jl = groups.length; j < jl; ++ j ) {
|
|
|
|
var group = groups[ j ];
|
|
|
|
var start = group.start;
|
|
var count = group.count;
|
|
|
|
for ( var i = start, il = start + count; i < il; i += 3 ) {
|
|
|
|
vA = indices[ i + 0 ] * 3;
|
|
vB = indices[ i + 1 ] * 3;
|
|
vC = indices[ i + 2 ] * 3;
|
|
|
|
pA.fromArray( positions, vA );
|
|
pB.fromArray( positions, vB );
|
|
pC.fromArray( positions, vC );
|
|
|
|
cb.subVectors( pC, pB );
|
|
ab.subVectors( pA, pB );
|
|
cb.cross( ab );
|
|
|
|
normals[ vA ] += cb.x;
|
|
normals[ vA + 1 ] += cb.y;
|
|
normals[ vA + 2 ] += cb.z;
|
|
|
|
normals[ vB ] += cb.x;
|
|
normals[ vB + 1 ] += cb.y;
|
|
normals[ vB + 2 ] += cb.z;
|
|
|
|
normals[ vC ] += cb.x;
|
|
normals[ vC + 1 ] += cb.y;
|
|
normals[ vC + 2 ] += cb.z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// non-indexed elements (unconnected triangle soup)
|
|
|
|
for ( var i = 0, il = positions.length; i < il; i += 9 ) {
|
|
|
|
pA.fromArray( positions, i );
|
|
pB.fromArray( positions, i + 3 );
|
|
pC.fromArray( positions, i + 6 );
|
|
|
|
cb.subVectors( pC, pB );
|
|
ab.subVectors( pA, pB );
|
|
cb.cross( ab );
|
|
|
|
normals[ i ] = cb.x;
|
|
normals[ i + 1 ] = cb.y;
|
|
normals[ i + 2 ] = cb.z;
|
|
|
|
normals[ i + 3 ] = cb.x;
|
|
normals[ i + 4 ] = cb.y;
|
|
normals[ i + 5 ] = cb.z;
|
|
|
|
normals[ i + 6 ] = cb.x;
|
|
normals[ i + 7 ] = cb.y;
|
|
normals[ i + 8 ] = cb.z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.normalizeNormals();
|
|
|
|
attributes.normal.needsUpdate = true;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
merge: function ( geometry, offset ) {
|
|
|
|
if ( ( geometry && geometry.isBufferGeometry ) === false ) {
|
|
|
|
console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
var attributes = this.attributes;
|
|
|
|
for ( var key in attributes ) {
|
|
|
|
if ( geometry.attributes[ key ] === undefined ) continue;
|
|
|
|
var attribute1 = attributes[ key ];
|
|
var attributeArray1 = attribute1.array;
|
|
|
|
var attribute2 = geometry.attributes[ key ];
|
|
var attributeArray2 = attribute2.array;
|
|
|
|
var attributeSize = attribute2.itemSize;
|
|
|
|
for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {
|
|
|
|
attributeArray1[ j ] = attributeArray2[ i ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
normalizeNormals: function () {
|
|
|
|
var normals = this.attributes.normal;
|
|
|
|
var x, y, z, n;
|
|
|
|
for ( var i = 0, il = normals.count; i < il; i ++ ) {
|
|
|
|
x = normals.getX( i );
|
|
y = normals.getY( i );
|
|
z = normals.getZ( i );
|
|
|
|
n = 1.0 / Math.sqrt( x * x + y * y + z * z );
|
|
|
|
normals.setXYZ( i, x * n, y * n, z * n );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
toNonIndexed: function () {
|
|
|
|
if ( this.index === null ) {
|
|
|
|
console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );
|
|
return this;
|
|
|
|
}
|
|
|
|
var geometry2 = new BufferGeometry();
|
|
|
|
var indices = this.index.array;
|
|
var attributes = this.attributes;
|
|
|
|
for ( var name in attributes ) {
|
|
|
|
var attribute = attributes[ name ];
|
|
|
|
var array = attribute.array;
|
|
var itemSize = attribute.itemSize;
|
|
|
|
var array2 = new array.constructor( indices.length * itemSize );
|
|
|
|
var index = 0, index2 = 0;
|
|
|
|
for ( var i = 0, l = indices.length; i < l; i ++ ) {
|
|
|
|
index = indices[ i ] * itemSize;
|
|
|
|
for ( var j = 0; j < itemSize; j ++ ) {
|
|
|
|
array2[ index2 ++ ] = array[ index ++ ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );
|
|
|
|
}
|
|
|
|
return geometry2;
|
|
|
|
},
|
|
|
|
toJSON: function () {
|
|
|
|
var data = {
|
|
metadata: {
|
|
version: 4.5,
|
|
type: 'BufferGeometry',
|
|
generator: 'BufferGeometry.toJSON'
|
|
}
|
|
};
|
|
|
|
// standard BufferGeometry serialization
|
|
|
|
data.uuid = this.uuid;
|
|
data.type = this.type;
|
|
if ( this.name !== '' ) data.name = this.name;
|
|
|
|
if ( this.parameters !== undefined ) {
|
|
|
|
var parameters = this.parameters;
|
|
|
|
for ( var key in parameters ) {
|
|
|
|
if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
data.data = { attributes: {} };
|
|
|
|
var index = this.index;
|
|
|
|
if ( index !== null ) {
|
|
|
|
var array = Array.prototype.slice.call( index.array );
|
|
|
|
data.data.index = {
|
|
type: index.array.constructor.name,
|
|
array: array
|
|
};
|
|
|
|
}
|
|
|
|
var attributes = this.attributes;
|
|
|
|
for ( var key in attributes ) {
|
|
|
|
var attribute = attributes[ key ];
|
|
|
|
var array = Array.prototype.slice.call( attribute.array );
|
|
|
|
data.data.attributes[ key ] = {
|
|
itemSize: attribute.itemSize,
|
|
type: attribute.array.constructor.name,
|
|
array: array,
|
|
normalized: attribute.normalized
|
|
};
|
|
|
|
}
|
|
|
|
var groups = this.groups;
|
|
|
|
if ( groups.length > 0 ) {
|
|
|
|
data.data.groups = JSON.parse( JSON.stringify( groups ) );
|
|
|
|
}
|
|
|
|
var boundingSphere = this.boundingSphere;
|
|
|
|
if ( boundingSphere !== null ) {
|
|
|
|
data.data.boundingSphere = {
|
|
center: boundingSphere.center.toArray(),
|
|
radius: boundingSphere.radius
|
|
};
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
/*
|
|
// Handle primitives
|
|
|
|
var parameters = this.parameters;
|
|
|
|
if ( parameters !== undefined ) {
|
|
|
|
var values = [];
|
|
|
|
for ( var key in parameters ) {
|
|
|
|
values.push( parameters[ key ] );
|
|
|
|
}
|
|
|
|
var geometry = Object.create( this.constructor.prototype );
|
|
this.constructor.apply( geometry, values );
|
|
return geometry;
|
|
|
|
}
|
|
|
|
return new this.constructor().copy( this );
|
|
*/
|
|
|
|
return new BufferGeometry().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
var name, i, l;
|
|
|
|
// reset
|
|
|
|
this.index = null;
|
|
this.attributes = {};
|
|
this.morphAttributes = {};
|
|
this.groups = [];
|
|
this.boundingBox = null;
|
|
this.boundingSphere = null;
|
|
|
|
// name
|
|
|
|
this.name = source.name;
|
|
|
|
// index
|
|
|
|
var index = source.index;
|
|
|
|
if ( index !== null ) {
|
|
|
|
this.setIndex( index.clone() );
|
|
|
|
}
|
|
|
|
// attributes
|
|
|
|
var attributes = source.attributes;
|
|
|
|
for ( name in attributes ) {
|
|
|
|
var attribute = attributes[ name ];
|
|
this.addAttribute( name, attribute.clone() );
|
|
|
|
}
|
|
|
|
// morph attributes
|
|
|
|
var morphAttributes = source.morphAttributes;
|
|
|
|
for ( name in morphAttributes ) {
|
|
|
|
var array = [];
|
|
var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
|
|
|
|
for ( i = 0, l = morphAttribute.length; i < l; i ++ ) {
|
|
|
|
array.push( morphAttribute[ i ].clone() );
|
|
|
|
}
|
|
|
|
this.morphAttributes[ name ] = array;
|
|
|
|
}
|
|
|
|
// groups
|
|
|
|
var groups = source.groups;
|
|
|
|
for ( i = 0, l = groups.length; i < l; i ++ ) {
|
|
|
|
var group = groups[ i ];
|
|
this.addGroup( group.start, group.count, group.materialIndex );
|
|
|
|
}
|
|
|
|
// bounding box
|
|
|
|
var boundingBox = source.boundingBox;
|
|
|
|
if ( boundingBox !== null ) {
|
|
|
|
this.boundingBox = boundingBox.clone();
|
|
|
|
}
|
|
|
|
// bounding sphere
|
|
|
|
var boundingSphere = source.boundingSphere;
|
|
|
|
if ( boundingSphere !== null ) {
|
|
|
|
this.boundingSphere = boundingSphere.clone();
|
|
|
|
}
|
|
|
|
// draw range
|
|
|
|
this.drawRange.start = source.drawRange.start;
|
|
this.drawRange.count = source.drawRange.count;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
dispose: function () {
|
|
|
|
this.dispatchEvent( { type: 'dispose' } );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author jonobr1 / http://jonobr1.com/
|
|
*/
|
|
|
|
function Mesh( geometry, material ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Mesh';
|
|
|
|
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
|
|
this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );
|
|
|
|
this.drawMode = TrianglesDrawMode;
|
|
|
|
this.updateMorphTargets();
|
|
|
|
}
|
|
|
|
Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Mesh,
|
|
|
|
isMesh: true,
|
|
|
|
setDrawMode: function ( value ) {
|
|
|
|
this.drawMode = value;
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
Object3D.prototype.copy.call( this, source );
|
|
|
|
this.drawMode = source.drawMode;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
updateMorphTargets: function () {
|
|
|
|
var morphTargets = this.geometry.morphTargets;
|
|
|
|
if ( morphTargets !== undefined && morphTargets.length > 0 ) {
|
|
|
|
this.morphTargetInfluences = [];
|
|
this.morphTargetDictionary = {};
|
|
|
|
for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {
|
|
|
|
this.morphTargetInfluences.push( 0 );
|
|
this.morphTargetDictionary[ morphTargets[ m ].name ] = m;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
raycast: ( function () {
|
|
|
|
var inverseMatrix = new Matrix4();
|
|
var ray = new Ray();
|
|
var sphere = new Sphere();
|
|
|
|
var vA = new Vector3();
|
|
var vB = new Vector3();
|
|
var vC = new Vector3();
|
|
|
|
var tempA = new Vector3();
|
|
var tempB = new Vector3();
|
|
var tempC = new Vector3();
|
|
|
|
var uvA = new Vector2();
|
|
var uvB = new Vector2();
|
|
var uvC = new Vector2();
|
|
|
|
var barycoord = new Vector3();
|
|
|
|
var intersectionPoint = new Vector3();
|
|
var intersectionPointWorld = new Vector3();
|
|
|
|
function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {
|
|
|
|
Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord );
|
|
|
|
uv1.multiplyScalar( barycoord.x );
|
|
uv2.multiplyScalar( barycoord.y );
|
|
uv3.multiplyScalar( barycoord.z );
|
|
|
|
uv1.add( uv2 ).add( uv3 );
|
|
|
|
return uv1.clone();
|
|
|
|
}
|
|
|
|
function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {
|
|
|
|
var intersect;
|
|
var material = object.material;
|
|
|
|
if ( material.side === BackSide ) {
|
|
|
|
intersect = ray.intersectTriangle( pC, pB, pA, true, point );
|
|
|
|
} else {
|
|
|
|
intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );
|
|
|
|
}
|
|
|
|
if ( intersect === null ) return null;
|
|
|
|
intersectionPointWorld.copy( point );
|
|
intersectionPointWorld.applyMatrix4( object.matrixWorld );
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );
|
|
|
|
if ( distance < raycaster.near || distance > raycaster.far ) return null;
|
|
|
|
return {
|
|
distance: distance,
|
|
point: intersectionPointWorld.clone(),
|
|
object: object
|
|
};
|
|
|
|
}
|
|
|
|
function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {
|
|
|
|
vA.fromBufferAttribute( position, a );
|
|
vB.fromBufferAttribute( position, b );
|
|
vC.fromBufferAttribute( position, c );
|
|
|
|
var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );
|
|
|
|
if ( intersection ) {
|
|
|
|
if ( uv ) {
|
|
|
|
uvA.fromBufferAttribute( uv, a );
|
|
uvB.fromBufferAttribute( uv, b );
|
|
uvC.fromBufferAttribute( uv, c );
|
|
|
|
intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );
|
|
|
|
}
|
|
|
|
intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );
|
|
intersection.faceIndex = a;
|
|
|
|
}
|
|
|
|
return intersection;
|
|
|
|
}
|
|
|
|
return function raycast( raycaster, intersects ) {
|
|
|
|
var geometry = this.geometry;
|
|
var material = this.material;
|
|
var matrixWorld = this.matrixWorld;
|
|
|
|
if ( material === undefined ) return;
|
|
|
|
// Checking boundingSphere distance to ray
|
|
|
|
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
|
|
|
|
sphere.copy( geometry.boundingSphere );
|
|
sphere.applyMatrix4( matrixWorld );
|
|
|
|
if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
|
|
|
|
//
|
|
|
|
inverseMatrix.getInverse( matrixWorld );
|
|
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
|
|
|
|
// Check boundingBox before continuing
|
|
|
|
if ( geometry.boundingBox !== null ) {
|
|
|
|
if ( ray.intersectsBox( geometry.boundingBox ) === false ) return;
|
|
|
|
}
|
|
|
|
var intersection;
|
|
|
|
if ( geometry.isBufferGeometry ) {
|
|
|
|
var a, b, c;
|
|
var index = geometry.index;
|
|
var position = geometry.attributes.position;
|
|
var uv = geometry.attributes.uv;
|
|
var i, l;
|
|
|
|
if ( index !== null ) {
|
|
|
|
// indexed buffer geometry
|
|
|
|
for ( i = 0, l = index.count; i < l; i += 3 ) {
|
|
|
|
a = index.getX( i );
|
|
b = index.getX( i + 1 );
|
|
c = index.getX( i + 2 );
|
|
|
|
intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );
|
|
|
|
if ( intersection ) {
|
|
|
|
intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics
|
|
intersects.push( intersection );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// non-indexed buffer geometry
|
|
|
|
for ( i = 0, l = position.count; i < l; i += 3 ) {
|
|
|
|
a = i;
|
|
b = i + 1;
|
|
c = i + 2;
|
|
|
|
intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );
|
|
|
|
if ( intersection ) {
|
|
|
|
intersection.index = a; // triangle number in positions buffer semantics
|
|
intersects.push( intersection );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ( geometry.isGeometry ) {
|
|
|
|
var fvA, fvB, fvC;
|
|
var isMultiMaterial = Array.isArray( material );
|
|
|
|
var vertices = geometry.vertices;
|
|
var faces = geometry.faces;
|
|
var uvs;
|
|
|
|
var faceVertexUvs = geometry.faceVertexUvs[ 0 ];
|
|
if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;
|
|
|
|
for ( var f = 0, fl = faces.length; f < fl; f ++ ) {
|
|
|
|
var face = faces[ f ];
|
|
var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;
|
|
|
|
if ( faceMaterial === undefined ) continue;
|
|
|
|
fvA = vertices[ face.a ];
|
|
fvB = vertices[ face.b ];
|
|
fvC = vertices[ face.c ];
|
|
|
|
if ( faceMaterial.morphTargets === true ) {
|
|
|
|
var morphTargets = geometry.morphTargets;
|
|
var morphInfluences = this.morphTargetInfluences;
|
|
|
|
vA.set( 0, 0, 0 );
|
|
vB.set( 0, 0, 0 );
|
|
vC.set( 0, 0, 0 );
|
|
|
|
for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
|
|
|
|
var influence = morphInfluences[ t ];
|
|
|
|
if ( influence === 0 ) continue;
|
|
|
|
var targets = morphTargets[ t ].vertices;
|
|
|
|
vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );
|
|
vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );
|
|
vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );
|
|
|
|
}
|
|
|
|
vA.add( fvA );
|
|
vB.add( fvB );
|
|
vC.add( fvC );
|
|
|
|
fvA = vA;
|
|
fvB = vB;
|
|
fvC = vC;
|
|
|
|
}
|
|
|
|
intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );
|
|
|
|
if ( intersection ) {
|
|
|
|
if ( uvs && uvs[ f ] ) {
|
|
|
|
var uvs_f = uvs[ f ];
|
|
uvA.copy( uvs_f[ 0 ] );
|
|
uvB.copy( uvs_f[ 1 ] );
|
|
uvC.copy( uvs_f[ 2 ] );
|
|
|
|
intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );
|
|
|
|
}
|
|
|
|
intersection.face = face;
|
|
intersection.faceIndex = f;
|
|
intersects.push( intersection );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}() ),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.geometry, this.material ).copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// BoxGeometry
|
|
|
|
function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'BoxGeometry';
|
|
|
|
this.parameters = {
|
|
width: width,
|
|
height: height,
|
|
depth: depth,
|
|
widthSegments: widthSegments,
|
|
heightSegments: heightSegments,
|
|
depthSegments: depthSegments
|
|
};
|
|
|
|
this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
BoxGeometry.prototype = Object.create( Geometry.prototype );
|
|
BoxGeometry.prototype.constructor = BoxGeometry;
|
|
|
|
// BoxBufferGeometry
|
|
|
|
function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'BoxBufferGeometry';
|
|
|
|
this.parameters = {
|
|
width: width,
|
|
height: height,
|
|
depth: depth,
|
|
widthSegments: widthSegments,
|
|
heightSegments: heightSegments,
|
|
depthSegments: depthSegments
|
|
};
|
|
|
|
var scope = this;
|
|
|
|
// segments
|
|
|
|
widthSegments = Math.floor( widthSegments ) || 1;
|
|
heightSegments = Math.floor( heightSegments ) || 1;
|
|
depthSegments = Math.floor( depthSegments ) || 1;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var numberOfVertices = 0;
|
|
var groupStart = 0;
|
|
|
|
// build each side of the box geometry
|
|
|
|
buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px
|
|
buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx
|
|
buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py
|
|
buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny
|
|
buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz
|
|
buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {
|
|
|
|
var segmentWidth = width / gridX;
|
|
var segmentHeight = height / gridY;
|
|
|
|
var widthHalf = width / 2;
|
|
var heightHalf = height / 2;
|
|
var depthHalf = depth / 2;
|
|
|
|
var gridX1 = gridX + 1;
|
|
var gridY1 = gridY + 1;
|
|
|
|
var vertexCounter = 0;
|
|
var groupCount = 0;
|
|
|
|
var ix, iy;
|
|
|
|
var vector = new Vector3();
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( iy = 0; iy < gridY1; iy ++ ) {
|
|
|
|
var y = iy * segmentHeight - heightHalf;
|
|
|
|
for ( ix = 0; ix < gridX1; ix ++ ) {
|
|
|
|
var x = ix * segmentWidth - widthHalf;
|
|
|
|
// set values to correct vector component
|
|
|
|
vector[ u ] = x * udir;
|
|
vector[ v ] = y * vdir;
|
|
vector[ w ] = depthHalf;
|
|
|
|
// now apply vector to vertex buffer
|
|
|
|
vertices.push( vector.x, vector.y, vector.z );
|
|
|
|
// set values to correct vector component
|
|
|
|
vector[ u ] = 0;
|
|
vector[ v ] = 0;
|
|
vector[ w ] = depth > 0 ? 1 : - 1;
|
|
|
|
// now apply vector to normal buffer
|
|
|
|
normals.push( vector.x, vector.y, vector.z );
|
|
|
|
// uvs
|
|
|
|
uvs.push( ix / gridX );
|
|
uvs.push( 1 - ( iy / gridY ) );
|
|
|
|
// counters
|
|
|
|
vertexCounter += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// indices
|
|
|
|
// 1. you need three indices to draw a single face
|
|
// 2. a single segment consists of two faces
|
|
// 3. so we need to generate six (2*3) indices per segment
|
|
|
|
for ( iy = 0; iy < gridY; iy ++ ) {
|
|
|
|
for ( ix = 0; ix < gridX; ix ++ ) {
|
|
|
|
var a = numberOfVertices + ix + gridX1 * iy;
|
|
var b = numberOfVertices + ix + gridX1 * ( iy + 1 );
|
|
var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );
|
|
var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
// increase counter
|
|
|
|
groupCount += 6;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// add a group to the geometry. this will ensure multi material support
|
|
|
|
scope.addGroup( groupStart, groupCount, materialIndex );
|
|
|
|
// calculate new start value for groups
|
|
|
|
groupStart += groupCount;
|
|
|
|
// update total number of vertices
|
|
|
|
numberOfVertices += vertexCounter;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
BoxBufferGeometry.prototype.constructor = BoxBufferGeometry;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// PlaneGeometry
|
|
|
|
function PlaneGeometry( width, height, widthSegments, heightSegments ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'PlaneGeometry';
|
|
|
|
this.parameters = {
|
|
width: width,
|
|
height: height,
|
|
widthSegments: widthSegments,
|
|
heightSegments: heightSegments
|
|
};
|
|
|
|
this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
PlaneGeometry.prototype = Object.create( Geometry.prototype );
|
|
PlaneGeometry.prototype.constructor = PlaneGeometry;
|
|
|
|
// PlaneBufferGeometry
|
|
|
|
function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'PlaneBufferGeometry';
|
|
|
|
this.parameters = {
|
|
width: width,
|
|
height: height,
|
|
widthSegments: widthSegments,
|
|
heightSegments: heightSegments
|
|
};
|
|
|
|
var width_half = width / 2;
|
|
var height_half = height / 2;
|
|
|
|
var gridX = Math.floor( widthSegments ) || 1;
|
|
var gridY = Math.floor( heightSegments ) || 1;
|
|
|
|
var gridX1 = gridX + 1;
|
|
var gridY1 = gridY + 1;
|
|
|
|
var segment_width = width / gridX;
|
|
var segment_height = height / gridY;
|
|
|
|
var ix, iy;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( iy = 0; iy < gridY1; iy ++ ) {
|
|
|
|
var y = iy * segment_height - height_half;
|
|
|
|
for ( ix = 0; ix < gridX1; ix ++ ) {
|
|
|
|
var x = ix * segment_width - width_half;
|
|
|
|
vertices.push( x, - y, 0 );
|
|
|
|
normals.push( 0, 0, 1 );
|
|
|
|
uvs.push( ix / gridX );
|
|
uvs.push( 1 - ( iy / gridY ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// indices
|
|
|
|
for ( iy = 0; iy < gridY; iy ++ ) {
|
|
|
|
for ( ix = 0; ix < gridX; ix ++ ) {
|
|
|
|
var a = ix + gridX1 * iy;
|
|
var b = ix + gridX1 * ( iy + 1 );
|
|
var c = ( ix + 1 ) + gridX1 * ( iy + 1 );
|
|
var d = ( ix + 1 ) + gridX1 * iy;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
}
|
|
|
|
PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function Camera() {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Camera';
|
|
|
|
this.matrixWorldInverse = new Matrix4();
|
|
this.projectionMatrix = new Matrix4();
|
|
|
|
}
|
|
|
|
Camera.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Camera,
|
|
|
|
isCamera: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Object3D.prototype.copy.call( this, source );
|
|
|
|
this.matrixWorldInverse.copy( source.matrixWorldInverse );
|
|
this.projectionMatrix.copy( source.projectionMatrix );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getWorldDirection: function () {
|
|
|
|
var quaternion = new Quaternion();
|
|
|
|
return function getWorldDirection( optionalTarget ) {
|
|
|
|
var result = optionalTarget || new Vector3();
|
|
|
|
this.getWorldQuaternion( quaternion );
|
|
|
|
return result.set( 0, 0, - 1 ).applyQuaternion( quaternion );
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author greggman / http://games.greggman.com/
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* @author tschw
|
|
*/
|
|
|
|
function PerspectiveCamera( fov, aspect, near, far ) {
|
|
|
|
Camera.call( this );
|
|
|
|
this.type = 'PerspectiveCamera';
|
|
|
|
this.fov = fov !== undefined ? fov : 50;
|
|
this.zoom = 1;
|
|
|
|
this.near = near !== undefined ? near : 0.1;
|
|
this.far = far !== undefined ? far : 2000;
|
|
this.focus = 10;
|
|
|
|
this.aspect = aspect !== undefined ? aspect : 1;
|
|
this.view = null;
|
|
|
|
this.filmGauge = 35; // width of the film (default in millimeters)
|
|
this.filmOffset = 0; // horizontal film offset (same unit as gauge)
|
|
|
|
this.updateProjectionMatrix();
|
|
|
|
}
|
|
|
|
PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {
|
|
|
|
constructor: PerspectiveCamera,
|
|
|
|
isPerspectiveCamera: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Camera.prototype.copy.call( this, source );
|
|
|
|
this.fov = source.fov;
|
|
this.zoom = source.zoom;
|
|
|
|
this.near = source.near;
|
|
this.far = source.far;
|
|
this.focus = source.focus;
|
|
|
|
this.aspect = source.aspect;
|
|
this.view = source.view === null ? null : Object.assign( {}, source.view );
|
|
|
|
this.filmGauge = source.filmGauge;
|
|
this.filmOffset = source.filmOffset;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
/**
|
|
* Sets the FOV by focal length in respect to the current .filmGauge.
|
|
*
|
|
* The default film gauge is 35, so that the focal length can be specified for
|
|
* a 35mm (full frame) camera.
|
|
*
|
|
* Values for focal length and film gauge must have the same unit.
|
|
*/
|
|
setFocalLength: function ( focalLength ) {
|
|
|
|
// see http://www.bobatkins.com/photography/technical/field_of_view.html
|
|
var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
|
|
|
|
this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );
|
|
this.updateProjectionMatrix();
|
|
|
|
},
|
|
|
|
/**
|
|
* Calculates the focal length from the current .fov and .filmGauge.
|
|
*/
|
|
getFocalLength: function () {
|
|
|
|
var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );
|
|
|
|
return 0.5 * this.getFilmHeight() / vExtentSlope;
|
|
|
|
},
|
|
|
|
getEffectiveFOV: function () {
|
|
|
|
return _Math.RAD2DEG * 2 * Math.atan(
|
|
Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );
|
|
|
|
},
|
|
|
|
getFilmWidth: function () {
|
|
|
|
// film not completely covered in portrait format (aspect < 1)
|
|
return this.filmGauge * Math.min( this.aspect, 1 );
|
|
|
|
},
|
|
|
|
getFilmHeight: function () {
|
|
|
|
// film not completely covered in landscape format (aspect > 1)
|
|
return this.filmGauge / Math.max( this.aspect, 1 );
|
|
|
|
},
|
|
|
|
/**
|
|
* Sets an offset in a larger frustum. This is useful for multi-window or
|
|
* multi-monitor/multi-machine setups.
|
|
*
|
|
* For example, if you have 3x2 monitors and each monitor is 1920x1080 and
|
|
* the monitors are in grid like this
|
|
*
|
|
* +---+---+---+
|
|
* | A | B | C |
|
|
* +---+---+---+
|
|
* | D | E | F |
|
|
* +---+---+---+
|
|
*
|
|
* then for each monitor you would call it like this
|
|
*
|
|
* var w = 1920;
|
|
* var h = 1080;
|
|
* var fullWidth = w * 3;
|
|
* var fullHeight = h * 2;
|
|
*
|
|
* --A--
|
|
* camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
|
|
* --B--
|
|
* camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
|
|
* --C--
|
|
* camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
|
|
* --D--
|
|
* camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
|
|
* --E--
|
|
* camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
|
|
* --F--
|
|
* camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
|
|
*
|
|
* Note there is no reason monitors have to be the same size or in a grid.
|
|
*/
|
|
setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {
|
|
|
|
this.aspect = fullWidth / fullHeight;
|
|
|
|
this.view = {
|
|
fullWidth: fullWidth,
|
|
fullHeight: fullHeight,
|
|
offsetX: x,
|
|
offsetY: y,
|
|
width: width,
|
|
height: height
|
|
};
|
|
|
|
this.updateProjectionMatrix();
|
|
|
|
},
|
|
|
|
clearViewOffset: function () {
|
|
|
|
this.view = null;
|
|
this.updateProjectionMatrix();
|
|
|
|
},
|
|
|
|
updateProjectionMatrix: function () {
|
|
|
|
var near = this.near,
|
|
top = near * Math.tan(
|
|
_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,
|
|
height = 2 * top,
|
|
width = this.aspect * height,
|
|
left = - 0.5 * width,
|
|
view = this.view;
|
|
|
|
if ( view !== null ) {
|
|
|
|
var fullWidth = view.fullWidth,
|
|
fullHeight = view.fullHeight;
|
|
|
|
left += view.offsetX * width / fullWidth;
|
|
top -= view.offsetY * height / fullHeight;
|
|
width *= view.width / fullWidth;
|
|
height *= view.height / fullHeight;
|
|
|
|
}
|
|
|
|
var skew = this.filmOffset;
|
|
if ( skew !== 0 ) left += near * skew / this.getFilmWidth();
|
|
|
|
this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var data = Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
data.object.fov = this.fov;
|
|
data.object.zoom = this.zoom;
|
|
|
|
data.object.near = this.near;
|
|
data.object.far = this.far;
|
|
data.object.focus = this.focus;
|
|
|
|
data.object.aspect = this.aspect;
|
|
|
|
if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
|
|
|
|
data.object.filmGauge = this.filmGauge;
|
|
data.object.filmOffset = this.filmOffset;
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author arose / http://github.com/arose
|
|
*/
|
|
|
|
function OrthographicCamera( left, right, top, bottom, near, far ) {
|
|
|
|
Camera.call( this );
|
|
|
|
this.type = 'OrthographicCamera';
|
|
|
|
this.zoom = 1;
|
|
this.view = null;
|
|
|
|
this.left = left;
|
|
this.right = right;
|
|
this.top = top;
|
|
this.bottom = bottom;
|
|
|
|
this.near = ( near !== undefined ) ? near : 0.1;
|
|
this.far = ( far !== undefined ) ? far : 2000;
|
|
|
|
this.updateProjectionMatrix();
|
|
|
|
}
|
|
|
|
OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {
|
|
|
|
constructor: OrthographicCamera,
|
|
|
|
isOrthographicCamera: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Camera.prototype.copy.call( this, source );
|
|
|
|
this.left = source.left;
|
|
this.right = source.right;
|
|
this.top = source.top;
|
|
this.bottom = source.bottom;
|
|
this.near = source.near;
|
|
this.far = source.far;
|
|
|
|
this.zoom = source.zoom;
|
|
this.view = source.view === null ? null : Object.assign( {}, source.view );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {
|
|
|
|
this.view = {
|
|
fullWidth: fullWidth,
|
|
fullHeight: fullHeight,
|
|
offsetX: x,
|
|
offsetY: y,
|
|
width: width,
|
|
height: height
|
|
};
|
|
|
|
this.updateProjectionMatrix();
|
|
|
|
},
|
|
|
|
clearViewOffset: function() {
|
|
|
|
this.view = null;
|
|
this.updateProjectionMatrix();
|
|
|
|
},
|
|
|
|
updateProjectionMatrix: function () {
|
|
|
|
var dx = ( this.right - this.left ) / ( 2 * this.zoom );
|
|
var dy = ( this.top - this.bottom ) / ( 2 * this.zoom );
|
|
var cx = ( this.right + this.left ) / 2;
|
|
var cy = ( this.top + this.bottom ) / 2;
|
|
|
|
var left = cx - dx;
|
|
var right = cx + dx;
|
|
var top = cy + dy;
|
|
var bottom = cy - dy;
|
|
|
|
if ( this.view !== null ) {
|
|
|
|
var zoomW = this.zoom / ( this.view.width / this.view.fullWidth );
|
|
var zoomH = this.zoom / ( this.view.height / this.view.fullHeight );
|
|
var scaleW = ( this.right - this.left ) / this.view.width;
|
|
var scaleH = ( this.top - this.bottom ) / this.view.height;
|
|
|
|
left += scaleW * ( this.view.offsetX / zoomW );
|
|
right = left + scaleW * ( this.view.width / zoomW );
|
|
top -= scaleH * ( this.view.offsetY / zoomH );
|
|
bottom = top - scaleH * ( this.view.height / zoomH );
|
|
|
|
}
|
|
|
|
this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var data = Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
data.object.zoom = this.zoom;
|
|
data.object.left = this.left;
|
|
data.object.right = this.right;
|
|
data.object.top = this.top;
|
|
data.object.bottom = this.bottom;
|
|
data.object.near = this.near;
|
|
data.object.far = this.far;
|
|
|
|
if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLAttributes( gl ) {
|
|
|
|
var buffers = {};
|
|
|
|
function createBuffer( attribute, bufferType ) {
|
|
|
|
var array = attribute.array;
|
|
var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;
|
|
|
|
var buffer = gl.createBuffer();
|
|
|
|
gl.bindBuffer( bufferType, buffer );
|
|
gl.bufferData( bufferType, array, usage );
|
|
|
|
attribute.onUploadCallback();
|
|
|
|
var type = gl.FLOAT;
|
|
|
|
if ( array instanceof Float32Array ) {
|
|
|
|
type = gl.FLOAT;
|
|
|
|
} else if ( array instanceof Float64Array ) {
|
|
|
|
console.warn( "Unsupported data buffer format: Float64Array" );
|
|
|
|
} else if ( array instanceof Uint16Array ) {
|
|
|
|
type = gl.UNSIGNED_SHORT;
|
|
|
|
} else if ( array instanceof Int16Array ) {
|
|
|
|
type = gl.SHORT;
|
|
|
|
} else if ( array instanceof Uint32Array ) {
|
|
|
|
type = gl.UNSIGNED_INT;
|
|
|
|
} else if ( array instanceof Int32Array ) {
|
|
|
|
type = gl.INT;
|
|
|
|
} else if ( array instanceof Int8Array ) {
|
|
|
|
type = gl.BYTE;
|
|
|
|
} else if ( array instanceof Uint8Array ) {
|
|
|
|
type = gl.UNSIGNED_BYTE;
|
|
|
|
}
|
|
|
|
return {
|
|
buffer: buffer,
|
|
type: type,
|
|
bytesPerElement: array.BYTES_PER_ELEMENT,
|
|
version: attribute.version
|
|
};
|
|
|
|
}
|
|
|
|
function updateBuffer( buffer, attribute, bufferType ) {
|
|
|
|
var array = attribute.array;
|
|
var updateRange = attribute.updateRange;
|
|
|
|
gl.bindBuffer( bufferType, buffer );
|
|
|
|
if ( attribute.dynamic === false ) {
|
|
|
|
gl.bufferData( bufferType, array, gl.STATIC_DRAW );
|
|
|
|
} else if ( updateRange.count === - 1 ) {
|
|
|
|
// Not using update ranges
|
|
|
|
gl.bufferSubData( bufferType, 0, array );
|
|
|
|
} else if ( updateRange.count === 0 ) {
|
|
|
|
console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );
|
|
|
|
} else {
|
|
|
|
gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
|
|
array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );
|
|
|
|
updateRange.count = 0; // reset range
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function get( attribute ) {
|
|
|
|
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
|
|
|
|
return buffers[ attribute.uuid ];
|
|
|
|
}
|
|
|
|
function remove( attribute ) {
|
|
|
|
var data = buffers[ attribute.uuid ];
|
|
|
|
if ( data ) {
|
|
|
|
gl.deleteBuffer( data.buffer );
|
|
|
|
delete buffers[ attribute.uuid ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function update( attribute, bufferType ) {
|
|
|
|
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
|
|
|
|
var data = buffers[ attribute.uuid ];
|
|
|
|
if ( data === undefined ) {
|
|
|
|
buffers[ attribute.uuid ] = createBuffer( attribute, bufferType );
|
|
|
|
} else if ( data.version < attribute.version ) {
|
|
|
|
updateBuffer( data.buffer, attribute, bufferType );
|
|
|
|
data.version = attribute.version;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
get: get,
|
|
remove: remove,
|
|
update: update
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function painterSortStable( a, b ) {
|
|
|
|
if ( a.renderOrder !== b.renderOrder ) {
|
|
|
|
return a.renderOrder - b.renderOrder;
|
|
|
|
} else if ( a.program && b.program && a.program !== b.program ) {
|
|
|
|
return a.program.id - b.program.id;
|
|
|
|
} else if ( a.material.id !== b.material.id ) {
|
|
|
|
return a.material.id - b.material.id;
|
|
|
|
} else if ( a.z !== b.z ) {
|
|
|
|
return a.z - b.z;
|
|
|
|
} else {
|
|
|
|
return a.id - b.id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function reversePainterSortStable( a, b ) {
|
|
|
|
if ( a.renderOrder !== b.renderOrder ) {
|
|
|
|
return a.renderOrder - b.renderOrder;
|
|
|
|
} if ( a.z !== b.z ) {
|
|
|
|
return b.z - a.z;
|
|
|
|
} else {
|
|
|
|
return a.id - b.id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function WebGLRenderList() {
|
|
|
|
var opaque = [];
|
|
var opaqueLastIndex = - 1;
|
|
|
|
var transparent = [];
|
|
var transparentLastIndex = - 1;
|
|
|
|
function init() {
|
|
|
|
opaqueLastIndex = - 1;
|
|
transparentLastIndex = - 1;
|
|
|
|
}
|
|
|
|
function push( object, geometry, material, z, group ) {
|
|
|
|
var array, index;
|
|
|
|
// allocate the next position in the appropriate array
|
|
|
|
if ( material.transparent ) {
|
|
|
|
array = transparent;
|
|
index = ++ transparentLastIndex;
|
|
|
|
} else {
|
|
|
|
array = opaque;
|
|
index = ++ opaqueLastIndex;
|
|
|
|
}
|
|
|
|
// recycle existing render item or grow the array
|
|
|
|
var renderItem = array[ index ];
|
|
|
|
if ( renderItem ) {
|
|
|
|
renderItem.id = object.id;
|
|
renderItem.object = object;
|
|
renderItem.geometry = geometry;
|
|
renderItem.material = material;
|
|
renderItem.program = material.program;
|
|
renderItem.renderOrder = object.renderOrder;
|
|
renderItem.z = z;
|
|
renderItem.group = group;
|
|
|
|
} else {
|
|
|
|
renderItem = {
|
|
id: object.id,
|
|
object: object,
|
|
geometry: geometry,
|
|
material: material,
|
|
program: material.program,
|
|
renderOrder: object.renderOrder,
|
|
z: z,
|
|
group: group
|
|
};
|
|
|
|
// assert( index === array.length );
|
|
array.push( renderItem );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function finish() {
|
|
|
|
opaque.length = opaqueLastIndex + 1;
|
|
transparent.length = transparentLastIndex + 1;
|
|
|
|
}
|
|
|
|
function sort() {
|
|
|
|
opaque.sort( painterSortStable );
|
|
transparent.sort( reversePainterSortStable );
|
|
|
|
}
|
|
|
|
return {
|
|
opaque: opaque,
|
|
transparent: transparent,
|
|
|
|
init: init,
|
|
push: push,
|
|
finish: finish,
|
|
|
|
sort: sort
|
|
};
|
|
|
|
}
|
|
|
|
function WebGLRenderLists() {
|
|
|
|
var lists = {};
|
|
|
|
function get( scene, camera ) {
|
|
|
|
var hash = scene.id + ',' + camera.id;
|
|
var list = lists[ hash ];
|
|
|
|
if ( list === undefined ) {
|
|
|
|
// console.log( 'THREE.WebGLRenderLists:', hash );
|
|
|
|
list = new WebGLRenderList();
|
|
lists[ hash ] = list;
|
|
|
|
}
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
function dispose() {
|
|
|
|
lists = {};
|
|
|
|
}
|
|
|
|
return {
|
|
get: get,
|
|
dispose: dispose
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {
|
|
|
|
var mode;
|
|
|
|
function setMode( value ) {
|
|
|
|
mode = value;
|
|
|
|
}
|
|
|
|
var type, size;
|
|
|
|
function setIndex( index ) {
|
|
|
|
if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {
|
|
|
|
type = gl.UNSIGNED_INT;
|
|
size = 4;
|
|
|
|
} else if ( index.array instanceof Uint16Array ) {
|
|
|
|
type = gl.UNSIGNED_SHORT;
|
|
size = 2;
|
|
|
|
} else {
|
|
|
|
type = gl.UNSIGNED_BYTE;
|
|
size = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function render( start, count ) {
|
|
|
|
gl.drawElements( mode, count, type, start * size );
|
|
|
|
infoRender.calls ++;
|
|
infoRender.vertices += count;
|
|
|
|
if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;
|
|
|
|
}
|
|
|
|
function renderInstances( geometry, start, count ) {
|
|
|
|
var extension = extensions.get( 'ANGLE_instanced_arrays' );
|
|
|
|
if ( extension === null ) {
|
|
|
|
console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
|
|
return;
|
|
|
|
}
|
|
|
|
extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );
|
|
|
|
infoRender.calls ++;
|
|
infoRender.vertices += count * geometry.maxInstancedCount;
|
|
|
|
if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
this.setMode = setMode;
|
|
this.setIndex = setIndex;
|
|
this.render = render;
|
|
this.renderInstances = renderInstances;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLBufferRenderer( gl, extensions, infoRender ) {
|
|
|
|
var mode;
|
|
|
|
function setMode( value ) {
|
|
|
|
mode = value;
|
|
|
|
}
|
|
|
|
function render( start, count ) {
|
|
|
|
gl.drawArrays( mode, start, count );
|
|
|
|
infoRender.calls ++;
|
|
infoRender.vertices += count;
|
|
|
|
if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;
|
|
|
|
}
|
|
|
|
function renderInstances( geometry, start, count ) {
|
|
|
|
var extension = extensions.get( 'ANGLE_instanced_arrays' );
|
|
|
|
if ( extension === null ) {
|
|
|
|
console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
|
|
return;
|
|
|
|
}
|
|
|
|
var position = geometry.attributes.position;
|
|
|
|
if ( position.isInterleavedBufferAttribute ) {
|
|
|
|
count = position.data.count;
|
|
|
|
extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );
|
|
|
|
} else {
|
|
|
|
extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount );
|
|
|
|
}
|
|
|
|
infoRender.calls ++;
|
|
infoRender.vertices += count * geometry.maxInstancedCount;
|
|
|
|
if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
this.setMode = setMode;
|
|
this.render = render;
|
|
this.renderInstances = renderInstances;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLGeometries( gl, attributes, infoMemory ) {
|
|
|
|
var geometries = {};
|
|
var wireframeAttributes = {};
|
|
|
|
function onGeometryDispose( event ) {
|
|
|
|
var geometry = event.target;
|
|
var buffergeometry = geometries[ geometry.id ];
|
|
|
|
if ( buffergeometry.index !== null ) {
|
|
|
|
attributes.remove( buffergeometry.index );
|
|
|
|
}
|
|
|
|
for ( var name in buffergeometry.attributes ) {
|
|
|
|
attributes.remove( buffergeometry.attributes[ name ] );
|
|
|
|
}
|
|
|
|
geometry.removeEventListener( 'dispose', onGeometryDispose );
|
|
|
|
delete geometries[ geometry.id ];
|
|
|
|
// TODO Remove duplicate code
|
|
|
|
var attribute = wireframeAttributes[ geometry.id ];
|
|
|
|
if ( attribute ) {
|
|
|
|
attributes.remove( attribute );
|
|
delete wireframeAttributes[ geometry.id ];
|
|
|
|
}
|
|
|
|
attribute = wireframeAttributes[ buffergeometry.id ];
|
|
|
|
if ( attribute ) {
|
|
|
|
attributes.remove( attribute );
|
|
delete wireframeAttributes[ buffergeometry.id ];
|
|
|
|
}
|
|
|
|
//
|
|
|
|
infoMemory.geometries --;
|
|
|
|
}
|
|
|
|
function get( object, geometry ) {
|
|
|
|
var buffergeometry = geometries[ geometry.id ];
|
|
|
|
if ( buffergeometry ) return buffergeometry;
|
|
|
|
geometry.addEventListener( 'dispose', onGeometryDispose );
|
|
|
|
if ( geometry.isBufferGeometry ) {
|
|
|
|
buffergeometry = geometry;
|
|
|
|
} else if ( geometry.isGeometry ) {
|
|
|
|
if ( geometry._bufferGeometry === undefined ) {
|
|
|
|
geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
|
|
|
|
}
|
|
|
|
buffergeometry = geometry._bufferGeometry;
|
|
|
|
}
|
|
|
|
geometries[ geometry.id ] = buffergeometry;
|
|
|
|
infoMemory.geometries ++;
|
|
|
|
return buffergeometry;
|
|
|
|
}
|
|
|
|
function update( geometry ) {
|
|
|
|
var index = geometry.index;
|
|
var geometryAttributes = geometry.attributes;
|
|
|
|
if ( index !== null ) {
|
|
|
|
attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
|
|
|
|
}
|
|
|
|
for ( var name in geometryAttributes ) {
|
|
|
|
attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
|
|
|
|
}
|
|
|
|
// morph targets
|
|
|
|
var morphAttributes = geometry.morphAttributes;
|
|
|
|
for ( var name in morphAttributes ) {
|
|
|
|
var array = morphAttributes[ name ];
|
|
|
|
for ( var i = 0, l = array.length; i < l; i ++ ) {
|
|
|
|
attributes.update( array[ i ], gl.ARRAY_BUFFER );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getWireframeAttribute( geometry ) {
|
|
|
|
var attribute = wireframeAttributes[ geometry.id ];
|
|
|
|
if ( attribute ) return attribute;
|
|
|
|
var indices = [];
|
|
|
|
var geometryIndex = geometry.index;
|
|
var geometryAttributes = geometry.attributes;
|
|
|
|
// console.time( 'wireframe' );
|
|
|
|
if ( geometryIndex !== null ) {
|
|
|
|
var array = geometryIndex.array;
|
|
|
|
for ( var i = 0, l = array.length; i < l; i += 3 ) {
|
|
|
|
var a = array[ i + 0 ];
|
|
var b = array[ i + 1 ];
|
|
var c = array[ i + 2 ];
|
|
|
|
indices.push( a, b, b, c, c, a );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var array = geometryAttributes.position.array;
|
|
|
|
for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
|
|
|
|
var a = i + 0;
|
|
var b = i + 1;
|
|
var c = i + 2;
|
|
|
|
indices.push( a, b, b, c, c, a );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// console.timeEnd( 'wireframe' );
|
|
|
|
attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
|
|
|
|
attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );
|
|
|
|
wireframeAttributes[ geometry.id ] = attribute;
|
|
|
|
return attribute;
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
get: get,
|
|
update: update,
|
|
|
|
getWireframeAttribute: getWireframeAttribute
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLLights() {
|
|
|
|
var lights = {};
|
|
|
|
return {
|
|
|
|
get: function ( light ) {
|
|
|
|
if ( lights[ light.id ] !== undefined ) {
|
|
|
|
return lights[ light.id ];
|
|
|
|
}
|
|
|
|
var uniforms;
|
|
|
|
switch ( light.type ) {
|
|
|
|
case 'DirectionalLight':
|
|
uniforms = {
|
|
direction: new Vector3(),
|
|
color: new Color(),
|
|
|
|
shadow: false,
|
|
shadowBias: 0,
|
|
shadowRadius: 1,
|
|
shadowMapSize: new Vector2()
|
|
};
|
|
break;
|
|
|
|
case 'SpotLight':
|
|
uniforms = {
|
|
position: new Vector3(),
|
|
direction: new Vector3(),
|
|
color: new Color(),
|
|
distance: 0,
|
|
coneCos: 0,
|
|
penumbraCos: 0,
|
|
decay: 0,
|
|
|
|
shadow: false,
|
|
shadowBias: 0,
|
|
shadowRadius: 1,
|
|
shadowMapSize: new Vector2()
|
|
};
|
|
break;
|
|
|
|
case 'PointLight':
|
|
uniforms = {
|
|
position: new Vector3(),
|
|
color: new Color(),
|
|
distance: 0,
|
|
decay: 0,
|
|
|
|
shadow: false,
|
|
shadowBias: 0,
|
|
shadowRadius: 1,
|
|
shadowMapSize: new Vector2()
|
|
};
|
|
break;
|
|
|
|
case 'HemisphereLight':
|
|
uniforms = {
|
|
direction: new Vector3(),
|
|
skyColor: new Color(),
|
|
groundColor: new Color()
|
|
};
|
|
break;
|
|
|
|
case 'RectAreaLight':
|
|
uniforms = {
|
|
color: new Color(),
|
|
position: new Vector3(),
|
|
halfWidth: new Vector3(),
|
|
halfHeight: new Vector3()
|
|
// TODO (abelnation): set RectAreaLight shadow uniforms
|
|
};
|
|
break;
|
|
|
|
}
|
|
|
|
lights[ light.id ] = uniforms;
|
|
|
|
return uniforms;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLObjects( gl, geometries, infoRender ) {
|
|
|
|
var updateList = {};
|
|
|
|
function update( object ) {
|
|
|
|
var frame = infoRender.frame;
|
|
|
|
var geometry = object.geometry;
|
|
var buffergeometry = geometries.get( object, geometry );
|
|
|
|
// Update once per frame
|
|
|
|
if ( updateList[ buffergeometry.id ] !== frame ) {
|
|
|
|
if ( geometry.isGeometry ) {
|
|
|
|
buffergeometry.updateFromObject( object );
|
|
|
|
}
|
|
|
|
geometries.update( buffergeometry );
|
|
|
|
updateList[ buffergeometry.id ] = frame;
|
|
|
|
}
|
|
|
|
return buffergeometry;
|
|
|
|
}
|
|
|
|
function clear() {
|
|
|
|
updateList = {};
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
update: update,
|
|
clear: clear
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function addLineNumbers( string ) {
|
|
|
|
var lines = string.split( '\n' );
|
|
|
|
for ( var i = 0; i < lines.length; i ++ ) {
|
|
|
|
lines[ i ] = ( i + 1 ) + ': ' + lines[ i ];
|
|
|
|
}
|
|
|
|
return lines.join( '\n' );
|
|
|
|
}
|
|
|
|
function WebGLShader( gl, type, string ) {
|
|
|
|
var shader = gl.createShader( type );
|
|
|
|
gl.shaderSource( shader, string );
|
|
gl.compileShader( shader );
|
|
|
|
if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
|
|
|
|
console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' );
|
|
|
|
}
|
|
|
|
if ( gl.getShaderInfoLog( shader ) !== '' ) {
|
|
|
|
console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );
|
|
|
|
}
|
|
|
|
// --enable-privileged-webgl-extension
|
|
// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );
|
|
|
|
return shader;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
var programIdCount = 0;
|
|
|
|
function getEncodingComponents( encoding ) {
|
|
|
|
switch ( encoding ) {
|
|
|
|
case LinearEncoding:
|
|
return [ 'Linear','( value )' ];
|
|
case sRGBEncoding:
|
|
return [ 'sRGB','( value )' ];
|
|
case RGBEEncoding:
|
|
return [ 'RGBE','( value )' ];
|
|
case RGBM7Encoding:
|
|
return [ 'RGBM','( value, 7.0 )' ];
|
|
case RGBM16Encoding:
|
|
return [ 'RGBM','( value, 16.0 )' ];
|
|
case RGBDEncoding:
|
|
return [ 'RGBD','( value, 256.0 )' ];
|
|
case GammaEncoding:
|
|
return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];
|
|
default:
|
|
throw new Error( 'unsupported encoding: ' + encoding );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getTexelDecodingFunction( functionName, encoding ) {
|
|
|
|
var components = getEncodingComponents( encoding );
|
|
return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }";
|
|
|
|
}
|
|
|
|
function getTexelEncodingFunction( functionName, encoding ) {
|
|
|
|
var components = getEncodingComponents( encoding );
|
|
return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }";
|
|
|
|
}
|
|
|
|
function getToneMappingFunction( functionName, toneMapping ) {
|
|
|
|
var toneMappingName;
|
|
|
|
switch ( toneMapping ) {
|
|
|
|
case LinearToneMapping:
|
|
toneMappingName = "Linear";
|
|
break;
|
|
|
|
case ReinhardToneMapping:
|
|
toneMappingName = "Reinhard";
|
|
break;
|
|
|
|
case Uncharted2ToneMapping:
|
|
toneMappingName = "Uncharted2";
|
|
break;
|
|
|
|
case CineonToneMapping:
|
|
toneMappingName = "OptimizedCineon";
|
|
break;
|
|
|
|
default:
|
|
throw new Error( 'unsupported toneMapping: ' + toneMapping );
|
|
|
|
}
|
|
|
|
return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }";
|
|
|
|
}
|
|
|
|
function generateExtensions( extensions, parameters, rendererExtensions ) {
|
|
|
|
extensions = extensions || {};
|
|
|
|
var chunks = [
|
|
( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',
|
|
( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',
|
|
( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',
|
|
( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''
|
|
];
|
|
|
|
return chunks.filter( filterEmptyLine ).join( '\n' );
|
|
|
|
}
|
|
|
|
function generateDefines( defines ) {
|
|
|
|
var chunks = [];
|
|
|
|
for ( var name in defines ) {
|
|
|
|
var value = defines[ name ];
|
|
|
|
if ( value === false ) continue;
|
|
|
|
chunks.push( '#define ' + name + ' ' + value );
|
|
|
|
}
|
|
|
|
return chunks.join( '\n' );
|
|
|
|
}
|
|
|
|
function fetchAttributeLocations( gl, program, identifiers ) {
|
|
|
|
var attributes = {};
|
|
|
|
var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
|
|
|
|
for ( var i = 0; i < n; i ++ ) {
|
|
|
|
var info = gl.getActiveAttrib( program, i );
|
|
var name = info.name;
|
|
|
|
// console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i );
|
|
|
|
attributes[ name ] = gl.getAttribLocation( program, name );
|
|
|
|
}
|
|
|
|
return attributes;
|
|
|
|
}
|
|
|
|
function filterEmptyLine( string ) {
|
|
|
|
return string !== '';
|
|
|
|
}
|
|
|
|
function replaceLightNums( string, parameters ) {
|
|
|
|
return string
|
|
.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )
|
|
.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )
|
|
.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )
|
|
.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )
|
|
.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );
|
|
|
|
}
|
|
|
|
function parseIncludes( string ) {
|
|
|
|
var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm;
|
|
|
|
function replace( match, include ) {
|
|
|
|
var replace = ShaderChunk[ include ];
|
|
|
|
if ( replace === undefined ) {
|
|
|
|
throw new Error( 'Can not resolve #include <' + include + '>' );
|
|
|
|
}
|
|
|
|
return parseIncludes( replace );
|
|
|
|
}
|
|
|
|
return string.replace( pattern, replace );
|
|
|
|
}
|
|
|
|
function unrollLoops( string ) {
|
|
|
|
var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
|
|
|
|
function replace( match, start, end, snippet ) {
|
|
|
|
var unroll = '';
|
|
|
|
for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {
|
|
|
|
unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' );
|
|
|
|
}
|
|
|
|
return unroll;
|
|
|
|
}
|
|
|
|
return string.replace( pattern, replace );
|
|
|
|
}
|
|
|
|
function WebGLProgram( renderer, code, material, parameters ) {
|
|
|
|
var gl = renderer.context;
|
|
|
|
var extensions = material.extensions;
|
|
var defines = material.defines;
|
|
|
|
var vertexShader = material.__webglShader.vertexShader;
|
|
var fragmentShader = material.__webglShader.fragmentShader;
|
|
|
|
var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
|
|
|
|
if ( parameters.shadowMapType === PCFShadowMap ) {
|
|
|
|
shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
|
|
|
|
} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
|
|
|
|
shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
|
|
|
|
}
|
|
|
|
var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
|
|
var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
|
|
if ( parameters.envMap ) {
|
|
|
|
switch ( material.envMap.mapping ) {
|
|
|
|
case CubeReflectionMapping:
|
|
case CubeRefractionMapping:
|
|
envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
|
|
break;
|
|
|
|
case CubeUVReflectionMapping:
|
|
case CubeUVRefractionMapping:
|
|
envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
|
|
break;
|
|
|
|
case EquirectangularReflectionMapping:
|
|
case EquirectangularRefractionMapping:
|
|
envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';
|
|
break;
|
|
|
|
case SphericalReflectionMapping:
|
|
envMapTypeDefine = 'ENVMAP_TYPE_SPHERE';
|
|
break;
|
|
|
|
}
|
|
|
|
switch ( material.envMap.mapping ) {
|
|
|
|
case CubeRefractionMapping:
|
|
case EquirectangularRefractionMapping:
|
|
envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
|
|
break;
|
|
|
|
}
|
|
|
|
switch ( material.combine ) {
|
|
|
|
case MultiplyOperation:
|
|
envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
|
|
break;
|
|
|
|
case MixOperation:
|
|
envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
|
|
break;
|
|
|
|
case AddOperation:
|
|
envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
|
|
|
|
// console.log( 'building new program ' );
|
|
|
|
//
|
|
|
|
var customExtensions = generateExtensions( extensions, parameters, renderer.extensions );
|
|
|
|
var customDefines = generateDefines( defines );
|
|
|
|
//
|
|
|
|
var program = gl.createProgram();
|
|
|
|
var prefixVertex, prefixFragment;
|
|
|
|
if ( material.isRawShaderMaterial ) {
|
|
|
|
prefixVertex = [
|
|
|
|
customDefines,
|
|
|
|
'\n'
|
|
|
|
].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
prefixFragment = [
|
|
|
|
customExtensions,
|
|
customDefines,
|
|
|
|
'\n'
|
|
|
|
].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
} else {
|
|
|
|
prefixVertex = [
|
|
|
|
'precision ' + parameters.precision + ' float;',
|
|
'precision ' + parameters.precision + ' int;',
|
|
|
|
'#define SHADER_NAME ' + material.__webglShader.name,
|
|
|
|
customDefines,
|
|
|
|
parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
|
|
|
|
'#define GAMMA_FACTOR ' + gammaFactorDefine,
|
|
|
|
'#define MAX_BONES ' + parameters.maxBones,
|
|
( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
|
|
( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
|
|
|
|
parameters.map ? '#define USE_MAP' : '',
|
|
parameters.envMap ? '#define USE_ENVMAP' : '',
|
|
parameters.envMap ? '#define ' + envMapModeDefine : '',
|
|
parameters.lightMap ? '#define USE_LIGHTMAP' : '',
|
|
parameters.aoMap ? '#define USE_AOMAP' : '',
|
|
parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
|
|
parameters.bumpMap ? '#define USE_BUMPMAP' : '',
|
|
parameters.normalMap ? '#define USE_NORMALMAP' : '',
|
|
parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
|
|
parameters.specularMap ? '#define USE_SPECULARMAP' : '',
|
|
parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
|
|
parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
|
|
parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
|
|
parameters.vertexColors ? '#define USE_COLOR' : '',
|
|
|
|
parameters.flatShading ? '#define FLAT_SHADED' : '',
|
|
|
|
parameters.skinning ? '#define USE_SKINNING' : '',
|
|
parameters.useVertexTexture ? '#define BONE_TEXTURE' : '',
|
|
|
|
parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
|
|
parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
|
|
parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
|
|
'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,
|
|
|
|
parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
|
|
parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
|
|
|
|
parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
|
|
|
|
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
|
|
'uniform mat4 modelMatrix;',
|
|
'uniform mat4 modelViewMatrix;',
|
|
'uniform mat4 projectionMatrix;',
|
|
'uniform mat4 viewMatrix;',
|
|
'uniform mat3 normalMatrix;',
|
|
'uniform vec3 cameraPosition;',
|
|
|
|
'attribute vec3 position;',
|
|
'attribute vec3 normal;',
|
|
'attribute vec2 uv;',
|
|
|
|
'#ifdef USE_COLOR',
|
|
|
|
' attribute vec3 color;',
|
|
|
|
'#endif',
|
|
|
|
'#ifdef USE_MORPHTARGETS',
|
|
|
|
' attribute vec3 morphTarget0;',
|
|
' attribute vec3 morphTarget1;',
|
|
' attribute vec3 morphTarget2;',
|
|
' attribute vec3 morphTarget3;',
|
|
|
|
' #ifdef USE_MORPHNORMALS',
|
|
|
|
' attribute vec3 morphNormal0;',
|
|
' attribute vec3 morphNormal1;',
|
|
' attribute vec3 morphNormal2;',
|
|
' attribute vec3 morphNormal3;',
|
|
|
|
' #else',
|
|
|
|
' attribute vec3 morphTarget4;',
|
|
' attribute vec3 morphTarget5;',
|
|
' attribute vec3 morphTarget6;',
|
|
' attribute vec3 morphTarget7;',
|
|
|
|
' #endif',
|
|
|
|
'#endif',
|
|
|
|
'#ifdef USE_SKINNING',
|
|
|
|
' attribute vec4 skinIndex;',
|
|
' attribute vec4 skinWeight;',
|
|
|
|
'#endif',
|
|
|
|
'\n'
|
|
|
|
].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
prefixFragment = [
|
|
|
|
customExtensions,
|
|
|
|
'precision ' + parameters.precision + ' float;',
|
|
'precision ' + parameters.precision + ' int;',
|
|
|
|
'#define SHADER_NAME ' + material.__webglShader.name,
|
|
|
|
customDefines,
|
|
|
|
parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',
|
|
|
|
'#define GAMMA_FACTOR ' + gammaFactorDefine,
|
|
|
|
( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
|
|
( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
|
|
|
|
parameters.map ? '#define USE_MAP' : '',
|
|
parameters.envMap ? '#define USE_ENVMAP' : '',
|
|
parameters.envMap ? '#define ' + envMapTypeDefine : '',
|
|
parameters.envMap ? '#define ' + envMapModeDefine : '',
|
|
parameters.envMap ? '#define ' + envMapBlendingDefine : '',
|
|
parameters.lightMap ? '#define USE_LIGHTMAP' : '',
|
|
parameters.aoMap ? '#define USE_AOMAP' : '',
|
|
parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
|
|
parameters.bumpMap ? '#define USE_BUMPMAP' : '',
|
|
parameters.normalMap ? '#define USE_NORMALMAP' : '',
|
|
parameters.specularMap ? '#define USE_SPECULARMAP' : '',
|
|
parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
|
|
parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
|
|
parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
|
|
parameters.vertexColors ? '#define USE_COLOR' : '',
|
|
|
|
parameters.gradientMap ? '#define USE_GRADIENTMAP' : '',
|
|
|
|
parameters.flatShading ? '#define FLAT_SHADED' : '',
|
|
|
|
parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
|
|
'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,
|
|
'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),
|
|
|
|
parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
|
|
parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
|
|
|
|
parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '',
|
|
|
|
parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '',
|
|
|
|
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
|
|
parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',
|
|
|
|
'uniform mat4 viewMatrix;',
|
|
'uniform vec3 cameraPosition;',
|
|
|
|
( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '',
|
|
( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below
|
|
( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '',
|
|
|
|
parameters.dithering ? '#define DITHERING' : '',
|
|
|
|
( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below
|
|
parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
|
|
parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
|
|
parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',
|
|
parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '',
|
|
|
|
parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '',
|
|
|
|
'\n'
|
|
|
|
].filter( filterEmptyLine ).join( '\n' );
|
|
|
|
}
|
|
|
|
vertexShader = parseIncludes( vertexShader, parameters );
|
|
vertexShader = replaceLightNums( vertexShader, parameters );
|
|
|
|
fragmentShader = parseIncludes( fragmentShader, parameters );
|
|
fragmentShader = replaceLightNums( fragmentShader, parameters );
|
|
|
|
if ( ! material.isShaderMaterial ) {
|
|
|
|
vertexShader = unrollLoops( vertexShader );
|
|
fragmentShader = unrollLoops( fragmentShader );
|
|
|
|
}
|
|
|
|
var vertexGlsl = prefixVertex + vertexShader;
|
|
var fragmentGlsl = prefixFragment + fragmentShader;
|
|
|
|
// console.log( '*VERTEX*', vertexGlsl );
|
|
// console.log( '*FRAGMENT*', fragmentGlsl );
|
|
|
|
var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
|
|
var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
|
|
|
|
gl.attachShader( program, glVertexShader );
|
|
gl.attachShader( program, glFragmentShader );
|
|
|
|
// Force a particular attribute to index 0.
|
|
|
|
if ( material.index0AttributeName !== undefined ) {
|
|
|
|
gl.bindAttribLocation( program, 0, material.index0AttributeName );
|
|
|
|
} else if ( parameters.morphTargets === true ) {
|
|
|
|
// programs with morphTargets displace position out of attribute 0
|
|
gl.bindAttribLocation( program, 0, 'position' );
|
|
|
|
}
|
|
|
|
gl.linkProgram( program );
|
|
|
|
var programLog = gl.getProgramInfoLog( program );
|
|
var vertexLog = gl.getShaderInfoLog( glVertexShader );
|
|
var fragmentLog = gl.getShaderInfoLog( glFragmentShader );
|
|
|
|
var runnable = true;
|
|
var haveDiagnostics = true;
|
|
|
|
// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
|
|
// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
|
|
|
|
if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
|
|
|
|
runnable = false;
|
|
|
|
console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
|
|
|
|
} else if ( programLog !== '' ) {
|
|
|
|
console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
|
|
|
|
} else if ( vertexLog === '' || fragmentLog === '' ) {
|
|
|
|
haveDiagnostics = false;
|
|
|
|
}
|
|
|
|
if ( haveDiagnostics ) {
|
|
|
|
this.diagnostics = {
|
|
|
|
runnable: runnable,
|
|
material: material,
|
|
|
|
programLog: programLog,
|
|
|
|
vertexShader: {
|
|
|
|
log: vertexLog,
|
|
prefix: prefixVertex
|
|
|
|
},
|
|
|
|
fragmentShader: {
|
|
|
|
log: fragmentLog,
|
|
prefix: prefixFragment
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
// clean up
|
|
|
|
gl.deleteShader( glVertexShader );
|
|
gl.deleteShader( glFragmentShader );
|
|
|
|
// set up caching for uniform locations
|
|
|
|
var cachedUniforms;
|
|
|
|
this.getUniforms = function() {
|
|
|
|
if ( cachedUniforms === undefined ) {
|
|
|
|
cachedUniforms =
|
|
new WebGLUniforms( gl, program, renderer );
|
|
|
|
}
|
|
|
|
return cachedUniforms;
|
|
|
|
};
|
|
|
|
// set up caching for attribute locations
|
|
|
|
var cachedAttributes;
|
|
|
|
this.getAttributes = function() {
|
|
|
|
if ( cachedAttributes === undefined ) {
|
|
|
|
cachedAttributes = fetchAttributeLocations( gl, program );
|
|
|
|
}
|
|
|
|
return cachedAttributes;
|
|
|
|
};
|
|
|
|
// free resource
|
|
|
|
this.destroy = function() {
|
|
|
|
gl.deleteProgram( program );
|
|
this.program = undefined;
|
|
|
|
};
|
|
|
|
// DEPRECATED
|
|
|
|
Object.defineProperties( this, {
|
|
|
|
uniforms: {
|
|
get: function() {
|
|
|
|
console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );
|
|
return this.getUniforms();
|
|
|
|
}
|
|
},
|
|
|
|
attributes: {
|
|
get: function() {
|
|
|
|
console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );
|
|
return this.getAttributes();
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
//
|
|
|
|
this.id = programIdCount ++;
|
|
this.code = code;
|
|
this.usedTimes = 1;
|
|
this.program = program;
|
|
this.vertexShader = glVertexShader;
|
|
this.fragmentShader = glFragmentShader;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLPrograms( renderer, capabilities ) {
|
|
|
|
var programs = [];
|
|
|
|
var shaderIDs = {
|
|
MeshDepthMaterial: 'depth',
|
|
MeshNormalMaterial: 'normal',
|
|
MeshBasicMaterial: 'basic',
|
|
MeshLambertMaterial: 'lambert',
|
|
MeshPhongMaterial: 'phong',
|
|
MeshToonMaterial: 'phong',
|
|
MeshStandardMaterial: 'physical',
|
|
MeshPhysicalMaterial: 'physical',
|
|
LineBasicMaterial: 'basic',
|
|
LineDashedMaterial: 'dashed',
|
|
PointsMaterial: 'points'
|
|
};
|
|
|
|
var parameterNames = [
|
|
"precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding",
|
|
"lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap",
|
|
"roughnessMap", "metalnessMap", "gradientMap",
|
|
"alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp",
|
|
"flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning",
|
|
"maxBones", "useVertexTexture", "morphTargets", "morphNormals",
|
|
"maxMorphTargets", "maxMorphNormals", "premultipliedAlpha",
|
|
"numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights",
|
|
"shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights',
|
|
"alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering"
|
|
];
|
|
|
|
|
|
function allocateBones( object ) {
|
|
|
|
var skeleton = object.skeleton;
|
|
var bones = skeleton.bones;
|
|
|
|
if ( capabilities.floatVertexTextures ) {
|
|
|
|
return 1024;
|
|
|
|
} else {
|
|
|
|
// default for when object is not specified
|
|
// ( for example when prebuilding shader to be used with multiple objects )
|
|
//
|
|
// - leave some extra space for other uniforms
|
|
// - limit here is ANGLE's 254 max uniform vectors
|
|
// (up to 54 should be safe)
|
|
|
|
var nVertexUniforms = capabilities.maxVertexUniforms;
|
|
var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );
|
|
|
|
var maxBones = Math.min( nVertexMatrices, bones.length );
|
|
|
|
if ( maxBones < bones.length ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );
|
|
return 0;
|
|
|
|
}
|
|
|
|
return maxBones;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getTextureEncodingFromMap( map, gammaOverrideLinear ) {
|
|
|
|
var encoding;
|
|
|
|
if ( ! map ) {
|
|
|
|
encoding = LinearEncoding;
|
|
|
|
} else if ( map.isTexture ) {
|
|
|
|
encoding = map.encoding;
|
|
|
|
} else if ( map.isWebGLRenderTarget ) {
|
|
|
|
console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." );
|
|
encoding = map.texture.encoding;
|
|
|
|
}
|
|
|
|
// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.
|
|
if ( encoding === LinearEncoding && gammaOverrideLinear ) {
|
|
|
|
encoding = GammaEncoding;
|
|
|
|
}
|
|
|
|
return encoding;
|
|
|
|
}
|
|
|
|
this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {
|
|
|
|
var shaderID = shaderIDs[ material.type ];
|
|
|
|
// heuristics to create shader parameters according to lights in the scene
|
|
// (not to blow over maxLights budget)
|
|
|
|
var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;
|
|
var precision = renderer.getPrecision();
|
|
|
|
if ( material.precision !== null ) {
|
|
|
|
precision = capabilities.getMaxPrecision( material.precision );
|
|
|
|
if ( precision !== material.precision ) {
|
|
|
|
console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var currentRenderTarget = renderer.getRenderTarget();
|
|
|
|
var parameters = {
|
|
|
|
shaderID: shaderID,
|
|
|
|
precision: precision,
|
|
supportsVertexTextures: capabilities.vertexTextures,
|
|
outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),
|
|
map: !! material.map,
|
|
mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),
|
|
envMap: !! material.envMap,
|
|
envMapMode: material.envMap && material.envMap.mapping,
|
|
envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),
|
|
envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),
|
|
lightMap: !! material.lightMap,
|
|
aoMap: !! material.aoMap,
|
|
emissiveMap: !! material.emissiveMap,
|
|
emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),
|
|
bumpMap: !! material.bumpMap,
|
|
normalMap: !! material.normalMap,
|
|
displacementMap: !! material.displacementMap,
|
|
roughnessMap: !! material.roughnessMap,
|
|
metalnessMap: !! material.metalnessMap,
|
|
specularMap: !! material.specularMap,
|
|
alphaMap: !! material.alphaMap,
|
|
|
|
gradientMap: !! material.gradientMap,
|
|
|
|
combine: material.combine,
|
|
|
|
vertexColors: material.vertexColors,
|
|
|
|
fog: !! fog,
|
|
useFog: material.fog,
|
|
fogExp: ( fog && fog.isFogExp2 ),
|
|
|
|
flatShading: material.shading === FlatShading,
|
|
|
|
sizeAttenuation: material.sizeAttenuation,
|
|
logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,
|
|
|
|
skinning: material.skinning && maxBones > 0,
|
|
maxBones: maxBones,
|
|
useVertexTexture: capabilities.floatVertexTextures,
|
|
|
|
morphTargets: material.morphTargets,
|
|
morphNormals: material.morphNormals,
|
|
maxMorphTargets: renderer.maxMorphTargets,
|
|
maxMorphNormals: renderer.maxMorphNormals,
|
|
|
|
numDirLights: lights.directional.length,
|
|
numPointLights: lights.point.length,
|
|
numSpotLights: lights.spot.length,
|
|
numRectAreaLights: lights.rectArea.length,
|
|
numHemiLights: lights.hemi.length,
|
|
|
|
numClippingPlanes: nClipPlanes,
|
|
numClipIntersection: nClipIntersection,
|
|
|
|
dithering: material.dithering,
|
|
|
|
shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,
|
|
shadowMapType: renderer.shadowMap.type,
|
|
|
|
toneMapping: renderer.toneMapping,
|
|
physicallyCorrectLights: renderer.physicallyCorrectLights,
|
|
|
|
premultipliedAlpha: material.premultipliedAlpha,
|
|
|
|
alphaTest: material.alphaTest,
|
|
doubleSided: material.side === DoubleSide,
|
|
flipSided: material.side === BackSide,
|
|
|
|
depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false
|
|
|
|
};
|
|
|
|
return parameters;
|
|
|
|
};
|
|
|
|
this.getProgramCode = function ( material, parameters ) {
|
|
|
|
var array = [];
|
|
|
|
if ( parameters.shaderID ) {
|
|
|
|
array.push( parameters.shaderID );
|
|
|
|
} else {
|
|
|
|
array.push( material.fragmentShader );
|
|
array.push( material.vertexShader );
|
|
|
|
}
|
|
|
|
if ( material.defines !== undefined ) {
|
|
|
|
for ( var name in material.defines ) {
|
|
|
|
array.push( name );
|
|
array.push( material.defines[ name ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( var i = 0; i < parameterNames.length; i ++ ) {
|
|
|
|
array.push( parameters[ parameterNames[ i ] ] );
|
|
|
|
}
|
|
|
|
return array.join();
|
|
|
|
};
|
|
|
|
this.acquireProgram = function ( material, parameters, code ) {
|
|
|
|
var program;
|
|
|
|
// Check if code has been already compiled
|
|
for ( var p = 0, pl = programs.length; p < pl; p ++ ) {
|
|
|
|
var programInfo = programs[ p ];
|
|
|
|
if ( programInfo.code === code ) {
|
|
|
|
program = programInfo;
|
|
++ program.usedTimes;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( program === undefined ) {
|
|
|
|
program = new WebGLProgram( renderer, code, material, parameters );
|
|
programs.push( program );
|
|
|
|
}
|
|
|
|
return program;
|
|
|
|
};
|
|
|
|
this.releaseProgram = function ( program ) {
|
|
|
|
if ( -- program.usedTimes === 0 ) {
|
|
|
|
// Remove from unordered set
|
|
var i = programs.indexOf( program );
|
|
programs[ i ] = programs[ programs.length - 1 ];
|
|
programs.pop();
|
|
|
|
// Free WebGL resources
|
|
program.destroy();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
// Exposed for resource monitoring & error feedback via renderer.info:
|
|
this.programs = programs;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, infoMemory ) {
|
|
|
|
var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );
|
|
|
|
//
|
|
|
|
function clampToMaxSize( image, maxSize ) {
|
|
|
|
if ( image.width > maxSize || image.height > maxSize ) {
|
|
|
|
// Warning: Scaling through the canvas will only work with images that use
|
|
// premultiplied alpha.
|
|
|
|
var scale = maxSize / Math.max( image.width, image.height );
|
|
|
|
var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
|
|
canvas.width = Math.floor( image.width * scale );
|
|
canvas.height = Math.floor( image.height * scale );
|
|
|
|
var context = canvas.getContext( '2d' );
|
|
context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );
|
|
|
|
console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );
|
|
|
|
return canvas;
|
|
|
|
}
|
|
|
|
return image;
|
|
|
|
}
|
|
|
|
function isPowerOfTwo( image ) {
|
|
|
|
return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );
|
|
|
|
}
|
|
|
|
function makePowerOfTwo( image ) {
|
|
|
|
if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {
|
|
|
|
var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
|
|
canvas.width = _Math.nearestPowerOfTwo( image.width );
|
|
canvas.height = _Math.nearestPowerOfTwo( image.height );
|
|
|
|
var context = canvas.getContext( '2d' );
|
|
context.drawImage( image, 0, 0, canvas.width, canvas.height );
|
|
|
|
console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );
|
|
|
|
return canvas;
|
|
|
|
}
|
|
|
|
return image;
|
|
|
|
}
|
|
|
|
function textureNeedsPowerOfTwo( texture ) {
|
|
|
|
return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||
|
|
( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );
|
|
|
|
}
|
|
|
|
// Fallback filters for non-power-of-2 textures
|
|
|
|
function filterFallback( f ) {
|
|
|
|
if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {
|
|
|
|
return _gl.NEAREST;
|
|
|
|
}
|
|
|
|
return _gl.LINEAR;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function onTextureDispose( event ) {
|
|
|
|
var texture = event.target;
|
|
|
|
texture.removeEventListener( 'dispose', onTextureDispose );
|
|
|
|
deallocateTexture( texture );
|
|
|
|
infoMemory.textures --;
|
|
|
|
|
|
}
|
|
|
|
function onRenderTargetDispose( event ) {
|
|
|
|
var renderTarget = event.target;
|
|
|
|
renderTarget.removeEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
deallocateRenderTarget( renderTarget );
|
|
|
|
infoMemory.textures --;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function deallocateTexture( texture ) {
|
|
|
|
var textureProperties = properties.get( texture );
|
|
|
|
if ( texture.image && textureProperties.__image__webglTextureCube ) {
|
|
|
|
// cube texture
|
|
|
|
_gl.deleteTexture( textureProperties.__image__webglTextureCube );
|
|
|
|
} else {
|
|
|
|
// 2D texture
|
|
|
|
if ( textureProperties.__webglInit === undefined ) return;
|
|
|
|
_gl.deleteTexture( textureProperties.__webglTexture );
|
|
|
|
}
|
|
|
|
// remove all webgl properties
|
|
properties.remove( texture );
|
|
|
|
}
|
|
|
|
function deallocateRenderTarget( renderTarget ) {
|
|
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
if ( ! renderTarget ) return;
|
|
|
|
if ( textureProperties.__webglTexture !== undefined ) {
|
|
|
|
_gl.deleteTexture( textureProperties.__webglTexture );
|
|
|
|
}
|
|
|
|
if ( renderTarget.depthTexture ) {
|
|
|
|
renderTarget.depthTexture.dispose();
|
|
|
|
}
|
|
|
|
if ( renderTarget.isWebGLRenderTargetCube ) {
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
|
|
if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
|
|
if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
|
|
|
|
}
|
|
|
|
properties.remove( renderTarget.texture );
|
|
properties.remove( renderTarget );
|
|
|
|
}
|
|
|
|
//
|
|
|
|
|
|
|
|
function setTexture2D( texture, slot ) {
|
|
|
|
var textureProperties = properties.get( texture );
|
|
|
|
if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
|
|
|
|
var image = texture.image;
|
|
|
|
if ( image === undefined ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );
|
|
|
|
} else if ( image.complete === false ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );
|
|
|
|
} else {
|
|
|
|
uploadTexture( textureProperties, texture, slot );
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
|
}
|
|
|
|
function setTextureCube( texture, slot ) {
|
|
|
|
var textureProperties = properties.get( texture );
|
|
|
|
if ( texture.image.length === 6 ) {
|
|
|
|
if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
|
|
|
|
if ( ! textureProperties.__image__webglTextureCube ) {
|
|
|
|
texture.addEventListener( 'dispose', onTextureDispose );
|
|
|
|
textureProperties.__image__webglTextureCube = _gl.createTexture();
|
|
|
|
infoMemory.textures ++;
|
|
|
|
}
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
|
|
|
|
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
|
|
|
|
var isCompressed = ( texture && texture.isCompressedTexture );
|
|
var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );
|
|
|
|
var cubeImage = [];
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
if ( ! isCompressed && ! isDataTexture ) {
|
|
|
|
cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );
|
|
|
|
} else {
|
|
|
|
cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var image = cubeImage[ 0 ],
|
|
isPowerOfTwoImage = isPowerOfTwo( image ),
|
|
glFormat = paramThreeToGL( texture.format ),
|
|
glType = paramThreeToGL( texture.type );
|
|
|
|
setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
if ( ! isCompressed ) {
|
|
|
|
if ( isDataTexture ) {
|
|
|
|
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
|
|
|
|
} else {
|
|
|
|
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var mipmap, mipmaps = cubeImage[ i ].mipmaps;
|
|
|
|
for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {
|
|
|
|
mipmap = mipmaps[ j ];
|
|
|
|
if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
|
|
|
|
if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
|
|
|
|
state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
|
|
|
|
} else {
|
|
|
|
console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( texture.generateMipmaps && isPowerOfTwoImage ) {
|
|
|
|
_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
|
|
}
|
|
|
|
textureProperties.__version = texture.version;
|
|
|
|
if ( texture.onUpdate ) texture.onUpdate( texture );
|
|
|
|
} else {
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setTextureCubeDynamic( texture, slot ) {
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );
|
|
|
|
}
|
|
|
|
function setTextureParameters( textureType, texture, isPowerOfTwoImage ) {
|
|
|
|
var extension;
|
|
|
|
if ( isPowerOfTwoImage ) {
|
|
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );
|
|
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );
|
|
|
|
} else {
|
|
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
|
|
|
|
if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );
|
|
|
|
}
|
|
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );
|
|
_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );
|
|
|
|
if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
extension = extensions.get( 'EXT_texture_filter_anisotropic' );
|
|
|
|
if ( extension ) {
|
|
|
|
if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;
|
|
if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;
|
|
|
|
if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {
|
|
|
|
_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );
|
|
properties.get( texture ).__currentAnisotropy = texture.anisotropy;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function uploadTexture( textureProperties, texture, slot ) {
|
|
|
|
if ( textureProperties.__webglInit === undefined ) {
|
|
|
|
textureProperties.__webglInit = true;
|
|
|
|
texture.addEventListener( 'dispose', onTextureDispose );
|
|
|
|
textureProperties.__webglTexture = _gl.createTexture();
|
|
|
|
infoMemory.textures ++;
|
|
|
|
}
|
|
|
|
state.activeTexture( _gl.TEXTURE0 + slot );
|
|
state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
|
|
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
|
|
_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
|
|
_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
|
|
|
|
var image = clampToMaxSize( texture.image, capabilities.maxTextureSize );
|
|
|
|
if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {
|
|
|
|
image = makePowerOfTwo( image );
|
|
|
|
}
|
|
|
|
var isPowerOfTwoImage = isPowerOfTwo( image ),
|
|
glFormat = paramThreeToGL( texture.format ),
|
|
glType = paramThreeToGL( texture.type );
|
|
|
|
setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );
|
|
|
|
var mipmap, mipmaps = texture.mipmaps;
|
|
|
|
if ( texture.isDepthTexture ) {
|
|
|
|
// populate depth texture with dummy data
|
|
|
|
var internalFormat = _gl.DEPTH_COMPONENT;
|
|
|
|
if ( texture.type === FloatType ) {
|
|
|
|
if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');
|
|
internalFormat = _gl.DEPTH_COMPONENT32F;
|
|
|
|
} else if ( _isWebGL2 ) {
|
|
|
|
// WebGL 2.0 requires signed internalformat for glTexImage2D
|
|
internalFormat = _gl.DEPTH_COMPONENT16;
|
|
|
|
}
|
|
|
|
if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {
|
|
|
|
// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
|
|
// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
|
|
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
|
|
if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );
|
|
|
|
texture.type = UnsignedShortType;
|
|
glType = paramThreeToGL( texture.type );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Depth stencil textures need the DEPTH_STENCIL internal format
|
|
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
|
|
if ( texture.format === DepthStencilFormat ) {
|
|
|
|
internalFormat = _gl.DEPTH_STENCIL;
|
|
|
|
// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
|
|
// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
|
|
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
|
|
if ( texture.type !== UnsignedInt248Type ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );
|
|
|
|
texture.type = UnsignedInt248Type;
|
|
glType = paramThreeToGL( texture.type );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );
|
|
|
|
} else if ( texture.isDataTexture ) {
|
|
|
|
// use manually created mipmaps if available
|
|
// if there are no manual mipmaps
|
|
// set 0 level mipmap and then use GL to generate other mipmap levels
|
|
|
|
if ( mipmaps.length > 0 && isPowerOfTwoImage ) {
|
|
|
|
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
|
mipmap = mipmaps[ i ];
|
|
state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
|
}
|
|
|
|
texture.generateMipmaps = false;
|
|
|
|
} else {
|
|
|
|
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
|
|
|
|
}
|
|
|
|
} else if ( texture.isCompressedTexture ) {
|
|
|
|
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
|
mipmap = mipmaps[ i ];
|
|
|
|
if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
|
|
|
|
if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
|
|
|
|
state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
|
|
|
|
} else {
|
|
|
|
console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// regular Texture (image, video, canvas)
|
|
|
|
// use manually created mipmaps if available
|
|
// if there are no manual mipmaps
|
|
// set 0 level mipmap and then use GL to generate other mipmap levels
|
|
|
|
if ( mipmaps.length > 0 && isPowerOfTwoImage ) {
|
|
|
|
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
|
mipmap = mipmaps[ i ];
|
|
state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
|
|
|
|
}
|
|
|
|
texture.generateMipmaps = false;
|
|
|
|
} else {
|
|
|
|
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
|
textureProperties.__version = texture.version;
|
|
|
|
if ( texture.onUpdate ) texture.onUpdate( texture );
|
|
|
|
}
|
|
|
|
// Render targets
|
|
|
|
// Setup storage for target texture and bind it to correct framebuffer
|
|
function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {
|
|
|
|
var glFormat = paramThreeToGL( renderTarget.texture.format );
|
|
var glType = paramThreeToGL( renderTarget.texture.type );
|
|
state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
|
|
|
|
}
|
|
|
|
// Setup storage for internal depth/stencil buffers and bind to correct framebuffer
|
|
function setupRenderBufferStorage( renderbuffer, renderTarget ) {
|
|
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
|
|
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
|
|
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
|
|
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
|
|
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
|
|
|
|
} else {
|
|
|
|
// FIXME: We don't support !depth !stencil
|
|
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );
|
|
|
|
}
|
|
|
|
_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
|
|
|
|
}
|
|
|
|
// Setup resources for a Depth Texture for a FBO (needs an extension)
|
|
function setupDepthTexture( framebuffer, renderTarget ) {
|
|
|
|
var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );
|
|
if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
|
|
if ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {
|
|
|
|
throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');
|
|
|
|
}
|
|
|
|
// upload an empty depth texture with framebuffer size
|
|
if ( !properties.get( renderTarget.depthTexture ).__webglTexture ||
|
|
renderTarget.depthTexture.image.width !== renderTarget.width ||
|
|
renderTarget.depthTexture.image.height !== renderTarget.height ) {
|
|
renderTarget.depthTexture.image.width = renderTarget.width;
|
|
renderTarget.depthTexture.image.height = renderTarget.height;
|
|
renderTarget.depthTexture.needsUpdate = true;
|
|
}
|
|
|
|
setTexture2D( renderTarget.depthTexture, 0 );
|
|
|
|
var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
|
|
|
|
if ( renderTarget.depthTexture.format === DepthFormat ) {
|
|
|
|
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
|
|
|
|
} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
|
|
|
|
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
|
|
|
|
} else {
|
|
|
|
throw new Error('Unknown depthTexture format')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Setup GL resources for a non-texture depth buffer
|
|
function setupDepthRenderbuffer( renderTarget ) {
|
|
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
var isCube = ( renderTarget.isWebGLRenderTargetCube === true );
|
|
|
|
if ( renderTarget.depthTexture ) {
|
|
|
|
if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');
|
|
|
|
setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );
|
|
|
|
} else {
|
|
|
|
if ( isCube ) {
|
|
|
|
renderTargetProperties.__webglDepthbuffer = [];
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
|
|
renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
|
|
setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
|
|
renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
|
|
setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
|
|
|
|
}
|
|
|
|
// Set up GL resources for the render target
|
|
function setupRenderTarget( renderTarget ) {
|
|
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
var textureProperties = properties.get( renderTarget.texture );
|
|
|
|
renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
|
|
|
|
textureProperties.__webglTexture = _gl.createTexture();
|
|
|
|
infoMemory.textures ++;
|
|
|
|
var isCube = ( renderTarget.isWebGLRenderTargetCube === true );
|
|
var isTargetPowerOfTwo = isPowerOfTwo( renderTarget );
|
|
|
|
// Setup framebuffer
|
|
|
|
if ( isCube ) {
|
|
|
|
renderTargetProperties.__webglFramebuffer = [];
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
|
|
|
|
}
|
|
|
|
// Setup color buffer
|
|
|
|
if ( isCube ) {
|
|
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
|
|
setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );
|
|
|
|
for ( var i = 0; i < 6; i ++ ) {
|
|
|
|
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
|
|
|
|
}
|
|
|
|
if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
|
|
state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
|
|
|
|
} else {
|
|
|
|
state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
|
|
setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
|
|
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
|
|
|
|
if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
state.bindTexture( _gl.TEXTURE_2D, null );
|
|
|
|
}
|
|
|
|
// Setup depth and stencil buffers
|
|
|
|
if ( renderTarget.depthBuffer ) {
|
|
|
|
setupDepthRenderbuffer( renderTarget );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function updateRenderTargetMipmap( renderTarget ) {
|
|
|
|
var texture = renderTarget.texture;
|
|
|
|
if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&
|
|
texture.minFilter !== NearestFilter &&
|
|
texture.minFilter !== LinearFilter ) {
|
|
|
|
var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;
|
|
var webglTexture = properties.get( texture ).__webglTexture;
|
|
|
|
state.bindTexture( target, webglTexture );
|
|
_gl.generateMipmap( target );
|
|
state.bindTexture( target, null );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.setTexture2D = setTexture2D;
|
|
this.setTextureCube = setTextureCube;
|
|
this.setTextureCubeDynamic = setTextureCubeDynamic;
|
|
this.setupRenderTarget = setupRenderTarget;
|
|
this.updateRenderTargetMipmap = updateRenderTargetMipmap;
|
|
|
|
}
|
|
|
|
/**
|
|
* @author fordacious / fordacious.github.io
|
|
*/
|
|
|
|
function WebGLProperties() {
|
|
|
|
var properties = {};
|
|
|
|
function get( object ) {
|
|
|
|
var uuid = object.uuid;
|
|
var map = properties[ uuid ];
|
|
|
|
if ( map === undefined ) {
|
|
|
|
map = {};
|
|
properties[ uuid ] = map;
|
|
|
|
}
|
|
|
|
return map;
|
|
|
|
}
|
|
|
|
function remove( object ) {
|
|
|
|
delete properties[ object.uuid ];
|
|
|
|
}
|
|
|
|
function clear() {
|
|
|
|
properties = {};
|
|
|
|
}
|
|
|
|
return {
|
|
get: get,
|
|
remove: remove,
|
|
clear: clear
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLState( gl, extensions, paramThreeToGL ) {
|
|
|
|
function ColorBuffer() {
|
|
|
|
var locked = false;
|
|
|
|
var color = new Vector4();
|
|
var currentColorMask = null;
|
|
var currentColorClear = new Vector4();
|
|
|
|
return {
|
|
|
|
setMask: function ( colorMask ) {
|
|
|
|
if ( currentColorMask !== colorMask && ! locked ) {
|
|
|
|
gl.colorMask( colorMask, colorMask, colorMask, colorMask );
|
|
currentColorMask = colorMask;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setLocked: function ( lock ) {
|
|
|
|
locked = lock;
|
|
|
|
},
|
|
|
|
setClear: function ( r, g, b, a, premultipliedAlpha ) {
|
|
|
|
if ( premultipliedAlpha === true ) {
|
|
|
|
r *= a; g *= a; b *= a;
|
|
|
|
}
|
|
|
|
color.set( r, g, b, a );
|
|
|
|
if ( currentColorClear.equals( color ) === false ) {
|
|
|
|
gl.clearColor( r, g, b, a );
|
|
currentColorClear.copy( color );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
reset: function () {
|
|
|
|
locked = false;
|
|
|
|
currentColorMask = null;
|
|
currentColorClear.set( 0, 0, 0, 1 );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
function DepthBuffer() {
|
|
|
|
var locked = false;
|
|
|
|
var currentDepthMask = null;
|
|
var currentDepthFunc = null;
|
|
var currentDepthClear = null;
|
|
|
|
return {
|
|
|
|
setTest: function ( depthTest ) {
|
|
|
|
if ( depthTest ) {
|
|
|
|
enable( gl.DEPTH_TEST );
|
|
|
|
} else {
|
|
|
|
disable( gl.DEPTH_TEST );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setMask: function ( depthMask ) {
|
|
|
|
if ( currentDepthMask !== depthMask && ! locked ) {
|
|
|
|
gl.depthMask( depthMask );
|
|
currentDepthMask = depthMask;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setFunc: function ( depthFunc ) {
|
|
|
|
if ( currentDepthFunc !== depthFunc ) {
|
|
|
|
if ( depthFunc ) {
|
|
|
|
switch ( depthFunc ) {
|
|
|
|
case NeverDepth:
|
|
|
|
gl.depthFunc( gl.NEVER );
|
|
break;
|
|
|
|
case AlwaysDepth:
|
|
|
|
gl.depthFunc( gl.ALWAYS );
|
|
break;
|
|
|
|
case LessDepth:
|
|
|
|
gl.depthFunc( gl.LESS );
|
|
break;
|
|
|
|
case LessEqualDepth:
|
|
|
|
gl.depthFunc( gl.LEQUAL );
|
|
break;
|
|
|
|
case EqualDepth:
|
|
|
|
gl.depthFunc( gl.EQUAL );
|
|
break;
|
|
|
|
case GreaterEqualDepth:
|
|
|
|
gl.depthFunc( gl.GEQUAL );
|
|
break;
|
|
|
|
case GreaterDepth:
|
|
|
|
gl.depthFunc( gl.GREATER );
|
|
break;
|
|
|
|
case NotEqualDepth:
|
|
|
|
gl.depthFunc( gl.NOTEQUAL );
|
|
break;
|
|
|
|
default:
|
|
|
|
gl.depthFunc( gl.LEQUAL );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
gl.depthFunc( gl.LEQUAL );
|
|
|
|
}
|
|
|
|
currentDepthFunc = depthFunc;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setLocked: function ( lock ) {
|
|
|
|
locked = lock;
|
|
|
|
},
|
|
|
|
setClear: function ( depth ) {
|
|
|
|
if ( currentDepthClear !== depth ) {
|
|
|
|
gl.clearDepth( depth );
|
|
currentDepthClear = depth;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
reset: function () {
|
|
|
|
locked = false;
|
|
|
|
currentDepthMask = null;
|
|
currentDepthFunc = null;
|
|
currentDepthClear = null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
function StencilBuffer() {
|
|
|
|
var locked = false;
|
|
|
|
var currentStencilMask = null;
|
|
var currentStencilFunc = null;
|
|
var currentStencilRef = null;
|
|
var currentStencilFuncMask = null;
|
|
var currentStencilFail = null;
|
|
var currentStencilZFail = null;
|
|
var currentStencilZPass = null;
|
|
var currentStencilClear = null;
|
|
|
|
return {
|
|
|
|
setTest: function ( stencilTest ) {
|
|
|
|
if ( stencilTest ) {
|
|
|
|
enable( gl.STENCIL_TEST );
|
|
|
|
} else {
|
|
|
|
disable( gl.STENCIL_TEST );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setMask: function ( stencilMask ) {
|
|
|
|
if ( currentStencilMask !== stencilMask && ! locked ) {
|
|
|
|
gl.stencilMask( stencilMask );
|
|
currentStencilMask = stencilMask;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setFunc: function ( stencilFunc, stencilRef, stencilMask ) {
|
|
|
|
if ( currentStencilFunc !== stencilFunc ||
|
|
currentStencilRef !== stencilRef ||
|
|
currentStencilFuncMask !== stencilMask ) {
|
|
|
|
gl.stencilFunc( stencilFunc, stencilRef, stencilMask );
|
|
|
|
currentStencilFunc = stencilFunc;
|
|
currentStencilRef = stencilRef;
|
|
currentStencilFuncMask = stencilMask;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setOp: function ( stencilFail, stencilZFail, stencilZPass ) {
|
|
|
|
if ( currentStencilFail !== stencilFail ||
|
|
currentStencilZFail !== stencilZFail ||
|
|
currentStencilZPass !== stencilZPass ) {
|
|
|
|
gl.stencilOp( stencilFail, stencilZFail, stencilZPass );
|
|
|
|
currentStencilFail = stencilFail;
|
|
currentStencilZFail = stencilZFail;
|
|
currentStencilZPass = stencilZPass;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
setLocked: function ( lock ) {
|
|
|
|
locked = lock;
|
|
|
|
},
|
|
|
|
setClear: function ( stencil ) {
|
|
|
|
if ( currentStencilClear !== stencil ) {
|
|
|
|
gl.clearStencil( stencil );
|
|
currentStencilClear = stencil;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
reset: function () {
|
|
|
|
locked = false;
|
|
|
|
currentStencilMask = null;
|
|
currentStencilFunc = null;
|
|
currentStencilRef = null;
|
|
currentStencilFuncMask = null;
|
|
currentStencilFail = null;
|
|
currentStencilZFail = null;
|
|
currentStencilZPass = null;
|
|
currentStencilClear = null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var colorBuffer = new ColorBuffer();
|
|
var depthBuffer = new DepthBuffer();
|
|
var stencilBuffer = new StencilBuffer();
|
|
|
|
var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
|
|
var newAttributes = new Uint8Array( maxVertexAttributes );
|
|
var enabledAttributes = new Uint8Array( maxVertexAttributes );
|
|
var attributeDivisors = new Uint8Array( maxVertexAttributes );
|
|
|
|
var capabilities = {};
|
|
|
|
var compressedTextureFormats = null;
|
|
|
|
var currentBlending = null;
|
|
var currentBlendEquation = null;
|
|
var currentBlendSrc = null;
|
|
var currentBlendDst = null;
|
|
var currentBlendEquationAlpha = null;
|
|
var currentBlendSrcAlpha = null;
|
|
var currentBlendDstAlpha = null;
|
|
var currentPremultipledAlpha = false;
|
|
|
|
var currentFlipSided = null;
|
|
var currentCullFace = null;
|
|
|
|
var currentLineWidth = null;
|
|
|
|
var currentPolygonOffsetFactor = null;
|
|
var currentPolygonOffsetUnits = null;
|
|
|
|
var currentScissorTest = null;
|
|
|
|
var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
|
|
|
|
var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );
|
|
var lineWidthAvailable = parseFloat( version ) >= 1.0;
|
|
|
|
var currentTextureSlot = null;
|
|
var currentBoundTextures = {};
|
|
|
|
var currentScissor = new Vector4();
|
|
var currentViewport = new Vector4();
|
|
|
|
function createTexture( type, target, count ) {
|
|
|
|
var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.
|
|
var texture = gl.createTexture();
|
|
|
|
gl.bindTexture( type, texture );
|
|
gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
|
|
gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
|
|
|
|
for ( var i = 0; i < count; i ++ ) {
|
|
|
|
gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );
|
|
|
|
}
|
|
|
|
return texture;
|
|
|
|
}
|
|
|
|
var emptyTextures = {};
|
|
emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );
|
|
emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );
|
|
|
|
//
|
|
|
|
function init() {
|
|
|
|
colorBuffer.setClear( 0, 0, 0, 1 );
|
|
depthBuffer.setClear( 1 );
|
|
stencilBuffer.setClear( 0 );
|
|
|
|
enable( gl.DEPTH_TEST );
|
|
depthBuffer.setFunc( LessEqualDepth );
|
|
|
|
setFlipSided( false );
|
|
setCullFace( CullFaceBack );
|
|
enable( gl.CULL_FACE );
|
|
|
|
enable( gl.BLEND );
|
|
setBlending( NormalBlending );
|
|
|
|
}
|
|
|
|
function initAttributes() {
|
|
|
|
for ( var i = 0, l = newAttributes.length; i < l; i ++ ) {
|
|
|
|
newAttributes[ i ] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function enableAttribute( attribute ) {
|
|
|
|
newAttributes[ attribute ] = 1;
|
|
|
|
if ( enabledAttributes[ attribute ] === 0 ) {
|
|
|
|
gl.enableVertexAttribArray( attribute );
|
|
enabledAttributes[ attribute ] = 1;
|
|
|
|
}
|
|
|
|
if ( attributeDivisors[ attribute ] !== 0 ) {
|
|
|
|
var extension = extensions.get( 'ANGLE_instanced_arrays' );
|
|
|
|
extension.vertexAttribDivisorANGLE( attribute, 0 );
|
|
attributeDivisors[ attribute ] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function enableAttributeAndDivisor( attribute, meshPerAttribute ) {
|
|
|
|
newAttributes[ attribute ] = 1;
|
|
|
|
if ( enabledAttributes[ attribute ] === 0 ) {
|
|
|
|
gl.enableVertexAttribArray( attribute );
|
|
enabledAttributes[ attribute ] = 1;
|
|
|
|
}
|
|
|
|
if ( attributeDivisors[ attribute ] !== meshPerAttribute ) {
|
|
|
|
var extension = extensions.get( 'ANGLE_instanced_arrays' );
|
|
|
|
extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );
|
|
attributeDivisors[ attribute ] = meshPerAttribute;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function disableUnusedAttributes() {
|
|
|
|
for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {
|
|
|
|
if ( enabledAttributes[ i ] !== newAttributes[ i ] ) {
|
|
|
|
gl.disableVertexAttribArray( i );
|
|
enabledAttributes[ i ] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function enable( id ) {
|
|
|
|
if ( capabilities[ id ] !== true ) {
|
|
|
|
gl.enable( id );
|
|
capabilities[ id ] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function disable( id ) {
|
|
|
|
if ( capabilities[ id ] !== false ) {
|
|
|
|
gl.disable( id );
|
|
capabilities[ id ] = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getCompressedTextureFormats() {
|
|
|
|
if ( compressedTextureFormats === null ) {
|
|
|
|
compressedTextureFormats = [];
|
|
|
|
if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||
|
|
extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||
|
|
extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {
|
|
|
|
var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );
|
|
|
|
for ( var i = 0; i < formats.length; i ++ ) {
|
|
|
|
compressedTextureFormats.push( formats[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return compressedTextureFormats;
|
|
|
|
}
|
|
|
|
function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {
|
|
|
|
if ( blending !== NoBlending ) {
|
|
|
|
enable( gl.BLEND );
|
|
|
|
} else {
|
|
|
|
disable( gl.BLEND );
|
|
|
|
}
|
|
|
|
if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {
|
|
|
|
if ( blending === AdditiveBlending ) {
|
|
|
|
if ( premultipliedAlpha ) {
|
|
|
|
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
|
|
gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );
|
|
|
|
} else {
|
|
|
|
gl.blendEquation( gl.FUNC_ADD );
|
|
gl.blendFunc( gl.SRC_ALPHA, gl.ONE );
|
|
|
|
}
|
|
|
|
} else if ( blending === SubtractiveBlending ) {
|
|
|
|
if ( premultipliedAlpha ) {
|
|
|
|
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
|
|
gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );
|
|
|
|
} else {
|
|
|
|
gl.blendEquation( gl.FUNC_ADD );
|
|
gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );
|
|
|
|
}
|
|
|
|
} else if ( blending === MultiplyBlending ) {
|
|
|
|
if ( premultipliedAlpha ) {
|
|
|
|
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
|
|
gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );
|
|
|
|
} else {
|
|
|
|
gl.blendEquation( gl.FUNC_ADD );
|
|
gl.blendFunc( gl.ZERO, gl.SRC_COLOR );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( premultipliedAlpha ) {
|
|
|
|
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
|
|
gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
|
|
|
|
} else {
|
|
|
|
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
|
|
gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
currentBlending = blending;
|
|
currentPremultipledAlpha = premultipliedAlpha;
|
|
|
|
}
|
|
|
|
if ( blending === CustomBlending ) {
|
|
|
|
blendEquationAlpha = blendEquationAlpha || blendEquation;
|
|
blendSrcAlpha = blendSrcAlpha || blendSrc;
|
|
blendDstAlpha = blendDstAlpha || blendDst;
|
|
|
|
if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {
|
|
|
|
gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );
|
|
|
|
currentBlendEquation = blendEquation;
|
|
currentBlendEquationAlpha = blendEquationAlpha;
|
|
|
|
}
|
|
|
|
if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {
|
|
|
|
gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );
|
|
|
|
currentBlendSrc = blendSrc;
|
|
currentBlendDst = blendDst;
|
|
currentBlendSrcAlpha = blendSrcAlpha;
|
|
currentBlendDstAlpha = blendDstAlpha;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
currentBlendEquation = null;
|
|
currentBlendSrc = null;
|
|
currentBlendDst = null;
|
|
currentBlendEquationAlpha = null;
|
|
currentBlendSrcAlpha = null;
|
|
currentBlendDstAlpha = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setMaterial( material ) {
|
|
|
|
material.side === DoubleSide
|
|
? disable( gl.CULL_FACE )
|
|
: enable( gl.CULL_FACE );
|
|
|
|
setFlipSided( material.side === BackSide );
|
|
|
|
material.transparent === true
|
|
? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )
|
|
: setBlending( NoBlending );
|
|
|
|
depthBuffer.setFunc( material.depthFunc );
|
|
depthBuffer.setTest( material.depthTest );
|
|
depthBuffer.setMask( material.depthWrite );
|
|
colorBuffer.setMask( material.colorWrite );
|
|
|
|
setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function setFlipSided( flipSided ) {
|
|
|
|
if ( currentFlipSided !== flipSided ) {
|
|
|
|
if ( flipSided ) {
|
|
|
|
gl.frontFace( gl.CW );
|
|
|
|
} else {
|
|
|
|
gl.frontFace( gl.CCW );
|
|
|
|
}
|
|
|
|
currentFlipSided = flipSided;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setCullFace( cullFace ) {
|
|
|
|
if ( cullFace !== CullFaceNone ) {
|
|
|
|
enable( gl.CULL_FACE );
|
|
|
|
if ( cullFace !== currentCullFace ) {
|
|
|
|
if ( cullFace === CullFaceBack ) {
|
|
|
|
gl.cullFace( gl.BACK );
|
|
|
|
} else if ( cullFace === CullFaceFront ) {
|
|
|
|
gl.cullFace( gl.FRONT );
|
|
|
|
} else {
|
|
|
|
gl.cullFace( gl.FRONT_AND_BACK );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
disable( gl.CULL_FACE );
|
|
|
|
}
|
|
|
|
currentCullFace = cullFace;
|
|
|
|
}
|
|
|
|
function setLineWidth( width ) {
|
|
|
|
if ( width !== currentLineWidth ) {
|
|
|
|
if ( lineWidthAvailable ) gl.lineWidth( width );
|
|
|
|
currentLineWidth = width;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function setPolygonOffset( polygonOffset, factor, units ) {
|
|
|
|
if ( polygonOffset ) {
|
|
|
|
enable( gl.POLYGON_OFFSET_FILL );
|
|
|
|
if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {
|
|
|
|
gl.polygonOffset( factor, units );
|
|
|
|
currentPolygonOffsetFactor = factor;
|
|
currentPolygonOffsetUnits = units;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
disable( gl.POLYGON_OFFSET_FILL );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function getScissorTest() {
|
|
|
|
return currentScissorTest;
|
|
|
|
}
|
|
|
|
function setScissorTest( scissorTest ) {
|
|
|
|
currentScissorTest = scissorTest;
|
|
|
|
if ( scissorTest ) {
|
|
|
|
enable( gl.SCISSOR_TEST );
|
|
|
|
} else {
|
|
|
|
disable( gl.SCISSOR_TEST );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// texture
|
|
|
|
function activeTexture( webglSlot ) {
|
|
|
|
if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;
|
|
|
|
if ( currentTextureSlot !== webglSlot ) {
|
|
|
|
gl.activeTexture( webglSlot );
|
|
currentTextureSlot = webglSlot;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function bindTexture( webglType, webglTexture ) {
|
|
|
|
if ( currentTextureSlot === null ) {
|
|
|
|
activeTexture();
|
|
|
|
}
|
|
|
|
var boundTexture = currentBoundTextures[ currentTextureSlot ];
|
|
|
|
if ( boundTexture === undefined ) {
|
|
|
|
boundTexture = { type: undefined, texture: undefined };
|
|
currentBoundTextures[ currentTextureSlot ] = boundTexture;
|
|
|
|
}
|
|
|
|
if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {
|
|
|
|
gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );
|
|
|
|
boundTexture.type = webglType;
|
|
boundTexture.texture = webglTexture;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function compressedTexImage2D() {
|
|
|
|
try {
|
|
|
|
gl.compressedTexImage2D.apply( gl, arguments );
|
|
|
|
} catch ( error ) {
|
|
|
|
console.error( error );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function texImage2D() {
|
|
|
|
try {
|
|
|
|
gl.texImage2D.apply( gl, arguments );
|
|
|
|
} catch ( error ) {
|
|
|
|
console.error( error );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function scissor( scissor ) {
|
|
|
|
if ( currentScissor.equals( scissor ) === false ) {
|
|
|
|
gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );
|
|
currentScissor.copy( scissor );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function viewport( viewport ) {
|
|
|
|
if ( currentViewport.equals( viewport ) === false ) {
|
|
|
|
gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );
|
|
currentViewport.copy( viewport );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function reset() {
|
|
|
|
for ( var i = 0; i < enabledAttributes.length; i ++ ) {
|
|
|
|
if ( enabledAttributes[ i ] === 1 ) {
|
|
|
|
gl.disableVertexAttribArray( i );
|
|
enabledAttributes[ i ] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
capabilities = {};
|
|
|
|
compressedTextureFormats = null;
|
|
|
|
currentTextureSlot = null;
|
|
currentBoundTextures = {};
|
|
|
|
currentBlending = null;
|
|
|
|
currentFlipSided = null;
|
|
currentCullFace = null;
|
|
|
|
colorBuffer.reset();
|
|
depthBuffer.reset();
|
|
stencilBuffer.reset();
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
buffers: {
|
|
color: colorBuffer,
|
|
depth: depthBuffer,
|
|
stencil: stencilBuffer
|
|
},
|
|
|
|
init: init,
|
|
initAttributes: initAttributes,
|
|
enableAttribute: enableAttribute,
|
|
enableAttributeAndDivisor: enableAttributeAndDivisor,
|
|
disableUnusedAttributes: disableUnusedAttributes,
|
|
enable: enable,
|
|
disable: disable,
|
|
getCompressedTextureFormats: getCompressedTextureFormats,
|
|
|
|
setBlending: setBlending,
|
|
setMaterial: setMaterial,
|
|
|
|
setFlipSided: setFlipSided,
|
|
setCullFace: setCullFace,
|
|
|
|
setLineWidth: setLineWidth,
|
|
setPolygonOffset: setPolygonOffset,
|
|
|
|
getScissorTest: getScissorTest,
|
|
setScissorTest: setScissorTest,
|
|
|
|
activeTexture: activeTexture,
|
|
bindTexture: bindTexture,
|
|
compressedTexImage2D: compressedTexImage2D,
|
|
texImage2D: texImage2D,
|
|
|
|
scissor: scissor,
|
|
viewport: viewport,
|
|
|
|
reset: reset
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLCapabilities( gl, extensions, parameters ) {
|
|
|
|
var maxAnisotropy;
|
|
|
|
function getMaxAnisotropy() {
|
|
|
|
if ( maxAnisotropy !== undefined ) return maxAnisotropy;
|
|
|
|
var extension = extensions.get( 'EXT_texture_filter_anisotropic' );
|
|
|
|
if ( extension !== null ) {
|
|
|
|
maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
|
|
|
|
} else {
|
|
|
|
maxAnisotropy = 0;
|
|
|
|
}
|
|
|
|
return maxAnisotropy;
|
|
|
|
}
|
|
|
|
function getMaxPrecision( precision ) {
|
|
|
|
if ( precision === 'highp' ) {
|
|
|
|
if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
|
|
gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {
|
|
|
|
return 'highp';
|
|
|
|
}
|
|
|
|
precision = 'mediump';
|
|
|
|
}
|
|
|
|
if ( precision === 'mediump' ) {
|
|
|
|
if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
|
|
gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {
|
|
|
|
return 'mediump';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 'lowp';
|
|
|
|
}
|
|
|
|
var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
|
|
var maxPrecision = getMaxPrecision( precision );
|
|
|
|
if ( maxPrecision !== precision ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
|
|
precision = maxPrecision;
|
|
|
|
}
|
|
|
|
var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );
|
|
|
|
var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
|
|
var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
|
|
var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
|
|
var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
|
|
|
|
var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
|
|
var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
|
|
var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
|
|
var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
|
|
|
|
var vertexTextures = maxVertexTextures > 0;
|
|
var floatFragmentTextures = !! extensions.get( 'OES_texture_float' );
|
|
var floatVertexTextures = vertexTextures && floatFragmentTextures;
|
|
|
|
return {
|
|
|
|
getMaxAnisotropy: getMaxAnisotropy,
|
|
getMaxPrecision: getMaxPrecision,
|
|
|
|
precision: precision,
|
|
logarithmicDepthBuffer: logarithmicDepthBuffer,
|
|
|
|
maxTextures: maxTextures,
|
|
maxVertexTextures: maxVertexTextures,
|
|
maxTextureSize: maxTextureSize,
|
|
maxCubemapSize: maxCubemapSize,
|
|
|
|
maxAttributes: maxAttributes,
|
|
maxVertexUniforms: maxVertexUniforms,
|
|
maxVaryings: maxVaryings,
|
|
maxFragmentUniforms: maxFragmentUniforms,
|
|
|
|
vertexTextures: vertexTextures,
|
|
floatFragmentTextures: floatFragmentTextures,
|
|
floatVertexTextures: floatVertexTextures
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function WebGLExtensions( gl ) {
|
|
|
|
var extensions = {};
|
|
|
|
return {
|
|
|
|
get: function ( name ) {
|
|
|
|
if ( extensions[ name ] !== undefined ) {
|
|
|
|
return extensions[ name ];
|
|
|
|
}
|
|
|
|
var extension;
|
|
|
|
switch ( name ) {
|
|
|
|
case 'WEBGL_depth_texture':
|
|
extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
|
|
break;
|
|
|
|
case 'EXT_texture_filter_anisotropic':
|
|
extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
|
|
break;
|
|
|
|
case 'WEBGL_compressed_texture_s3tc':
|
|
extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
|
|
break;
|
|
|
|
case 'WEBGL_compressed_texture_pvrtc':
|
|
extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );
|
|
break;
|
|
|
|
case 'WEBGL_compressed_texture_etc1':
|
|
extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );
|
|
break;
|
|
|
|
default:
|
|
extension = gl.getExtension( name );
|
|
|
|
}
|
|
|
|
if ( extension === null ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
|
|
|
|
}
|
|
|
|
extensions[ name ] = extension;
|
|
|
|
return extension;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
/**
|
|
* @author tschw
|
|
*/
|
|
|
|
function WebGLClipping() {
|
|
|
|
var scope = this,
|
|
|
|
globalState = null,
|
|
numGlobalPlanes = 0,
|
|
localClippingEnabled = false,
|
|
renderingShadows = false,
|
|
|
|
plane = new Plane(),
|
|
viewNormalMatrix = new Matrix3(),
|
|
|
|
uniform = { value: null, needsUpdate: false };
|
|
|
|
this.uniform = uniform;
|
|
this.numPlanes = 0;
|
|
this.numIntersection = 0;
|
|
|
|
this.init = function( planes, enableLocalClipping, camera ) {
|
|
|
|
var enabled =
|
|
planes.length !== 0 ||
|
|
enableLocalClipping ||
|
|
// enable state of previous frame - the clipping code has to
|
|
// run another frame in order to reset the state:
|
|
numGlobalPlanes !== 0 ||
|
|
localClippingEnabled;
|
|
|
|
localClippingEnabled = enableLocalClipping;
|
|
|
|
globalState = projectPlanes( planes, camera, 0 );
|
|
numGlobalPlanes = planes.length;
|
|
|
|
return enabled;
|
|
|
|
};
|
|
|
|
this.beginShadows = function() {
|
|
|
|
renderingShadows = true;
|
|
projectPlanes( null );
|
|
|
|
};
|
|
|
|
this.endShadows = function() {
|
|
|
|
renderingShadows = false;
|
|
resetGlobalState();
|
|
|
|
};
|
|
|
|
this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {
|
|
|
|
if ( ! localClippingEnabled ||
|
|
planes === null || planes.length === 0 ||
|
|
renderingShadows && ! clipShadows ) {
|
|
// there's no local clipping
|
|
|
|
if ( renderingShadows ) {
|
|
// there's no global clipping
|
|
|
|
projectPlanes( null );
|
|
|
|
} else {
|
|
|
|
resetGlobalState();
|
|
}
|
|
|
|
} else {
|
|
|
|
var nGlobal = renderingShadows ? 0 : numGlobalPlanes,
|
|
lGlobal = nGlobal * 4,
|
|
|
|
dstArray = cache.clippingState || null;
|
|
|
|
uniform.value = dstArray; // ensure unique state
|
|
|
|
dstArray = projectPlanes( planes, camera, lGlobal, fromCache );
|
|
|
|
for ( var i = 0; i !== lGlobal; ++ i ) {
|
|
|
|
dstArray[ i ] = globalState[ i ];
|
|
|
|
}
|
|
|
|
cache.clippingState = dstArray;
|
|
this.numIntersection = clipIntersection ? this.numPlanes : 0;
|
|
this.numPlanes += nGlobal;
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
function resetGlobalState() {
|
|
|
|
if ( uniform.value !== globalState ) {
|
|
|
|
uniform.value = globalState;
|
|
uniform.needsUpdate = numGlobalPlanes > 0;
|
|
|
|
}
|
|
|
|
scope.numPlanes = numGlobalPlanes;
|
|
scope.numIntersection = 0;
|
|
|
|
}
|
|
|
|
function projectPlanes( planes, camera, dstOffset, skipTransform ) {
|
|
|
|
var nPlanes = planes !== null ? planes.length : 0,
|
|
dstArray = null;
|
|
|
|
if ( nPlanes !== 0 ) {
|
|
|
|
dstArray = uniform.value;
|
|
|
|
if ( skipTransform !== true || dstArray === null ) {
|
|
|
|
var flatSize = dstOffset + nPlanes * 4,
|
|
viewMatrix = camera.matrixWorldInverse;
|
|
|
|
viewNormalMatrix.getNormalMatrix( viewMatrix );
|
|
|
|
if ( dstArray === null || dstArray.length < flatSize ) {
|
|
|
|
dstArray = new Float32Array( flatSize );
|
|
|
|
}
|
|
|
|
for ( var i = 0, i4 = dstOffset;
|
|
i !== nPlanes; ++ i, i4 += 4 ) {
|
|
|
|
plane.copy( planes[ i ] ).
|
|
applyMatrix4( viewMatrix, viewNormalMatrix );
|
|
|
|
plane.normal.toArray( dstArray, i4 );
|
|
dstArray[ i4 + 3 ] = plane.constant;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
uniform.value = dstArray;
|
|
uniform.needsUpdate = true;
|
|
|
|
}
|
|
|
|
scope.numPlanes = nPlanes;
|
|
|
|
return dstArray;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// import { Sphere } from '../math/Sphere';
|
|
/**
|
|
* @author supereggbert / http://www.paulbrunt.co.uk/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author szimek / https://github.com/szimek/
|
|
* @author tschw
|
|
*/
|
|
|
|
function WebGLRenderer( parameters ) {
|
|
|
|
console.log( 'THREE.WebGLRenderer', REVISION );
|
|
|
|
parameters = parameters || {};
|
|
|
|
var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),
|
|
_context = parameters.context !== undefined ? parameters.context : null,
|
|
|
|
_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
|
|
_depth = parameters.depth !== undefined ? parameters.depth : true,
|
|
_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
|
|
_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
|
|
_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
|
|
_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
|
|
|
|
var lights = [];
|
|
|
|
var currentRenderList = null;
|
|
|
|
var morphInfluences = new Float32Array( 8 );
|
|
|
|
var sprites = [];
|
|
var lensFlares = [];
|
|
|
|
// public properties
|
|
|
|
this.domElement = _canvas;
|
|
this.context = null;
|
|
|
|
// clearing
|
|
|
|
this.autoClear = true;
|
|
this.autoClearColor = true;
|
|
this.autoClearDepth = true;
|
|
this.autoClearStencil = true;
|
|
|
|
// scene graph
|
|
|
|
this.sortObjects = true;
|
|
|
|
// user-defined clipping
|
|
|
|
this.clippingPlanes = [];
|
|
this.localClippingEnabled = false;
|
|
|
|
// physically based shading
|
|
|
|
this.gammaFactor = 2.0; // for backwards compatibility
|
|
this.gammaInput = false;
|
|
this.gammaOutput = false;
|
|
|
|
// physical lights
|
|
|
|
this.physicallyCorrectLights = false;
|
|
|
|
// tone mapping
|
|
|
|
this.toneMapping = LinearToneMapping;
|
|
this.toneMappingExposure = 1.0;
|
|
this.toneMappingWhitePoint = 1.0;
|
|
|
|
// morphs
|
|
|
|
this.maxMorphTargets = 8;
|
|
this.maxMorphNormals = 4;
|
|
|
|
// internal properties
|
|
|
|
var _this = this,
|
|
|
|
// internal state cache
|
|
|
|
_currentProgram = null,
|
|
_currentRenderTarget = null,
|
|
_currentFramebuffer = null,
|
|
_currentMaterialId = - 1,
|
|
_currentGeometryProgram = '',
|
|
_currentCamera = null,
|
|
|
|
_currentScissor = new Vector4(),
|
|
_currentScissorTest = null,
|
|
|
|
_currentViewport = new Vector4(),
|
|
|
|
//
|
|
|
|
_usedTextureUnits = 0,
|
|
|
|
//
|
|
|
|
_clearColor = new Color( 0x000000 ),
|
|
_clearAlpha = 0,
|
|
|
|
_width = _canvas.width,
|
|
_height = _canvas.height,
|
|
|
|
_pixelRatio = 1,
|
|
|
|
_scissor = new Vector4( 0, 0, _width, _height ),
|
|
_scissorTest = false,
|
|
|
|
_viewport = new Vector4( 0, 0, _width, _height ),
|
|
|
|
// frustum
|
|
|
|
_frustum = new Frustum(),
|
|
|
|
// clipping
|
|
|
|
_clipping = new WebGLClipping(),
|
|
_clippingEnabled = false,
|
|
_localClippingEnabled = false,
|
|
|
|
// camera matrices cache
|
|
|
|
_projScreenMatrix = new Matrix4(),
|
|
|
|
_vector3 = new Vector3(),
|
|
_matrix4 = new Matrix4(),
|
|
_matrix42 = new Matrix4(),
|
|
|
|
// light arrays cache
|
|
|
|
_lights = {
|
|
|
|
hash: '',
|
|
|
|
ambient: [ 0, 0, 0 ],
|
|
directional: [],
|
|
directionalShadowMap: [],
|
|
directionalShadowMatrix: [],
|
|
spot: [],
|
|
spotShadowMap: [],
|
|
spotShadowMatrix: [],
|
|
rectArea: [],
|
|
point: [],
|
|
pointShadowMap: [],
|
|
pointShadowMatrix: [],
|
|
hemi: [],
|
|
|
|
shadows: []
|
|
|
|
},
|
|
|
|
// info
|
|
|
|
_infoMemory = {
|
|
geometries: 0,
|
|
textures: 0
|
|
},
|
|
|
|
_infoRender = {
|
|
|
|
frame: 0,
|
|
calls: 0,
|
|
vertices: 0,
|
|
faces: 0,
|
|
points: 0
|
|
|
|
};
|
|
|
|
this.info = {
|
|
|
|
render: _infoRender,
|
|
memory: _infoMemory,
|
|
programs: null
|
|
|
|
};
|
|
|
|
|
|
// initialize
|
|
|
|
var _gl;
|
|
|
|
try {
|
|
|
|
var contextAttributes = {
|
|
alpha: _alpha,
|
|
depth: _depth,
|
|
stencil: _stencil,
|
|
antialias: _antialias,
|
|
premultipliedAlpha: _premultipliedAlpha,
|
|
preserveDrawingBuffer: _preserveDrawingBuffer
|
|
};
|
|
|
|
_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
|
|
|
|
if ( _gl === null ) {
|
|
|
|
if ( _canvas.getContext( 'webgl' ) !== null ) {
|
|
|
|
throw 'Error creating WebGL context with your selected attributes.';
|
|
|
|
} else {
|
|
|
|
throw 'Error creating WebGL context.';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Some experimental-webgl implementations do not have getShaderPrecisionFormat
|
|
|
|
if ( _gl.getShaderPrecisionFormat === undefined ) {
|
|
|
|
_gl.getShaderPrecisionFormat = function () {
|
|
|
|
return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
|
|
|
|
};
|
|
|
|
}
|
|
|
|
_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
|
|
|
|
} catch ( error ) {
|
|
|
|
console.error( 'THREE.WebGLRenderer: ' + error );
|
|
|
|
}
|
|
|
|
var extensions = new WebGLExtensions( _gl );
|
|
|
|
extensions.get( 'WEBGL_depth_texture' );
|
|
extensions.get( 'OES_texture_float' );
|
|
extensions.get( 'OES_texture_float_linear' );
|
|
extensions.get( 'OES_texture_half_float' );
|
|
extensions.get( 'OES_texture_half_float_linear' );
|
|
extensions.get( 'OES_standard_derivatives' );
|
|
extensions.get( 'ANGLE_instanced_arrays' );
|
|
|
|
if ( extensions.get( 'OES_element_index_uint' ) ) {
|
|
|
|
BufferGeometry.MaxIndex = 4294967296;
|
|
|
|
}
|
|
|
|
var capabilities = new WebGLCapabilities( _gl, extensions, parameters );
|
|
|
|
var state = new WebGLState( _gl, extensions, paramThreeToGL );
|
|
|
|
var properties = new WebGLProperties();
|
|
var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory );
|
|
var attributes = new WebGLAttributes( _gl );
|
|
var geometries = new WebGLGeometries( _gl, attributes, _infoMemory );
|
|
var objects = new WebGLObjects( _gl, geometries, _infoRender );
|
|
var programCache = new WebGLPrograms( this, capabilities );
|
|
var lightCache = new WebGLLights();
|
|
var renderLists = new WebGLRenderLists();
|
|
|
|
this.info.programs = programCache.programs;
|
|
|
|
var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );
|
|
var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );
|
|
|
|
//
|
|
|
|
var backgroundPlaneCamera, backgroundPlaneMesh;
|
|
var backgroundBoxCamera, backgroundBoxMesh;
|
|
|
|
//
|
|
|
|
function getTargetPixelRatio() {
|
|
|
|
return _currentRenderTarget === null ? _pixelRatio : 1;
|
|
|
|
}
|
|
|
|
function setDefaultGLState() {
|
|
|
|
state.init();
|
|
|
|
state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
|
|
state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
|
|
|
|
state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );
|
|
|
|
}
|
|
|
|
function resetGLState() {
|
|
|
|
_currentProgram = null;
|
|
_currentCamera = null;
|
|
|
|
_currentGeometryProgram = '';
|
|
_currentMaterialId = - 1;
|
|
|
|
state.reset();
|
|
|
|
}
|
|
|
|
setDefaultGLState();
|
|
|
|
this.context = _gl;
|
|
this.capabilities = capabilities;
|
|
this.extensions = extensions;
|
|
this.properties = properties;
|
|
this.state = state;
|
|
|
|
// shadow map
|
|
|
|
var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );
|
|
|
|
this.shadowMap = shadowMap;
|
|
|
|
|
|
// Plugins
|
|
|
|
var spritePlugin = new SpritePlugin( this, sprites );
|
|
var lensFlarePlugin = new LensFlarePlugin( this, lensFlares );
|
|
|
|
// API
|
|
|
|
this.getContext = function () {
|
|
|
|
return _gl;
|
|
|
|
};
|
|
|
|
this.getContextAttributes = function () {
|
|
|
|
return _gl.getContextAttributes();
|
|
|
|
};
|
|
|
|
this.forceContextLoss = function () {
|
|
|
|
var extension = extensions.get( 'WEBGL_lose_context' );
|
|
if ( extension ) extension.loseContext();
|
|
|
|
};
|
|
|
|
this.getMaxAnisotropy = function () {
|
|
|
|
return capabilities.getMaxAnisotropy();
|
|
|
|
};
|
|
|
|
this.getPrecision = function () {
|
|
|
|
return capabilities.precision;
|
|
|
|
};
|
|
|
|
this.getPixelRatio = function () {
|
|
|
|
return _pixelRatio;
|
|
|
|
};
|
|
|
|
this.setPixelRatio = function ( value ) {
|
|
|
|
if ( value === undefined ) return;
|
|
|
|
_pixelRatio = value;
|
|
|
|
this.setSize( _viewport.z, _viewport.w, false );
|
|
|
|
};
|
|
|
|
this.getSize = function () {
|
|
|
|
return {
|
|
width: _width,
|
|
height: _height
|
|
};
|
|
|
|
};
|
|
|
|
this.setSize = function ( width, height, updateStyle ) {
|
|
|
|
_width = width;
|
|
_height = height;
|
|
|
|
_canvas.width = width * _pixelRatio;
|
|
_canvas.height = height * _pixelRatio;
|
|
|
|
if ( updateStyle !== false ) {
|
|
|
|
_canvas.style.width = width + 'px';
|
|
_canvas.style.height = height + 'px';
|
|
|
|
}
|
|
|
|
this.setViewport( 0, 0, width, height );
|
|
|
|
};
|
|
|
|
this.setViewport = function ( x, y, width, height ) {
|
|
|
|
state.viewport( _viewport.set( x, y, width, height ) );
|
|
|
|
};
|
|
|
|
this.setScissor = function ( x, y, width, height ) {
|
|
|
|
state.scissor( _scissor.set( x, y, width, height ) );
|
|
|
|
};
|
|
|
|
this.setScissorTest = function ( boolean ) {
|
|
|
|
state.setScissorTest( _scissorTest = boolean );
|
|
|
|
};
|
|
|
|
// Clearing
|
|
|
|
this.getClearColor = function () {
|
|
|
|
return _clearColor;
|
|
|
|
};
|
|
|
|
this.setClearColor = function ( color, alpha ) {
|
|
|
|
_clearColor.set( color );
|
|
|
|
_clearAlpha = alpha !== undefined ? alpha : 1;
|
|
|
|
state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );
|
|
|
|
};
|
|
|
|
this.getClearAlpha = function () {
|
|
|
|
return _clearAlpha;
|
|
|
|
};
|
|
|
|
this.setClearAlpha = function ( alpha ) {
|
|
|
|
_clearAlpha = alpha;
|
|
|
|
state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );
|
|
|
|
};
|
|
|
|
this.clear = function ( color, depth, stencil ) {
|
|
|
|
var bits = 0;
|
|
|
|
if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;
|
|
if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;
|
|
if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
|
|
|
|
_gl.clear( bits );
|
|
|
|
};
|
|
|
|
this.clearColor = function () {
|
|
|
|
this.clear( true, false, false );
|
|
|
|
};
|
|
|
|
this.clearDepth = function () {
|
|
|
|
this.clear( false, true, false );
|
|
|
|
};
|
|
|
|
this.clearStencil = function () {
|
|
|
|
this.clear( false, false, true );
|
|
|
|
};
|
|
|
|
this.clearTarget = function ( renderTarget, color, depth, stencil ) {
|
|
|
|
this.setRenderTarget( renderTarget );
|
|
this.clear( color, depth, stencil );
|
|
|
|
};
|
|
|
|
// Reset
|
|
|
|
this.resetGLState = resetGLState;
|
|
|
|
this.dispose = function () {
|
|
|
|
_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
|
|
|
|
renderLists.dispose();
|
|
|
|
};
|
|
|
|
// Events
|
|
|
|
function onContextLost( event ) {
|
|
|
|
event.preventDefault();
|
|
|
|
resetGLState();
|
|
setDefaultGLState();
|
|
|
|
properties.clear();
|
|
objects.clear();
|
|
|
|
}
|
|
|
|
function onMaterialDispose( event ) {
|
|
|
|
var material = event.target;
|
|
|
|
material.removeEventListener( 'dispose', onMaterialDispose );
|
|
|
|
deallocateMaterial( material );
|
|
|
|
}
|
|
|
|
// Buffer deallocation
|
|
|
|
function deallocateMaterial( material ) {
|
|
|
|
releaseMaterialProgramReference( material );
|
|
|
|
properties.remove( material );
|
|
|
|
}
|
|
|
|
|
|
function releaseMaterialProgramReference( material ) {
|
|
|
|
var programInfo = properties.get( material ).program;
|
|
|
|
material.program = undefined;
|
|
|
|
if ( programInfo !== undefined ) {
|
|
|
|
programCache.releaseProgram( programInfo );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Buffer rendering
|
|
|
|
function renderObjectImmediate( object, program, material ) {
|
|
|
|
object.render( function ( object ) {
|
|
|
|
_this.renderBufferImmediate( object, program, material );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
this.renderBufferImmediate = function ( object, program, material ) {
|
|
|
|
state.initAttributes();
|
|
|
|
var buffers = properties.get( object );
|
|
|
|
if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();
|
|
if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();
|
|
if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();
|
|
if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();
|
|
|
|
var programAttributes = program.getAttributes();
|
|
|
|
if ( object.hasPositions ) {
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
|
|
|
|
state.enableAttribute( programAttributes.position );
|
|
_gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );
|
|
|
|
}
|
|
|
|
if ( object.hasNormals ) {
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );
|
|
|
|
if ( ! material.isMeshPhongMaterial &&
|
|
! material.isMeshStandardMaterial &&
|
|
! material.isMeshNormalMaterial &&
|
|
material.shading === FlatShading ) {
|
|
|
|
for ( var i = 0, l = object.count * 3; i < l; i += 9 ) {
|
|
|
|
var array = object.normalArray;
|
|
|
|
var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;
|
|
var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;
|
|
var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;
|
|
|
|
array[ i + 0 ] = nx;
|
|
array[ i + 1 ] = ny;
|
|
array[ i + 2 ] = nz;
|
|
|
|
array[ i + 3 ] = nx;
|
|
array[ i + 4 ] = ny;
|
|
array[ i + 5 ] = nz;
|
|
|
|
array[ i + 6 ] = nx;
|
|
array[ i + 7 ] = ny;
|
|
array[ i + 8 ] = nz;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
|
|
|
|
state.enableAttribute( programAttributes.normal );
|
|
|
|
_gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );
|
|
|
|
}
|
|
|
|
if ( object.hasUvs && material.map ) {
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
|
|
|
|
state.enableAttribute( programAttributes.uv );
|
|
|
|
_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
|
|
|
|
}
|
|
|
|
if ( object.hasColors && material.vertexColors !== NoColors ) {
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );
|
|
_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
|
|
|
|
state.enableAttribute( programAttributes.color );
|
|
|
|
_gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );
|
|
|
|
}
|
|
|
|
state.disableUnusedAttributes();
|
|
|
|
_gl.drawArrays( _gl.TRIANGLES, 0, object.count );
|
|
|
|
object.count = 0;
|
|
|
|
};
|
|
|
|
function absNumericalSort( a, b ) {
|
|
|
|
return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );
|
|
|
|
}
|
|
|
|
this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
|
|
|
|
state.setMaterial( material );
|
|
|
|
var program = setProgram( camera, fog, material, object );
|
|
var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );
|
|
|
|
var updateBuffers = false;
|
|
|
|
if ( geometryProgram !== _currentGeometryProgram ) {
|
|
|
|
_currentGeometryProgram = geometryProgram;
|
|
updateBuffers = true;
|
|
|
|
}
|
|
|
|
// morph targets
|
|
|
|
var morphTargetInfluences = object.morphTargetInfluences;
|
|
|
|
if ( morphTargetInfluences !== undefined ) {
|
|
|
|
// TODO Remove allocations
|
|
|
|
var activeInfluences = [];
|
|
|
|
for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {
|
|
|
|
var influence = morphTargetInfluences[ i ];
|
|
activeInfluences.push( [ influence, i ] );
|
|
|
|
}
|
|
|
|
activeInfluences.sort( absNumericalSort );
|
|
|
|
if ( activeInfluences.length > 8 ) {
|
|
|
|
activeInfluences.length = 8;
|
|
|
|
}
|
|
|
|
var morphAttributes = geometry.morphAttributes;
|
|
|
|
for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {
|
|
|
|
var influence = activeInfluences[ i ];
|
|
morphInfluences[ i ] = influence[ 0 ];
|
|
|
|
if ( influence[ 0 ] !== 0 ) {
|
|
|
|
var index = influence[ 1 ];
|
|
|
|
if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );
|
|
if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );
|
|
|
|
} else {
|
|
|
|
if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );
|
|
if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {
|
|
|
|
morphInfluences[ i ] = 0.0;
|
|
|
|
}
|
|
|
|
program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences );
|
|
|
|
updateBuffers = true;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var index = geometry.index;
|
|
var position = geometry.attributes.position;
|
|
var rangeFactor = 1;
|
|
|
|
if ( material.wireframe === true ) {
|
|
|
|
index = geometries.getWireframeAttribute( geometry );
|
|
rangeFactor = 2;
|
|
|
|
}
|
|
|
|
var renderer = bufferRenderer;
|
|
|
|
if ( index !== null ) {
|
|
|
|
renderer = indexedBufferRenderer;
|
|
renderer.setIndex( index );
|
|
|
|
}
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
setupVertexAttributes( material, program, geometry );
|
|
|
|
if ( index !== null ) {
|
|
|
|
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var dataCount = 0;
|
|
|
|
if ( index !== null ) {
|
|
|
|
dataCount = index.count;
|
|
|
|
} else if ( position !== undefined ) {
|
|
|
|
dataCount = position.count;
|
|
|
|
}
|
|
|
|
var rangeStart = geometry.drawRange.start * rangeFactor;
|
|
var rangeCount = geometry.drawRange.count * rangeFactor;
|
|
|
|
var groupStart = group !== null ? group.start * rangeFactor : 0;
|
|
var groupCount = group !== null ? group.count * rangeFactor : Infinity;
|
|
|
|
var drawStart = Math.max( rangeStart, groupStart );
|
|
var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;
|
|
|
|
var drawCount = Math.max( 0, drawEnd - drawStart + 1 );
|
|
|
|
if ( drawCount === 0 ) return;
|
|
|
|
//
|
|
|
|
if ( object.isMesh ) {
|
|
|
|
if ( material.wireframe === true ) {
|
|
|
|
state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
|
|
renderer.setMode( _gl.LINES );
|
|
|
|
} else {
|
|
|
|
switch ( object.drawMode ) {
|
|
|
|
case TrianglesDrawMode:
|
|
renderer.setMode( _gl.TRIANGLES );
|
|
break;
|
|
|
|
case TriangleStripDrawMode:
|
|
renderer.setMode( _gl.TRIANGLE_STRIP );
|
|
break;
|
|
|
|
case TriangleFanDrawMode:
|
|
renderer.setMode( _gl.TRIANGLE_FAN );
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} else if ( object.isLine ) {
|
|
|
|
var lineWidth = material.linewidth;
|
|
|
|
if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
|
|
|
|
state.setLineWidth( lineWidth * getTargetPixelRatio() );
|
|
|
|
if ( object.isLineSegments ) {
|
|
|
|
renderer.setMode( _gl.LINES );
|
|
|
|
} else if ( object.isLineLoop ) {
|
|
|
|
renderer.setMode( _gl.LINE_LOOP );
|
|
|
|
} else {
|
|
|
|
renderer.setMode( _gl.LINE_STRIP );
|
|
|
|
}
|
|
|
|
} else if ( object.isPoints ) {
|
|
|
|
renderer.setMode( _gl.POINTS );
|
|
|
|
}
|
|
|
|
if ( geometry && geometry.isInstancedBufferGeometry ) {
|
|
|
|
if ( geometry.maxInstancedCount > 0 ) {
|
|
|
|
renderer.renderInstances( geometry, drawStart, drawCount );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
renderer.render( drawStart, drawCount );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
function setupVertexAttributes( material, program, geometry, startIndex ) {
|
|
|
|
if ( geometry && geometry.isInstancedBufferGeometry ) {
|
|
|
|
if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {
|
|
|
|
console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( startIndex === undefined ) startIndex = 0;
|
|
|
|
state.initAttributes();
|
|
|
|
var geometryAttributes = geometry.attributes;
|
|
|
|
var programAttributes = program.getAttributes();
|
|
|
|
var materialDefaultAttributeValues = material.defaultAttributeValues;
|
|
|
|
for ( var name in programAttributes ) {
|
|
|
|
var programAttribute = programAttributes[ name ];
|
|
|
|
if ( programAttribute >= 0 ) {
|
|
|
|
var geometryAttribute = geometryAttributes[ name ];
|
|
|
|
if ( geometryAttribute !== undefined ) {
|
|
|
|
var normalized = geometryAttribute.normalized;
|
|
var size = geometryAttribute.itemSize;
|
|
|
|
var attributeProperties = attributes.get( geometryAttribute );
|
|
|
|
var buffer = attributeProperties.buffer;
|
|
var type = attributeProperties.type;
|
|
var bytesPerElement = attributeProperties.bytesPerElement;
|
|
|
|
if ( geometryAttribute.isInterleavedBufferAttribute ) {
|
|
|
|
var data = geometryAttribute.data;
|
|
var stride = data.stride;
|
|
var offset = geometryAttribute.offset;
|
|
|
|
if ( data && data.isInstancedInterleavedBuffer ) {
|
|
|
|
state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );
|
|
|
|
if ( geometry.maxInstancedCount === undefined ) {
|
|
|
|
geometry.maxInstancedCount = data.meshPerAttribute * data.count;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
state.enableAttribute( programAttribute );
|
|
|
|
}
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
|
|
_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );
|
|
|
|
} else {
|
|
|
|
if ( geometryAttribute.isInstancedBufferAttribute ) {
|
|
|
|
state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );
|
|
|
|
if ( geometry.maxInstancedCount === undefined ) {
|
|
|
|
geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
state.enableAttribute( programAttribute );
|
|
|
|
}
|
|
|
|
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
|
|
_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );
|
|
|
|
}
|
|
|
|
} else if ( materialDefaultAttributeValues !== undefined ) {
|
|
|
|
var value = materialDefaultAttributeValues[ name ];
|
|
|
|
if ( value !== undefined ) {
|
|
|
|
switch ( value.length ) {
|
|
|
|
case 2:
|
|
_gl.vertexAttrib2fv( programAttribute, value );
|
|
break;
|
|
|
|
case 3:
|
|
_gl.vertexAttrib3fv( programAttribute, value );
|
|
break;
|
|
|
|
case 4:
|
|
_gl.vertexAttrib4fv( programAttribute, value );
|
|
break;
|
|
|
|
default:
|
|
_gl.vertexAttrib1fv( programAttribute, value );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
state.disableUnusedAttributes();
|
|
|
|
}
|
|
|
|
// Compile
|
|
|
|
this.compile = function ( scene, camera ) {
|
|
|
|
lights = [];
|
|
|
|
scene.traverse( function ( object ) {
|
|
|
|
if ( object.isLight ) {
|
|
|
|
lights.push( object );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
setupLights( lights, camera );
|
|
|
|
scene.traverse( function ( object ) {
|
|
|
|
if ( object.material ) {
|
|
|
|
if ( Array.isArray( object.material ) ) {
|
|
|
|
for ( var i = 0; i < object.material.length; i ++ ) {
|
|
|
|
initMaterial( object.material[ i ], scene.fog, object );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
initMaterial( object.material, scene.fog, object );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
};
|
|
|
|
// Rendering
|
|
|
|
this.render = function ( scene, camera, renderTarget, forceClear ) {
|
|
|
|
if ( camera !== undefined && camera.isCamera !== true ) {
|
|
|
|
console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
|
|
return;
|
|
|
|
}
|
|
|
|
// reset caching for this frame
|
|
|
|
_currentGeometryProgram = '';
|
|
_currentMaterialId = - 1;
|
|
_currentCamera = null;
|
|
|
|
// update scene graph
|
|
|
|
if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
|
|
|
|
// update camera matrices and frustum
|
|
|
|
camera.onBeforeRender( _this );
|
|
|
|
if ( camera.parent === null ) camera.updateMatrixWorld();
|
|
|
|
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
|
|
|
|
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
_frustum.setFromMatrix( _projScreenMatrix );
|
|
|
|
lights.length = 0;
|
|
sprites.length = 0;
|
|
lensFlares.length = 0;
|
|
|
|
_localClippingEnabled = this.localClippingEnabled;
|
|
_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
|
|
|
|
currentRenderList = renderLists.get( scene, camera );
|
|
currentRenderList.init();
|
|
|
|
projectObject( scene, camera, _this.sortObjects );
|
|
|
|
currentRenderList.finish();
|
|
|
|
if ( _this.sortObjects === true ) {
|
|
|
|
currentRenderList.sort();
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if ( _clippingEnabled ) _clipping.beginShadows();
|
|
|
|
setupShadows( lights );
|
|
|
|
shadowMap.render( scene, camera );
|
|
|
|
setupLights( lights, camera );
|
|
|
|
if ( _clippingEnabled ) _clipping.endShadows();
|
|
|
|
//
|
|
|
|
_infoRender.frame ++;
|
|
_infoRender.calls = 0;
|
|
_infoRender.vertices = 0;
|
|
_infoRender.faces = 0;
|
|
_infoRender.points = 0;
|
|
|
|
if ( renderTarget === undefined ) {
|
|
|
|
renderTarget = null;
|
|
|
|
}
|
|
|
|
this.setRenderTarget( renderTarget );
|
|
|
|
//
|
|
|
|
var background = scene.background;
|
|
|
|
if ( background === null ) {
|
|
|
|
state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha );
|
|
|
|
} else if ( background && background.isColor ) {
|
|
|
|
state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha );
|
|
forceClear = true;
|
|
|
|
}
|
|
|
|
if ( this.autoClear || forceClear ) {
|
|
|
|
this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );
|
|
|
|
}
|
|
|
|
if ( background && background.isCubeTexture ) {
|
|
|
|
if ( backgroundBoxCamera === undefined ) {
|
|
|
|
backgroundBoxCamera = new PerspectiveCamera();
|
|
|
|
backgroundBoxMesh = new Mesh(
|
|
new BoxBufferGeometry( 5, 5, 5 ),
|
|
new ShaderMaterial( {
|
|
uniforms: ShaderLib.cube.uniforms,
|
|
vertexShader: ShaderLib.cube.vertexShader,
|
|
fragmentShader: ShaderLib.cube.fragmentShader,
|
|
side: BackSide,
|
|
depthTest: false,
|
|
depthWrite: false,
|
|
fog: false
|
|
} )
|
|
);
|
|
|
|
}
|
|
|
|
backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix );
|
|
|
|
backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld );
|
|
backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld );
|
|
|
|
|
|
backgroundBoxMesh.material.uniforms[ "tCube" ].value = background;
|
|
backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld );
|
|
|
|
objects.update( backgroundBoxMesh );
|
|
|
|
_this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );
|
|
|
|
} else if ( background && background.isTexture ) {
|
|
|
|
if ( backgroundPlaneCamera === undefined ) {
|
|
|
|
backgroundPlaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
|
|
|
|
backgroundPlaneMesh = new Mesh(
|
|
new PlaneBufferGeometry( 2, 2 ),
|
|
new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )
|
|
);
|
|
|
|
}
|
|
|
|
backgroundPlaneMesh.material.map = background;
|
|
|
|
objects.update( backgroundPlaneMesh );
|
|
|
|
_this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var opaqueObjects = currentRenderList.opaque;
|
|
var transparentObjects = currentRenderList.transparent;
|
|
|
|
if ( scene.overrideMaterial ) {
|
|
|
|
var overrideMaterial = scene.overrideMaterial;
|
|
|
|
if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );
|
|
if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );
|
|
|
|
} else {
|
|
|
|
// opaque pass (front-to-back order)
|
|
|
|
if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );
|
|
|
|
// transparent pass (back-to-front order)
|
|
|
|
if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );
|
|
|
|
}
|
|
|
|
// custom render plugins (post pass)
|
|
|
|
spritePlugin.render( scene, camera );
|
|
lensFlarePlugin.render( scene, camera, _currentViewport );
|
|
|
|
// Generate mipmap if we're using any kind of mipmap filtering
|
|
|
|
if ( renderTarget ) {
|
|
|
|
textures.updateRenderTargetMipmap( renderTarget );
|
|
|
|
}
|
|
|
|
// Ensure depth buffer writing is enabled so it can be cleared on next render
|
|
|
|
state.buffers.depth.setTest( true );
|
|
state.buffers.depth.setMask( true );
|
|
state.buffers.color.setMask( true );
|
|
|
|
if ( camera.isArrayCamera && camera.enabled ) {
|
|
|
|
_this.setScissorTest( false );
|
|
|
|
}
|
|
|
|
camera.onAfterRender( _this );
|
|
|
|
// _gl.finish();
|
|
|
|
};
|
|
|
|
/*
|
|
// TODO Duplicated code (Frustum)
|
|
|
|
var _sphere = new Sphere();
|
|
|
|
function isObjectViewable( object ) {
|
|
|
|
var geometry = object.geometry;
|
|
|
|
if ( geometry.boundingSphere === null )
|
|
geometry.computeBoundingSphere();
|
|
|
|
_sphere.copy( geometry.boundingSphere ).
|
|
applyMatrix4( object.matrixWorld );
|
|
|
|
return isSphereViewable( _sphere );
|
|
|
|
}
|
|
|
|
function isSpriteViewable( sprite ) {
|
|
|
|
_sphere.center.set( 0, 0, 0 );
|
|
_sphere.radius = 0.7071067811865476;
|
|
_sphere.applyMatrix4( sprite.matrixWorld );
|
|
|
|
return isSphereViewable( _sphere );
|
|
|
|
}
|
|
|
|
function isSphereViewable( sphere ) {
|
|
|
|
if ( ! _frustum.intersectsSphere( sphere ) ) return false;
|
|
|
|
var numPlanes = _clipping.numPlanes;
|
|
|
|
if ( numPlanes === 0 ) return true;
|
|
|
|
var planes = _this.clippingPlanes,
|
|
|
|
center = sphere.center,
|
|
negRad = - sphere.radius,
|
|
i = 0;
|
|
|
|
do {
|
|
|
|
// out when deeper than radius in the negative halfspace
|
|
if ( planes[ i ].distanceToPoint( center ) < negRad ) return false;
|
|
|
|
} while ( ++ i !== numPlanes );
|
|
|
|
return true;
|
|
|
|
}
|
|
*/
|
|
|
|
function projectObject( object, camera, sortObjects ) {
|
|
|
|
if ( ! object.visible ) return;
|
|
|
|
var visible = object.layers.test( camera.layers );
|
|
|
|
if ( visible ) {
|
|
|
|
if ( object.isLight ) {
|
|
|
|
lights.push( object );
|
|
|
|
} else if ( object.isSprite ) {
|
|
|
|
if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
|
|
|
|
sprites.push( object );
|
|
|
|
}
|
|
|
|
} else if ( object.isLensFlare ) {
|
|
|
|
lensFlares.push( object );
|
|
|
|
} else if ( object.isImmediateRenderObject ) {
|
|
|
|
if ( sortObjects ) {
|
|
|
|
_vector3.setFromMatrixPosition( object.matrixWorld )
|
|
.applyMatrix4( _projScreenMatrix );
|
|
|
|
}
|
|
|
|
currentRenderList.push( object, null, object.material, _vector3.z, null );
|
|
|
|
} else if ( object.isMesh || object.isLine || object.isPoints ) {
|
|
|
|
if ( object.isSkinnedMesh ) {
|
|
|
|
object.skeleton.update();
|
|
|
|
}
|
|
|
|
if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
|
|
|
|
if ( sortObjects ) {
|
|
|
|
_vector3.setFromMatrixPosition( object.matrixWorld )
|
|
.applyMatrix4( _projScreenMatrix );
|
|
|
|
}
|
|
|
|
var geometry = objects.update( object );
|
|
var material = object.material;
|
|
|
|
if ( Array.isArray( material ) ) {
|
|
|
|
var groups = geometry.groups;
|
|
|
|
for ( var i = 0, l = groups.length; i < l; i ++ ) {
|
|
|
|
var group = groups[ i ];
|
|
var groupMaterial = material[ group.materialIndex ];
|
|
|
|
if ( groupMaterial && groupMaterial.visible ) {
|
|
|
|
currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ( material.visible ) {
|
|
|
|
currentRenderList.push( object, geometry, material, _vector3.z, null );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var children = object.children;
|
|
|
|
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
projectObject( children[ i ], camera, sortObjects );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function renderObjects( renderList, scene, camera, overrideMaterial ) {
|
|
|
|
for ( var i = 0, l = renderList.length; i < l; i ++ ) {
|
|
|
|
var renderItem = renderList[ i ];
|
|
|
|
var object = renderItem.object;
|
|
var geometry = renderItem.geometry;
|
|
var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;
|
|
var group = renderItem.group;
|
|
|
|
object.onBeforeRender( _this, scene, camera, geometry, material, group );
|
|
|
|
if ( camera.isArrayCamera && camera.enabled ) {
|
|
|
|
var cameras = camera.cameras;
|
|
|
|
for ( var j = 0, jl = cameras.length; j < jl; j ++ ) {
|
|
|
|
var camera2 = cameras[ j ];
|
|
var bounds = camera2.bounds;
|
|
|
|
_this.setViewport(
|
|
bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio,
|
|
bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio
|
|
);
|
|
_this.setScissor(
|
|
bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio,
|
|
bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio
|
|
);
|
|
_this.setScissorTest( true );
|
|
|
|
renderObject( object, scene, camera2, geometry, material, group );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
renderObject( object, scene, camera, geometry, material, group );
|
|
|
|
}
|
|
|
|
object.onAfterRender( _this, scene, camera, geometry, material, group );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function renderObject( object, scene, camera, geometry, material, group ) {
|
|
|
|
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
|
|
if ( object.isImmediateRenderObject ) {
|
|
|
|
state.setMaterial( material );
|
|
|
|
var program = setProgram( camera, scene.fog, material, object );
|
|
|
|
_currentGeometryProgram = '';
|
|
|
|
renderObjectImmediate( object, program, material );
|
|
|
|
} else {
|
|
|
|
_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function initMaterial( material, fog, object ) {
|
|
|
|
var materialProperties = properties.get( material );
|
|
|
|
var parameters = programCache.getParameters(
|
|
material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );
|
|
|
|
var code = programCache.getProgramCode( material, parameters );
|
|
|
|
var program = materialProperties.program;
|
|
var programChange = true;
|
|
|
|
if ( program === undefined ) {
|
|
|
|
// new material
|
|
material.addEventListener( 'dispose', onMaterialDispose );
|
|
|
|
} else if ( program.code !== code ) {
|
|
|
|
// changed glsl or parameters
|
|
releaseMaterialProgramReference( material );
|
|
|
|
} else if ( parameters.shaderID !== undefined ) {
|
|
|
|
// same glsl and uniform list
|
|
return;
|
|
|
|
} else {
|
|
|
|
// only rebuild uniform list
|
|
programChange = false;
|
|
|
|
}
|
|
|
|
if ( programChange ) {
|
|
|
|
if ( parameters.shaderID ) {
|
|
|
|
var shader = ShaderLib[ parameters.shaderID ];
|
|
|
|
materialProperties.__webglShader = {
|
|
name: material.type,
|
|
uniforms: UniformsUtils.clone( shader.uniforms ),
|
|
vertexShader: shader.vertexShader,
|
|
fragmentShader: shader.fragmentShader
|
|
};
|
|
|
|
} else {
|
|
|
|
materialProperties.__webglShader = {
|
|
name: material.type,
|
|
uniforms: material.uniforms,
|
|
vertexShader: material.vertexShader,
|
|
fragmentShader: material.fragmentShader
|
|
};
|
|
|
|
}
|
|
|
|
material.__webglShader = materialProperties.__webglShader;
|
|
|
|
program = programCache.acquireProgram( material, parameters, code );
|
|
|
|
materialProperties.program = program;
|
|
material.program = program;
|
|
|
|
}
|
|
|
|
var programAttributes = program.getAttributes();
|
|
|
|
if ( material.morphTargets ) {
|
|
|
|
material.numSupportedMorphTargets = 0;
|
|
|
|
for ( var i = 0; i < _this.maxMorphTargets; i ++ ) {
|
|
|
|
if ( programAttributes[ 'morphTarget' + i ] >= 0 ) {
|
|
|
|
material.numSupportedMorphTargets ++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( material.morphNormals ) {
|
|
|
|
material.numSupportedMorphNormals = 0;
|
|
|
|
for ( var i = 0; i < _this.maxMorphNormals; i ++ ) {
|
|
|
|
if ( programAttributes[ 'morphNormal' + i ] >= 0 ) {
|
|
|
|
material.numSupportedMorphNormals ++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var uniforms = materialProperties.__webglShader.uniforms;
|
|
|
|
if ( ! material.isShaderMaterial &&
|
|
! material.isRawShaderMaterial ||
|
|
material.clipping === true ) {
|
|
|
|
materialProperties.numClippingPlanes = _clipping.numPlanes;
|
|
materialProperties.numIntersection = _clipping.numIntersection;
|
|
uniforms.clippingPlanes = _clipping.uniform;
|
|
|
|
}
|
|
|
|
materialProperties.fog = fog;
|
|
|
|
// store the light setup it was created for
|
|
|
|
materialProperties.lightsHash = _lights.hash;
|
|
|
|
if ( material.lights ) {
|
|
|
|
// wire up the material to this renderer's lighting state
|
|
|
|
uniforms.ambientLightColor.value = _lights.ambient;
|
|
uniforms.directionalLights.value = _lights.directional;
|
|
uniforms.spotLights.value = _lights.spot;
|
|
uniforms.rectAreaLights.value = _lights.rectArea;
|
|
uniforms.pointLights.value = _lights.point;
|
|
uniforms.hemisphereLights.value = _lights.hemi;
|
|
|
|
uniforms.directionalShadowMap.value = _lights.directionalShadowMap;
|
|
uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;
|
|
uniforms.spotShadowMap.value = _lights.spotShadowMap;
|
|
uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;
|
|
uniforms.pointShadowMap.value = _lights.pointShadowMap;
|
|
uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;
|
|
// TODO (abelnation): add area lights shadow info to uniforms
|
|
|
|
}
|
|
|
|
var progUniforms = materialProperties.program.getUniforms(),
|
|
uniformsList =
|
|
WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
|
|
|
|
materialProperties.uniformsList = uniformsList;
|
|
|
|
}
|
|
|
|
function setProgram( camera, fog, material, object ) {
|
|
|
|
_usedTextureUnits = 0;
|
|
|
|
var materialProperties = properties.get( material );
|
|
|
|
if ( _clippingEnabled ) {
|
|
|
|
if ( _localClippingEnabled || camera !== _currentCamera ) {
|
|
|
|
var useCache =
|
|
camera === _currentCamera &&
|
|
material.id === _currentMaterialId;
|
|
|
|
// we might want to call this function with some ClippingGroup
|
|
// object instead of the material, once it becomes feasible
|
|
// (#8465, #8379)
|
|
_clipping.setState(
|
|
material.clippingPlanes, material.clipIntersection, material.clipShadows,
|
|
camera, materialProperties, useCache );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( material.needsUpdate === false ) {
|
|
|
|
if ( materialProperties.program === undefined ) {
|
|
|
|
material.needsUpdate = true;
|
|
|
|
} else if ( material.fog && materialProperties.fog !== fog ) {
|
|
|
|
material.needsUpdate = true;
|
|
|
|
} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {
|
|
|
|
material.needsUpdate = true;
|
|
|
|
} else if ( materialProperties.numClippingPlanes !== undefined &&
|
|
( materialProperties.numClippingPlanes !== _clipping.numPlanes ||
|
|
materialProperties.numIntersection !== _clipping.numIntersection ) ) {
|
|
|
|
material.needsUpdate = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( material.needsUpdate ) {
|
|
|
|
initMaterial( material, fog, object );
|
|
material.needsUpdate = false;
|
|
|
|
}
|
|
|
|
var refreshProgram = false;
|
|
var refreshMaterial = false;
|
|
var refreshLights = false;
|
|
|
|
var program = materialProperties.program,
|
|
p_uniforms = program.getUniforms(),
|
|
m_uniforms = materialProperties.__webglShader.uniforms;
|
|
|
|
if ( program.id !== _currentProgram ) {
|
|
|
|
_gl.useProgram( program.program );
|
|
_currentProgram = program.id;
|
|
|
|
refreshProgram = true;
|
|
refreshMaterial = true;
|
|
refreshLights = true;
|
|
|
|
}
|
|
|
|
if ( material.id !== _currentMaterialId ) {
|
|
|
|
_currentMaterialId = material.id;
|
|
|
|
refreshMaterial = true;
|
|
|
|
}
|
|
|
|
if ( refreshProgram || camera !== _currentCamera ) {
|
|
|
|
p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
|
|
|
|
if ( capabilities.logarithmicDepthBuffer ) {
|
|
|
|
p_uniforms.setValue( _gl, 'logDepthBufFC',
|
|
2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
|
|
|
|
}
|
|
|
|
|
|
if ( camera !== _currentCamera ) {
|
|
|
|
_currentCamera = camera;
|
|
|
|
// lighting uniforms depend on the camera so enforce an update
|
|
// now, in case this material supports lights - or later, when
|
|
// the next material that does gets activated:
|
|
|
|
refreshMaterial = true; // set to true on material change
|
|
refreshLights = true; // remains set until update done
|
|
|
|
}
|
|
|
|
// load material specific uniforms
|
|
// (shader material also gets them for the sake of genericity)
|
|
|
|
if ( material.isShaderMaterial ||
|
|
material.isMeshPhongMaterial ||
|
|
material.isMeshStandardMaterial ||
|
|
material.envMap ) {
|
|
|
|
var uCamPos = p_uniforms.map.cameraPosition;
|
|
|
|
if ( uCamPos !== undefined ) {
|
|
|
|
uCamPos.setValue( _gl,
|
|
_vector3.setFromMatrixPosition( camera.matrixWorld ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( material.isMeshPhongMaterial ||
|
|
material.isMeshLambertMaterial ||
|
|
material.isMeshBasicMaterial ||
|
|
material.isMeshStandardMaterial ||
|
|
material.isShaderMaterial ||
|
|
material.skinning ) {
|
|
|
|
p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
|
|
|
|
}
|
|
|
|
p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
|
|
p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );
|
|
|
|
}
|
|
|
|
// skinning uniforms must be set even if material didn't change
|
|
// auto-setting of texture unit for bone texture must go before other textures
|
|
// not sure why, but otherwise weird things happen
|
|
|
|
if ( material.skinning ) {
|
|
|
|
p_uniforms.setOptional( _gl, object, 'bindMatrix' );
|
|
p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
|
|
|
|
var skeleton = object.skeleton;
|
|
|
|
if ( skeleton ) {
|
|
|
|
var bones = skeleton.bones;
|
|
|
|
if ( capabilities.floatVertexTextures ) {
|
|
|
|
if ( skeleton.boneTexture === undefined ) {
|
|
|
|
// layout (1 matrix = 4 pixels)
|
|
// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
|
|
// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)
|
|
// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)
|
|
// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)
|
|
// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)
|
|
|
|
|
|
var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix
|
|
size = _Math.nextPowerOfTwo( Math.ceil( size ) );
|
|
size = Math.max( size, 4 );
|
|
|
|
var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel
|
|
boneMatrices.set( skeleton.boneMatrices ); // copy current values
|
|
|
|
var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );
|
|
|
|
skeleton.boneMatrices = boneMatrices;
|
|
skeleton.boneTexture = boneTexture;
|
|
skeleton.boneTextureSize = size;
|
|
|
|
}
|
|
|
|
p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );
|
|
p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
|
|
|
|
} else {
|
|
|
|
p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( refreshMaterial ) {
|
|
|
|
if ( material.lights ) {
|
|
|
|
// the current material requires lighting info
|
|
|
|
// note: all lighting uniforms are always set correctly
|
|
// they simply reference the renderer's state for their
|
|
// values
|
|
//
|
|
// use the current material's .needsUpdate flags to set
|
|
// the GL state when required
|
|
|
|
markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
|
|
|
|
}
|
|
|
|
// refresh uniforms common to several materials
|
|
|
|
if ( fog && material.fog ) {
|
|
|
|
refreshUniformsFog( m_uniforms, fog );
|
|
|
|
}
|
|
|
|
if ( material.isMeshBasicMaterial ||
|
|
material.isMeshLambertMaterial ||
|
|
material.isMeshPhongMaterial ||
|
|
material.isMeshStandardMaterial ||
|
|
material.isMeshNormalMaterial ||
|
|
material.isMeshDepthMaterial ) {
|
|
|
|
refreshUniformsCommon( m_uniforms, material );
|
|
|
|
}
|
|
|
|
// refresh single material specific uniforms
|
|
|
|
if ( material.isLineBasicMaterial ) {
|
|
|
|
refreshUniformsLine( m_uniforms, material );
|
|
|
|
} else if ( material.isLineDashedMaterial ) {
|
|
|
|
refreshUniformsLine( m_uniforms, material );
|
|
refreshUniformsDash( m_uniforms, material );
|
|
|
|
} else if ( material.isPointsMaterial ) {
|
|
|
|
refreshUniformsPoints( m_uniforms, material );
|
|
|
|
} else if ( material.isMeshLambertMaterial ) {
|
|
|
|
refreshUniformsLambert( m_uniforms, material );
|
|
|
|
} else if ( material.isMeshToonMaterial ) {
|
|
|
|
refreshUniformsToon( m_uniforms, material );
|
|
|
|
} else if ( material.isMeshPhongMaterial ) {
|
|
|
|
refreshUniformsPhong( m_uniforms, material );
|
|
|
|
} else if ( material.isMeshPhysicalMaterial ) {
|
|
|
|
refreshUniformsPhysical( m_uniforms, material );
|
|
|
|
} else if ( material.isMeshStandardMaterial ) {
|
|
|
|
refreshUniformsStandard( m_uniforms, material );
|
|
|
|
} else if ( material.isMeshDepthMaterial ) {
|
|
|
|
if ( material.displacementMap ) {
|
|
|
|
m_uniforms.displacementMap.value = material.displacementMap;
|
|
m_uniforms.displacementScale.value = material.displacementScale;
|
|
m_uniforms.displacementBias.value = material.displacementBias;
|
|
|
|
}
|
|
|
|
} else if ( material.isMeshNormalMaterial ) {
|
|
|
|
refreshUniformsNormal( m_uniforms, material );
|
|
|
|
}
|
|
|
|
// RectAreaLight Texture
|
|
// TODO (mrdoob): Find a nicer implementation
|
|
|
|
if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib.LTC_MAT_TEXTURE;
|
|
if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib.LTC_MAG_TEXTURE;
|
|
|
|
WebGLUniforms.upload(
|
|
_gl, materialProperties.uniformsList, m_uniforms, _this );
|
|
|
|
}
|
|
|
|
|
|
// common matrices
|
|
|
|
p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
|
|
p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
|
|
p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
|
|
|
|
return program;
|
|
|
|
}
|
|
|
|
// Uniforms (refresh uniforms objects)
|
|
|
|
function refreshUniformsCommon( uniforms, material ) {
|
|
|
|
uniforms.opacity.value = material.opacity;
|
|
|
|
uniforms.diffuse.value = material.color;
|
|
|
|
if ( material.emissive ) {
|
|
|
|
uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
|
|
|
|
}
|
|
|
|
uniforms.map.value = material.map;
|
|
uniforms.specularMap.value = material.specularMap;
|
|
uniforms.alphaMap.value = material.alphaMap;
|
|
|
|
if ( material.lightMap ) {
|
|
|
|
uniforms.lightMap.value = material.lightMap;
|
|
uniforms.lightMapIntensity.value = material.lightMapIntensity;
|
|
|
|
}
|
|
|
|
if ( material.aoMap ) {
|
|
|
|
uniforms.aoMap.value = material.aoMap;
|
|
uniforms.aoMapIntensity.value = material.aoMapIntensity;
|
|
|
|
}
|
|
|
|
// uv repeat and offset setting priorities
|
|
// 1. color map
|
|
// 2. specular map
|
|
// 3. normal map
|
|
// 4. bump map
|
|
// 5. alpha map
|
|
// 6. emissive map
|
|
|
|
var uvScaleMap;
|
|
|
|
if ( material.map ) {
|
|
|
|
uvScaleMap = material.map;
|
|
|
|
} else if ( material.specularMap ) {
|
|
|
|
uvScaleMap = material.specularMap;
|
|
|
|
} else if ( material.displacementMap ) {
|
|
|
|
uvScaleMap = material.displacementMap;
|
|
|
|
} else if ( material.normalMap ) {
|
|
|
|
uvScaleMap = material.normalMap;
|
|
|
|
} else if ( material.bumpMap ) {
|
|
|
|
uvScaleMap = material.bumpMap;
|
|
|
|
} else if ( material.roughnessMap ) {
|
|
|
|
uvScaleMap = material.roughnessMap;
|
|
|
|
} else if ( material.metalnessMap ) {
|
|
|
|
uvScaleMap = material.metalnessMap;
|
|
|
|
} else if ( material.alphaMap ) {
|
|
|
|
uvScaleMap = material.alphaMap;
|
|
|
|
} else if ( material.emissiveMap ) {
|
|
|
|
uvScaleMap = material.emissiveMap;
|
|
|
|
}
|
|
|
|
if ( uvScaleMap !== undefined ) {
|
|
|
|
// backwards compatibility
|
|
if ( uvScaleMap.isWebGLRenderTarget ) {
|
|
|
|
uvScaleMap = uvScaleMap.texture;
|
|
|
|
}
|
|
|
|
var offset = uvScaleMap.offset;
|
|
var repeat = uvScaleMap.repeat;
|
|
|
|
uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
|
|
|
|
}
|
|
|
|
uniforms.envMap.value = material.envMap;
|
|
|
|
// don't flip CubeTexture envMaps, flip everything else:
|
|
// WebGLRenderTargetCube will be flipped for backwards compatibility
|
|
// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
|
|
// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
|
|
uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
|
|
|
|
uniforms.reflectivity.value = material.reflectivity;
|
|
uniforms.refractionRatio.value = material.refractionRatio;
|
|
|
|
}
|
|
|
|
function refreshUniformsLine( uniforms, material ) {
|
|
|
|
uniforms.diffuse.value = material.color;
|
|
uniforms.opacity.value = material.opacity;
|
|
|
|
}
|
|
|
|
function refreshUniformsDash( uniforms, material ) {
|
|
|
|
uniforms.dashSize.value = material.dashSize;
|
|
uniforms.totalSize.value = material.dashSize + material.gapSize;
|
|
uniforms.scale.value = material.scale;
|
|
|
|
}
|
|
|
|
function refreshUniformsPoints( uniforms, material ) {
|
|
|
|
uniforms.diffuse.value = material.color;
|
|
uniforms.opacity.value = material.opacity;
|
|
uniforms.size.value = material.size * _pixelRatio;
|
|
uniforms.scale.value = _height * 0.5;
|
|
|
|
uniforms.map.value = material.map;
|
|
|
|
if ( material.map !== null ) {
|
|
|
|
var offset = material.map.offset;
|
|
var repeat = material.map.repeat;
|
|
|
|
uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function refreshUniformsFog( uniforms, fog ) {
|
|
|
|
uniforms.fogColor.value = fog.color;
|
|
|
|
if ( fog.isFog ) {
|
|
|
|
uniforms.fogNear.value = fog.near;
|
|
uniforms.fogFar.value = fog.far;
|
|
|
|
} else if ( fog.isFogExp2 ) {
|
|
|
|
uniforms.fogDensity.value = fog.density;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function refreshUniformsLambert( uniforms, material ) {
|
|
|
|
if ( material.emissiveMap ) {
|
|
|
|
uniforms.emissiveMap.value = material.emissiveMap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function refreshUniformsPhong( uniforms, material ) {
|
|
|
|
uniforms.specular.value = material.specular;
|
|
uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
|
|
|
|
if ( material.emissiveMap ) {
|
|
|
|
uniforms.emissiveMap.value = material.emissiveMap;
|
|
|
|
}
|
|
|
|
if ( material.bumpMap ) {
|
|
|
|
uniforms.bumpMap.value = material.bumpMap;
|
|
uniforms.bumpScale.value = material.bumpScale;
|
|
|
|
}
|
|
|
|
if ( material.normalMap ) {
|
|
|
|
uniforms.normalMap.value = material.normalMap;
|
|
uniforms.normalScale.value.copy( material.normalScale );
|
|
|
|
}
|
|
|
|
if ( material.displacementMap ) {
|
|
|
|
uniforms.displacementMap.value = material.displacementMap;
|
|
uniforms.displacementScale.value = material.displacementScale;
|
|
uniforms.displacementBias.value = material.displacementBias;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function refreshUniformsToon( uniforms, material ) {
|
|
|
|
refreshUniformsPhong( uniforms, material );
|
|
|
|
if ( material.gradientMap ) {
|
|
|
|
uniforms.gradientMap.value = material.gradientMap;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function refreshUniformsStandard( uniforms, material ) {
|
|
|
|
uniforms.roughness.value = material.roughness;
|
|
uniforms.metalness.value = material.metalness;
|
|
|
|
if ( material.roughnessMap ) {
|
|
|
|
uniforms.roughnessMap.value = material.roughnessMap;
|
|
|
|
}
|
|
|
|
if ( material.metalnessMap ) {
|
|
|
|
uniforms.metalnessMap.value = material.metalnessMap;
|
|
|
|
}
|
|
|
|
if ( material.emissiveMap ) {
|
|
|
|
uniforms.emissiveMap.value = material.emissiveMap;
|
|
|
|
}
|
|
|
|
if ( material.bumpMap ) {
|
|
|
|
uniforms.bumpMap.value = material.bumpMap;
|
|
uniforms.bumpScale.value = material.bumpScale;
|
|
|
|
}
|
|
|
|
if ( material.normalMap ) {
|
|
|
|
uniforms.normalMap.value = material.normalMap;
|
|
uniforms.normalScale.value.copy( material.normalScale );
|
|
|
|
}
|
|
|
|
if ( material.displacementMap ) {
|
|
|
|
uniforms.displacementMap.value = material.displacementMap;
|
|
uniforms.displacementScale.value = material.displacementScale;
|
|
uniforms.displacementBias.value = material.displacementBias;
|
|
|
|
}
|
|
|
|
if ( material.envMap ) {
|
|
|
|
//uniforms.envMap.value = material.envMap; // part of uniforms common
|
|
uniforms.envMapIntensity.value = material.envMapIntensity;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function refreshUniformsPhysical( uniforms, material ) {
|
|
|
|
uniforms.clearCoat.value = material.clearCoat;
|
|
uniforms.clearCoatRoughness.value = material.clearCoatRoughness;
|
|
|
|
refreshUniformsStandard( uniforms, material );
|
|
|
|
}
|
|
|
|
function refreshUniformsNormal( uniforms, material ) {
|
|
|
|
if ( material.bumpMap ) {
|
|
|
|
uniforms.bumpMap.value = material.bumpMap;
|
|
uniforms.bumpScale.value = material.bumpScale;
|
|
|
|
}
|
|
|
|
if ( material.normalMap ) {
|
|
|
|
uniforms.normalMap.value = material.normalMap;
|
|
uniforms.normalScale.value.copy( material.normalScale );
|
|
|
|
}
|
|
|
|
if ( material.displacementMap ) {
|
|
|
|
uniforms.displacementMap.value = material.displacementMap;
|
|
uniforms.displacementScale.value = material.displacementScale;
|
|
uniforms.displacementBias.value = material.displacementBias;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// If uniforms are marked as clean, they don't need to be loaded to the GPU.
|
|
|
|
function markUniformsLightsNeedsUpdate( uniforms, value ) {
|
|
|
|
uniforms.ambientLightColor.needsUpdate = value;
|
|
|
|
uniforms.directionalLights.needsUpdate = value;
|
|
uniforms.pointLights.needsUpdate = value;
|
|
uniforms.spotLights.needsUpdate = value;
|
|
uniforms.rectAreaLights.needsUpdate = value;
|
|
uniforms.hemisphereLights.needsUpdate = value;
|
|
|
|
}
|
|
|
|
// Lighting
|
|
|
|
function setupShadows( lights ) {
|
|
|
|
var lightShadowsLength = 0;
|
|
|
|
for ( var i = 0, l = lights.length; i < l; i ++ ) {
|
|
|
|
var light = lights[ i ];
|
|
|
|
if ( light.castShadow ) {
|
|
|
|
_lights.shadows[ lightShadowsLength ] = light;
|
|
lightShadowsLength ++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_lights.shadows.length = lightShadowsLength;
|
|
|
|
}
|
|
|
|
function setupLights( lights, camera ) {
|
|
|
|
var l, ll, light, shadow,
|
|
r = 0, g = 0, b = 0,
|
|
color,
|
|
intensity,
|
|
distance,
|
|
shadowMap,
|
|
|
|
viewMatrix = camera.matrixWorldInverse,
|
|
|
|
directionalLength = 0,
|
|
pointLength = 0,
|
|
spotLength = 0,
|
|
rectAreaLength = 0,
|
|
hemiLength = 0;
|
|
|
|
for ( l = 0, ll = lights.length; l < ll; l ++ ) {
|
|
|
|
light = lights[ l ];
|
|
|
|
color = light.color;
|
|
intensity = light.intensity;
|
|
distance = light.distance;
|
|
|
|
shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;
|
|
|
|
if ( light.isAmbientLight ) {
|
|
|
|
r += color.r * intensity;
|
|
g += color.g * intensity;
|
|
b += color.b * intensity;
|
|
|
|
} else if ( light.isDirectionalLight ) {
|
|
|
|
var uniforms = lightCache.get( light );
|
|
|
|
uniforms.color.copy( light.color ).multiplyScalar( light.intensity );
|
|
uniforms.direction.setFromMatrixPosition( light.matrixWorld );
|
|
_vector3.setFromMatrixPosition( light.target.matrixWorld );
|
|
uniforms.direction.sub( _vector3 );
|
|
uniforms.direction.transformDirection( viewMatrix );
|
|
|
|
uniforms.shadow = light.castShadow;
|
|
|
|
if ( light.castShadow ) {
|
|
|
|
shadow = light.shadow;
|
|
|
|
uniforms.shadowBias = shadow.bias;
|
|
uniforms.shadowRadius = shadow.radius;
|
|
uniforms.shadowMapSize = shadow.mapSize;
|
|
|
|
}
|
|
|
|
_lights.directionalShadowMap[ directionalLength ] = shadowMap;
|
|
_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;
|
|
_lights.directional[ directionalLength ] = uniforms;
|
|
|
|
directionalLength ++;
|
|
|
|
} else if ( light.isSpotLight ) {
|
|
|
|
var uniforms = lightCache.get( light );
|
|
|
|
uniforms.position.setFromMatrixPosition( light.matrixWorld );
|
|
uniforms.position.applyMatrix4( viewMatrix );
|
|
|
|
uniforms.color.copy( color ).multiplyScalar( intensity );
|
|
uniforms.distance = distance;
|
|
|
|
uniforms.direction.setFromMatrixPosition( light.matrixWorld );
|
|
_vector3.setFromMatrixPosition( light.target.matrixWorld );
|
|
uniforms.direction.sub( _vector3 );
|
|
uniforms.direction.transformDirection( viewMatrix );
|
|
|
|
uniforms.coneCos = Math.cos( light.angle );
|
|
uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );
|
|
uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;
|
|
|
|
uniforms.shadow = light.castShadow;
|
|
|
|
if ( light.castShadow ) {
|
|
|
|
shadow = light.shadow;
|
|
|
|
uniforms.shadowBias = shadow.bias;
|
|
uniforms.shadowRadius = shadow.radius;
|
|
uniforms.shadowMapSize = shadow.mapSize;
|
|
|
|
}
|
|
|
|
_lights.spotShadowMap[ spotLength ] = shadowMap;
|
|
_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;
|
|
_lights.spot[ spotLength ] = uniforms;
|
|
|
|
spotLength ++;
|
|
|
|
} else if ( light.isRectAreaLight ) {
|
|
|
|
var uniforms = lightCache.get( light );
|
|
|
|
// (a) intensity controls irradiance of entire light
|
|
uniforms.color
|
|
.copy( color )
|
|
.multiplyScalar( intensity / ( light.width * light.height ) );
|
|
|
|
// (b) intensity controls the radiance per light area
|
|
// uniforms.color.copy( color ).multiplyScalar( intensity );
|
|
|
|
uniforms.position.setFromMatrixPosition( light.matrixWorld );
|
|
uniforms.position.applyMatrix4( viewMatrix );
|
|
|
|
// extract local rotation of light to derive width/height half vectors
|
|
_matrix42.identity();
|
|
_matrix4.copy( light.matrixWorld );
|
|
_matrix4.premultiply( viewMatrix );
|
|
_matrix42.extractRotation( _matrix4 );
|
|
|
|
uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );
|
|
uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );
|
|
|
|
uniforms.halfWidth.applyMatrix4( _matrix42 );
|
|
uniforms.halfHeight.applyMatrix4( _matrix42 );
|
|
|
|
// TODO (abelnation): RectAreaLight distance?
|
|
// uniforms.distance = distance;
|
|
|
|
_lights.rectArea[ rectAreaLength ] = uniforms;
|
|
|
|
rectAreaLength ++;
|
|
|
|
} else if ( light.isPointLight ) {
|
|
|
|
var uniforms = lightCache.get( light );
|
|
|
|
uniforms.position.setFromMatrixPosition( light.matrixWorld );
|
|
uniforms.position.applyMatrix4( viewMatrix );
|
|
|
|
uniforms.color.copy( light.color ).multiplyScalar( light.intensity );
|
|
uniforms.distance = light.distance;
|
|
uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;
|
|
|
|
uniforms.shadow = light.castShadow;
|
|
|
|
if ( light.castShadow ) {
|
|
|
|
shadow = light.shadow;
|
|
|
|
uniforms.shadowBias = shadow.bias;
|
|
uniforms.shadowRadius = shadow.radius;
|
|
uniforms.shadowMapSize = shadow.mapSize;
|
|
|
|
}
|
|
|
|
_lights.pointShadowMap[ pointLength ] = shadowMap;
|
|
_lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix;
|
|
_lights.point[ pointLength ] = uniforms;
|
|
|
|
pointLength ++;
|
|
|
|
} else if ( light.isHemisphereLight ) {
|
|
|
|
var uniforms = lightCache.get( light );
|
|
|
|
uniforms.direction.setFromMatrixPosition( light.matrixWorld );
|
|
uniforms.direction.transformDirection( viewMatrix );
|
|
uniforms.direction.normalize();
|
|
|
|
uniforms.skyColor.copy( light.color ).multiplyScalar( intensity );
|
|
uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );
|
|
|
|
_lights.hemi[ hemiLength ] = uniforms;
|
|
|
|
hemiLength ++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_lights.ambient[ 0 ] = r;
|
|
_lights.ambient[ 1 ] = g;
|
|
_lights.ambient[ 2 ] = b;
|
|
|
|
_lights.directional.length = directionalLength;
|
|
_lights.spot.length = spotLength;
|
|
_lights.rectArea.length = rectAreaLength;
|
|
_lights.point.length = pointLength;
|
|
_lights.hemi.length = hemiLength;
|
|
|
|
// TODO (sam-g-steel) why aren't we using join
|
|
_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length;
|
|
|
|
}
|
|
|
|
// GL state setting
|
|
|
|
this.setFaceCulling = function ( cullFace, frontFaceDirection ) {
|
|
|
|
state.setCullFace( cullFace );
|
|
state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );
|
|
|
|
};
|
|
|
|
// Textures
|
|
|
|
function allocTextureUnit() {
|
|
|
|
var textureUnit = _usedTextureUnits;
|
|
|
|
if ( textureUnit >= capabilities.maxTextures ) {
|
|
|
|
console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
|
|
|
|
}
|
|
|
|
_usedTextureUnits += 1;
|
|
|
|
return textureUnit;
|
|
|
|
}
|
|
|
|
this.allocTextureUnit = allocTextureUnit;
|
|
|
|
// this.setTexture2D = setTexture2D;
|
|
this.setTexture2D = ( function () {
|
|
|
|
var warned = false;
|
|
|
|
// backwards compatibility: peel texture.texture
|
|
return function setTexture2D( texture, slot ) {
|
|
|
|
if ( texture && texture.isWebGLRenderTarget ) {
|
|
|
|
if ( ! warned ) {
|
|
|
|
console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
|
|
warned = true;
|
|
|
|
}
|
|
|
|
texture = texture.texture;
|
|
|
|
}
|
|
|
|
textures.setTexture2D( texture, slot );
|
|
|
|
};
|
|
|
|
}() );
|
|
|
|
this.setTexture = ( function () {
|
|
|
|
var warned = false;
|
|
|
|
return function setTexture( texture, slot ) {
|
|
|
|
if ( ! warned ) {
|
|
|
|
console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." );
|
|
warned = true;
|
|
|
|
}
|
|
|
|
textures.setTexture2D( texture, slot );
|
|
|
|
};
|
|
|
|
}() );
|
|
|
|
this.setTextureCube = ( function () {
|
|
|
|
var warned = false;
|
|
|
|
return function setTextureCube( texture, slot ) {
|
|
|
|
// backwards compatibility: peel texture.texture
|
|
if ( texture && texture.isWebGLRenderTargetCube ) {
|
|
|
|
if ( ! warned ) {
|
|
|
|
console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." );
|
|
warned = true;
|
|
|
|
}
|
|
|
|
texture = texture.texture;
|
|
|
|
}
|
|
|
|
// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
|
|
// TODO: unify these code paths
|
|
if ( ( texture && texture.isCubeTexture ) ||
|
|
( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
|
|
|
|
// CompressedTexture can have Array in image :/
|
|
|
|
// this function alone should take care of cube textures
|
|
textures.setTextureCube( texture, slot );
|
|
|
|
} else {
|
|
|
|
// assumed: texture property of THREE.WebGLRenderTargetCube
|
|
|
|
textures.setTextureCubeDynamic( texture, slot );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}() );
|
|
|
|
this.getRenderTarget = function () {
|
|
|
|
return _currentRenderTarget;
|
|
|
|
};
|
|
|
|
this.setRenderTarget = function ( renderTarget ) {
|
|
|
|
_currentRenderTarget = renderTarget;
|
|
|
|
if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
|
|
|
|
textures.setupRenderTarget( renderTarget );
|
|
|
|
}
|
|
|
|
var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );
|
|
var framebuffer;
|
|
|
|
if ( renderTarget ) {
|
|
|
|
var renderTargetProperties = properties.get( renderTarget );
|
|
|
|
if ( isCube ) {
|
|
|
|
framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];
|
|
|
|
} else {
|
|
|
|
framebuffer = renderTargetProperties.__webglFramebuffer;
|
|
|
|
}
|
|
|
|
_currentScissor.copy( renderTarget.scissor );
|
|
_currentScissorTest = renderTarget.scissorTest;
|
|
|
|
_currentViewport.copy( renderTarget.viewport );
|
|
|
|
} else {
|
|
|
|
framebuffer = null;
|
|
|
|
_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );
|
|
_currentScissorTest = _scissorTest;
|
|
|
|
_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );
|
|
|
|
}
|
|
|
|
if ( _currentFramebuffer !== framebuffer ) {
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
_currentFramebuffer = framebuffer;
|
|
|
|
}
|
|
|
|
state.scissor( _currentScissor );
|
|
state.setScissorTest( _currentScissorTest );
|
|
|
|
state.viewport( _currentViewport );
|
|
|
|
if ( isCube ) {
|
|
|
|
var textureProperties = properties.get( renderTarget.texture );
|
|
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {
|
|
|
|
if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {
|
|
|
|
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
|
|
return;
|
|
|
|
}
|
|
|
|
var framebuffer = properties.get( renderTarget ).__webglFramebuffer;
|
|
|
|
if ( framebuffer ) {
|
|
|
|
var restore = false;
|
|
|
|
if ( framebuffer !== _currentFramebuffer ) {
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
|
|
|
|
restore = true;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
var texture = renderTarget.texture;
|
|
var textureFormat = texture.format;
|
|
var textureType = texture.type;
|
|
|
|
if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
|
|
|
|
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)
|
|
! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
|
|
! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {
|
|
|
|
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
|
|
|
|
// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
|
|
|
|
if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
|
|
|
|
_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
if ( restore ) {
|
|
|
|
_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
// Map three.js constants to WebGL constants
|
|
|
|
function paramThreeToGL( p ) {
|
|
|
|
var extension;
|
|
|
|
if ( p === RepeatWrapping ) return _gl.REPEAT;
|
|
if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;
|
|
if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;
|
|
|
|
if ( p === NearestFilter ) return _gl.NEAREST;
|
|
if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;
|
|
if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;
|
|
|
|
if ( p === LinearFilter ) return _gl.LINEAR;
|
|
if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;
|
|
if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;
|
|
|
|
if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;
|
|
if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;
|
|
if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;
|
|
if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;
|
|
|
|
if ( p === ByteType ) return _gl.BYTE;
|
|
if ( p === ShortType ) return _gl.SHORT;
|
|
if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;
|
|
if ( p === IntType ) return _gl.INT;
|
|
if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;
|
|
if ( p === FloatType ) return _gl.FLOAT;
|
|
|
|
if ( p === HalfFloatType ) {
|
|
|
|
extension = extensions.get( 'OES_texture_half_float' );
|
|
|
|
if ( extension !== null ) return extension.HALF_FLOAT_OES;
|
|
|
|
}
|
|
|
|
if ( p === AlphaFormat ) return _gl.ALPHA;
|
|
if ( p === RGBFormat ) return _gl.RGB;
|
|
if ( p === RGBAFormat ) return _gl.RGBA;
|
|
if ( p === LuminanceFormat ) return _gl.LUMINANCE;
|
|
if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;
|
|
if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;
|
|
if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;
|
|
|
|
if ( p === AddEquation ) return _gl.FUNC_ADD;
|
|
if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;
|
|
if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;
|
|
|
|
if ( p === ZeroFactor ) return _gl.ZERO;
|
|
if ( p === OneFactor ) return _gl.ONE;
|
|
if ( p === SrcColorFactor ) return _gl.SRC_COLOR;
|
|
if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;
|
|
if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;
|
|
if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;
|
|
if ( p === DstAlphaFactor ) return _gl.DST_ALPHA;
|
|
if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;
|
|
|
|
if ( p === DstColorFactor ) return _gl.DST_COLOR;
|
|
if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;
|
|
if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;
|
|
|
|
if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||
|
|
p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
|
|
|
|
extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
|
|
|
|
if ( extension !== null ) {
|
|
|
|
if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
|
|
if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
|
if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
|
if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
|
|
p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
|
|
|
|
extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );
|
|
|
|
if ( extension !== null ) {
|
|
|
|
if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
|
|
if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
|
|
if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
|
|
if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( p === RGB_ETC1_Format ) {
|
|
|
|
extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
|
|
|
|
if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
|
|
|
|
}
|
|
|
|
if ( p === MinEquation || p === MaxEquation ) {
|
|
|
|
extension = extensions.get( 'EXT_blend_minmax' );
|
|
|
|
if ( extension !== null ) {
|
|
|
|
if ( p === MinEquation ) return extension.MIN_EXT;
|
|
if ( p === MaxEquation ) return extension.MAX_EXT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( p === UnsignedInt248Type ) {
|
|
|
|
extension = extensions.get( 'WEBGL_depth_texture' );
|
|
|
|
if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function FogExp2 ( color, density ) {
|
|
|
|
this.name = '';
|
|
|
|
this.color = new Color( color );
|
|
this.density = ( density !== undefined ) ? density : 0.00025;
|
|
|
|
}
|
|
|
|
FogExp2.prototype.isFogExp2 = true;
|
|
|
|
FogExp2.prototype.clone = function () {
|
|
|
|
return new FogExp2( this.color.getHex(), this.density );
|
|
|
|
};
|
|
|
|
FogExp2.prototype.toJSON = function ( meta ) {
|
|
|
|
return {
|
|
type: 'FogExp2',
|
|
color: this.color.getHex(),
|
|
density: this.density
|
|
};
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Fog ( color, near, far ) {
|
|
|
|
this.name = '';
|
|
|
|
this.color = new Color( color );
|
|
|
|
this.near = ( near !== undefined ) ? near : 1;
|
|
this.far = ( far !== undefined ) ? far : 1000;
|
|
|
|
}
|
|
|
|
Fog.prototype.isFog = true;
|
|
|
|
Fog.prototype.clone = function () {
|
|
|
|
return new Fog( this.color.getHex(), this.near, this.far );
|
|
|
|
};
|
|
|
|
Fog.prototype.toJSON = function ( meta ) {
|
|
|
|
return {
|
|
type: 'Fog',
|
|
color: this.color.getHex(),
|
|
near: this.near,
|
|
far: this.far
|
|
};
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Scene () {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Scene';
|
|
|
|
this.background = null;
|
|
this.fog = null;
|
|
this.overrideMaterial = null;
|
|
|
|
this.autoUpdate = true; // checked by the renderer
|
|
|
|
}
|
|
|
|
Scene.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Scene,
|
|
|
|
copy: function ( source, recursive ) {
|
|
|
|
Object3D.prototype.copy.call( this, source, recursive );
|
|
|
|
if ( source.background !== null ) this.background = source.background.clone();
|
|
if ( source.fog !== null ) this.fog = source.fog.clone();
|
|
if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();
|
|
|
|
this.autoUpdate = source.autoUpdate;
|
|
this.matrixAutoUpdate = source.matrixAutoUpdate;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var data = Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
if ( this.background !== null ) data.object.background = this.background.toJSON( meta );
|
|
if ( this.fog !== null ) data.object.fog = this.fog.toJSON();
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function LensFlare( texture, size, distance, blending, color ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.lensFlares = [];
|
|
|
|
this.positionScreen = new Vector3();
|
|
this.customUpdateCallback = undefined;
|
|
|
|
if ( texture !== undefined ) {
|
|
|
|
this.add( texture, size, distance, blending, color );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: LensFlare,
|
|
|
|
isLensFlare: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Object3D.prototype.copy.call( this, source );
|
|
|
|
this.positionScreen.copy( source.positionScreen );
|
|
this.customUpdateCallback = source.customUpdateCallback;
|
|
|
|
for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {
|
|
|
|
this.lensFlares.push( source.lensFlares[ i ] );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
add: function ( texture, size, distance, blending, color, opacity ) {
|
|
|
|
if ( size === undefined ) size = - 1;
|
|
if ( distance === undefined ) distance = 0;
|
|
if ( opacity === undefined ) opacity = 1;
|
|
if ( color === undefined ) color = new Color( 0xffffff );
|
|
if ( blending === undefined ) blending = NormalBlending;
|
|
|
|
distance = Math.min( distance, Math.max( 0, distance ) );
|
|
|
|
this.lensFlares.push( {
|
|
texture: texture, // THREE.Texture
|
|
size: size, // size in pixels (-1 = use texture.width)
|
|
distance: distance, // distance (0-1) from light source (0=at light source)
|
|
x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back
|
|
scale: 1, // scale
|
|
rotation: 0, // rotation
|
|
opacity: opacity, // opacity
|
|
color: color, // color
|
|
blending: blending // blending
|
|
} );
|
|
|
|
},
|
|
|
|
/*
|
|
* Update lens flares update positions on all flares based on the screen position
|
|
* Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.
|
|
*/
|
|
|
|
updateLensFlares: function () {
|
|
|
|
var f, fl = this.lensFlares.length;
|
|
var flare;
|
|
var vecX = - this.positionScreen.x * 2;
|
|
var vecY = - this.positionScreen.y * 2;
|
|
|
|
for ( f = 0; f < fl; f ++ ) {
|
|
|
|
flare = this.lensFlares[ f ];
|
|
|
|
flare.x = this.positionScreen.x + vecX * flare.distance;
|
|
flare.y = this.positionScreen.y + vecY * flare.distance;
|
|
|
|
flare.wantedRotation = flare.x * Math.PI * 0.25;
|
|
flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* opacity: <float>,
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* uvOffset: new THREE.Vector2(),
|
|
* uvScale: new THREE.Vector2()
|
|
* }
|
|
*/
|
|
|
|
function SpriteMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'SpriteMaterial';
|
|
|
|
this.color = new Color( 0xffffff );
|
|
this.map = null;
|
|
|
|
this.rotation = 0;
|
|
|
|
this.fog = false;
|
|
this.lights = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
SpriteMaterial.prototype = Object.create( Material.prototype );
|
|
SpriteMaterial.prototype.constructor = SpriteMaterial;
|
|
SpriteMaterial.prototype.isSpriteMaterial = true;
|
|
|
|
SpriteMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
this.map = source.map;
|
|
|
|
this.rotation = source.rotation;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Sprite( material ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Sprite';
|
|
|
|
this.material = ( material !== undefined ) ? material : new SpriteMaterial();
|
|
|
|
}
|
|
|
|
Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Sprite,
|
|
|
|
isSprite: true,
|
|
|
|
raycast: ( function () {
|
|
|
|
var intersectPoint = new Vector3();
|
|
var worldPosition = new Vector3();
|
|
var worldScale = new Vector3();
|
|
|
|
return function raycast( raycaster, intersects ) {
|
|
|
|
worldPosition.setFromMatrixPosition( this.matrixWorld );
|
|
raycaster.ray.closestPointToPoint( worldPosition, intersectPoint );
|
|
|
|
worldScale.setFromMatrixScale( this.matrixWorld );
|
|
var guessSizeSq = worldScale.x * worldScale.y / 4;
|
|
|
|
if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return;
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( intersectPoint );
|
|
|
|
if ( distance < raycaster.near || distance > raycaster.far ) return;
|
|
|
|
intersects.push( {
|
|
|
|
distance: distance,
|
|
point: intersectPoint.clone(),
|
|
face: null,
|
|
object: this
|
|
|
|
} );
|
|
|
|
};
|
|
|
|
}() ),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.material ).copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function LOD() {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'LOD';
|
|
|
|
Object.defineProperties( this, {
|
|
levels: {
|
|
enumerable: true,
|
|
value: []
|
|
}
|
|
} );
|
|
|
|
}
|
|
|
|
LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: LOD,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Object3D.prototype.copy.call( this, source, false );
|
|
|
|
var levels = source.levels;
|
|
|
|
for ( var i = 0, l = levels.length; i < l; i ++ ) {
|
|
|
|
var level = levels[ i ];
|
|
|
|
this.addLevel( level.object.clone(), level.distance );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
addLevel: function ( object, distance ) {
|
|
|
|
if ( distance === undefined ) distance = 0;
|
|
|
|
distance = Math.abs( distance );
|
|
|
|
var levels = this.levels;
|
|
|
|
for ( var l = 0; l < levels.length; l ++ ) {
|
|
|
|
if ( distance < levels[ l ].distance ) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
levels.splice( l, 0, { distance: distance, object: object } );
|
|
|
|
this.add( object );
|
|
|
|
},
|
|
|
|
getObjectForDistance: function ( distance ) {
|
|
|
|
var levels = this.levels;
|
|
|
|
for ( var i = 1, l = levels.length; i < l; i ++ ) {
|
|
|
|
if ( distance < levels[ i ].distance ) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return levels[ i - 1 ].object;
|
|
|
|
},
|
|
|
|
raycast: ( function () {
|
|
|
|
var matrixPosition = new Vector3();
|
|
|
|
return function raycast( raycaster, intersects ) {
|
|
|
|
matrixPosition.setFromMatrixPosition( this.matrixWorld );
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( matrixPosition );
|
|
|
|
this.getObjectForDistance( distance ).raycast( raycaster, intersects );
|
|
|
|
};
|
|
|
|
}() ),
|
|
|
|
update: function () {
|
|
|
|
var v1 = new Vector3();
|
|
var v2 = new Vector3();
|
|
|
|
return function update( camera ) {
|
|
|
|
var levels = this.levels;
|
|
|
|
if ( levels.length > 1 ) {
|
|
|
|
v1.setFromMatrixPosition( camera.matrixWorld );
|
|
v2.setFromMatrixPosition( this.matrixWorld );
|
|
|
|
var distance = v1.distanceTo( v2 );
|
|
|
|
levels[ 0 ].object.visible = true;
|
|
|
|
for ( var i = 1, l = levels.length; i < l; i ++ ) {
|
|
|
|
if ( distance >= levels[ i ].distance ) {
|
|
|
|
levels[ i - 1 ].object.visible = false;
|
|
levels[ i ].object.visible = true;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( ; i < l; i ++ ) {
|
|
|
|
levels[ i ].object.visible = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var data = Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
data.object.levels = [];
|
|
|
|
var levels = this.levels;
|
|
|
|
for ( var i = 0, l = levels.length; i < l; i ++ ) {
|
|
|
|
var level = levels[ i ];
|
|
|
|
data.object.levels.push( {
|
|
object: level.object.uuid,
|
|
distance: level.distance
|
|
} );
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author michael guerrero / http://realitymeltdown.com
|
|
* @author ikerr / http://verold.com
|
|
*/
|
|
|
|
function Skeleton( bones, boneInverses ) {
|
|
|
|
// copy the bone array
|
|
|
|
bones = bones || [];
|
|
|
|
this.bones = bones.slice( 0 );
|
|
this.boneMatrices = new Float32Array( this.bones.length * 16 );
|
|
|
|
// use the supplied bone inverses or calculate the inverses
|
|
|
|
if ( boneInverses === undefined ) {
|
|
|
|
this.calculateInverses();
|
|
|
|
} else {
|
|
|
|
if ( this.bones.length === boneInverses.length ) {
|
|
|
|
this.boneInverses = boneInverses.slice( 0 );
|
|
|
|
} else {
|
|
|
|
console.warn( 'THREE.Skeleton boneInverses is the wrong length.' );
|
|
|
|
this.boneInverses = [];
|
|
|
|
for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
|
|
|
|
this.boneInverses.push( new Matrix4() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Object.assign( Skeleton.prototype, {
|
|
|
|
calculateInverses: function () {
|
|
|
|
this.boneInverses = [];
|
|
|
|
for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
|
|
|
|
var inverse = new Matrix4();
|
|
|
|
if ( this.bones[ i ] ) {
|
|
|
|
inverse.getInverse( this.bones[ i ].matrixWorld );
|
|
|
|
}
|
|
|
|
this.boneInverses.push( inverse );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
pose: function () {
|
|
|
|
var bone, i, il;
|
|
|
|
// recover the bind-time world matrices
|
|
|
|
for ( i = 0, il = this.bones.length; i < il; i ++ ) {
|
|
|
|
bone = this.bones[ i ];
|
|
|
|
if ( bone ) {
|
|
|
|
bone.matrixWorld.getInverse( this.boneInverses[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// compute the local matrices, positions, rotations and scales
|
|
|
|
for ( i = 0, il = this.bones.length; i < il; i ++ ) {
|
|
|
|
bone = this.bones[ i ];
|
|
|
|
if ( bone ) {
|
|
|
|
if ( bone.parent && bone.parent.isBone ) {
|
|
|
|
bone.matrix.getInverse( bone.parent.matrixWorld );
|
|
bone.matrix.multiply( bone.matrixWorld );
|
|
|
|
} else {
|
|
|
|
bone.matrix.copy( bone.matrixWorld );
|
|
|
|
}
|
|
|
|
bone.matrix.decompose( bone.position, bone.quaternion, bone.scale );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
update: ( function () {
|
|
|
|
var offsetMatrix = new Matrix4();
|
|
var identityMatrix = new Matrix4();
|
|
|
|
return function update() {
|
|
|
|
var bones = this.bones;
|
|
var boneInverses = this.boneInverses;
|
|
var boneMatrices = this.boneMatrices;
|
|
var boneTexture = this.boneTexture;
|
|
|
|
// flatten bone matrices to array
|
|
|
|
for ( var i = 0, il = bones.length; i < il; i ++ ) {
|
|
|
|
// compute the offset between the current and the original transform
|
|
|
|
var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;
|
|
|
|
offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );
|
|
offsetMatrix.toArray( boneMatrices, i * 16 );
|
|
|
|
}
|
|
|
|
if ( boneTexture !== undefined ) {
|
|
|
|
boneTexture.needsUpdate = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
} )(),
|
|
|
|
clone: function () {
|
|
|
|
return new Skeleton( this.bones, this.boneInverses );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author ikerr / http://verold.com
|
|
*/
|
|
|
|
function Bone() {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Bone';
|
|
|
|
}
|
|
|
|
Bone.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Bone,
|
|
|
|
isBone: true
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mikael emtinger / http://gomo.se/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author ikerr / http://verold.com
|
|
*/
|
|
|
|
function SkinnedMesh( geometry, material ) {
|
|
|
|
Mesh.call( this, geometry, material );
|
|
|
|
this.type = 'SkinnedMesh';
|
|
|
|
this.bindMode = 'attached';
|
|
this.bindMatrix = new Matrix4();
|
|
this.bindMatrixInverse = new Matrix4();
|
|
|
|
var bones = this.initBones();
|
|
var skeleton = new Skeleton( bones );
|
|
|
|
this.bind( skeleton, this.matrixWorld );
|
|
|
|
this.normalizeSkinWeights();
|
|
|
|
}
|
|
|
|
SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
|
|
|
|
constructor: SkinnedMesh,
|
|
|
|
isSkinnedMesh: true,
|
|
|
|
initBones: function () {
|
|
|
|
var bones = [], bone, gbone;
|
|
var i, il;
|
|
|
|
if ( this.geometry && this.geometry.bones !== undefined ) {
|
|
|
|
// first, create array of 'Bone' objects from geometry data
|
|
|
|
for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
|
|
|
|
gbone = this.geometry.bones[ i ];
|
|
|
|
// create new 'Bone' object
|
|
|
|
bone = new Bone();
|
|
bones.push( bone );
|
|
|
|
// apply values
|
|
|
|
bone.name = gbone.name;
|
|
bone.position.fromArray( gbone.pos );
|
|
bone.quaternion.fromArray( gbone.rotq );
|
|
if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );
|
|
|
|
}
|
|
|
|
// second, create bone hierarchy
|
|
|
|
for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
|
|
|
|
gbone = this.geometry.bones[ i ];
|
|
|
|
if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {
|
|
|
|
// subsequent bones in the hierarchy
|
|
|
|
bones[ gbone.parent ].add( bones[ i ] );
|
|
|
|
} else {
|
|
|
|
// topmost bone, immediate child of the skinned mesh
|
|
|
|
this.add( bones[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// now the bones are part of the scene graph and children of the skinned mesh.
|
|
// let's update the corresponding matrices
|
|
|
|
this.updateMatrixWorld( true );
|
|
|
|
return bones;
|
|
|
|
},
|
|
|
|
bind: function ( skeleton, bindMatrix ) {
|
|
|
|
this.skeleton = skeleton;
|
|
|
|
if ( bindMatrix === undefined ) {
|
|
|
|
this.updateMatrixWorld( true );
|
|
|
|
this.skeleton.calculateInverses();
|
|
|
|
bindMatrix = this.matrixWorld;
|
|
|
|
}
|
|
|
|
this.bindMatrix.copy( bindMatrix );
|
|
this.bindMatrixInverse.getInverse( bindMatrix );
|
|
|
|
},
|
|
|
|
pose: function () {
|
|
|
|
this.skeleton.pose();
|
|
|
|
},
|
|
|
|
normalizeSkinWeights: function () {
|
|
|
|
var scale, i;
|
|
|
|
if ( this.geometry && this.geometry.isGeometry ) {
|
|
|
|
for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) {
|
|
|
|
var sw = this.geometry.skinWeights[ i ];
|
|
|
|
scale = 1.0 / sw.lengthManhattan();
|
|
|
|
if ( scale !== Infinity ) {
|
|
|
|
sw.multiplyScalar( scale );
|
|
|
|
} else {
|
|
|
|
sw.set( 1, 0, 0, 0 ); // do something reasonable
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ( this.geometry && this.geometry.isBufferGeometry ) {
|
|
|
|
var vec = new Vector4();
|
|
|
|
var skinWeight = this.geometry.attributes.skinWeight;
|
|
|
|
for ( i = 0; i < skinWeight.count; i ++ ) {
|
|
|
|
vec.x = skinWeight.getX( i );
|
|
vec.y = skinWeight.getY( i );
|
|
vec.z = skinWeight.getZ( i );
|
|
vec.w = skinWeight.getW( i );
|
|
|
|
scale = 1.0 / vec.lengthManhattan();
|
|
|
|
if ( scale !== Infinity ) {
|
|
|
|
vec.multiplyScalar( scale );
|
|
|
|
} else {
|
|
|
|
vec.set( 1, 0, 0, 0 ); // do something reasonable
|
|
|
|
}
|
|
|
|
skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
updateMatrixWorld: function ( force ) {
|
|
|
|
Mesh.prototype.updateMatrixWorld.call( this, force );
|
|
|
|
if ( this.bindMode === 'attached' ) {
|
|
|
|
this.bindMatrixInverse.getInverse( this.matrixWorld );
|
|
|
|
} else if ( this.bindMode === 'detached' ) {
|
|
|
|
this.bindMatrixInverse.getInverse( this.bindMatrix );
|
|
|
|
} else {
|
|
|
|
console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.geometry, this.material ).copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* opacity: <float>,
|
|
*
|
|
* linewidth: <float>,
|
|
* linecap: "round",
|
|
* linejoin: "round"
|
|
* }
|
|
*/
|
|
|
|
function LineBasicMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'LineBasicMaterial';
|
|
|
|
this.color = new Color( 0xffffff );
|
|
|
|
this.linewidth = 1;
|
|
this.linecap = 'round';
|
|
this.linejoin = 'round';
|
|
|
|
this.lights = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
LineBasicMaterial.prototype = Object.create( Material.prototype );
|
|
LineBasicMaterial.prototype.constructor = LineBasicMaterial;
|
|
|
|
LineBasicMaterial.prototype.isLineBasicMaterial = true;
|
|
|
|
LineBasicMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
|
|
this.linewidth = source.linewidth;
|
|
this.linecap = source.linecap;
|
|
this.linejoin = source.linejoin;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Line( geometry, material, mode ) {
|
|
|
|
if ( mode === 1 ) {
|
|
|
|
console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );
|
|
return new LineSegments( geometry, material );
|
|
|
|
}
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Line';
|
|
|
|
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
|
|
this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );
|
|
|
|
}
|
|
|
|
Line.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Line,
|
|
|
|
isLine: true,
|
|
|
|
raycast: ( function () {
|
|
|
|
var inverseMatrix = new Matrix4();
|
|
var ray = new Ray();
|
|
var sphere = new Sphere();
|
|
|
|
return function raycast( raycaster, intersects ) {
|
|
|
|
var precision = raycaster.linePrecision;
|
|
var precisionSq = precision * precision;
|
|
|
|
var geometry = this.geometry;
|
|
var matrixWorld = this.matrixWorld;
|
|
|
|
// Checking boundingSphere distance to ray
|
|
|
|
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
|
|
|
|
sphere.copy( geometry.boundingSphere );
|
|
sphere.applyMatrix4( matrixWorld );
|
|
|
|
if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
|
|
|
|
//
|
|
|
|
inverseMatrix.getInverse( matrixWorld );
|
|
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
|
|
|
|
var vStart = new Vector3();
|
|
var vEnd = new Vector3();
|
|
var interSegment = new Vector3();
|
|
var interRay = new Vector3();
|
|
var step = (this && this.isLineSegments) ? 2 : 1;
|
|
|
|
if ( geometry.isBufferGeometry ) {
|
|
|
|
var index = geometry.index;
|
|
var attributes = geometry.attributes;
|
|
var positions = attributes.position.array;
|
|
|
|
if ( index !== null ) {
|
|
|
|
var indices = index.array;
|
|
|
|
for ( var i = 0, l = indices.length - 1; i < l; i += step ) {
|
|
|
|
var a = indices[ i ];
|
|
var b = indices[ i + 1 ];
|
|
|
|
vStart.fromArray( positions, a * 3 );
|
|
vEnd.fromArray( positions, b * 3 );
|
|
|
|
var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
|
|
|
|
if ( distSq > precisionSq ) continue;
|
|
|
|
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( interRay );
|
|
|
|
if ( distance < raycaster.near || distance > raycaster.far ) continue;
|
|
|
|
intersects.push( {
|
|
|
|
distance: distance,
|
|
// What do we want? intersection point on the ray or on the segment??
|
|
// point: raycaster.ray.at( distance ),
|
|
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
|
|
index: i,
|
|
face: null,
|
|
faceIndex: null,
|
|
object: this
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {
|
|
|
|
vStart.fromArray( positions, 3 * i );
|
|
vEnd.fromArray( positions, 3 * i + 3 );
|
|
|
|
var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
|
|
|
|
if ( distSq > precisionSq ) continue;
|
|
|
|
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( interRay );
|
|
|
|
if ( distance < raycaster.near || distance > raycaster.far ) continue;
|
|
|
|
intersects.push( {
|
|
|
|
distance: distance,
|
|
// What do we want? intersection point on the ray or on the segment??
|
|
// point: raycaster.ray.at( distance ),
|
|
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
|
|
index: i,
|
|
face: null,
|
|
faceIndex: null,
|
|
object: this
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ( geometry.isGeometry ) {
|
|
|
|
var vertices = geometry.vertices;
|
|
var nbVertices = vertices.length;
|
|
|
|
for ( var i = 0; i < nbVertices - 1; i += step ) {
|
|
|
|
var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );
|
|
|
|
if ( distSq > precisionSq ) continue;
|
|
|
|
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( interRay );
|
|
|
|
if ( distance < raycaster.near || distance > raycaster.far ) continue;
|
|
|
|
intersects.push( {
|
|
|
|
distance: distance,
|
|
// What do we want? intersection point on the ray or on the segment??
|
|
// point: raycaster.ray.at( distance ),
|
|
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
|
|
index: i,
|
|
face: null,
|
|
faceIndex: null,
|
|
object: this
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}() ),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.geometry, this.material ).copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function LineSegments( geometry, material ) {
|
|
|
|
Line.call( this, geometry, material );
|
|
|
|
this.type = 'LineSegments';
|
|
|
|
}
|
|
|
|
LineSegments.prototype = Object.assign( Object.create( Line.prototype ), {
|
|
|
|
constructor: LineSegments,
|
|
|
|
isLineSegments: true
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mgreter / http://github.com/mgreter
|
|
*/
|
|
|
|
function LineLoop( geometry, material ) {
|
|
|
|
Line.call( this, geometry, material );
|
|
|
|
this.type = 'LineLoop';
|
|
|
|
}
|
|
|
|
LineLoop.prototype = Object.assign( Object.create( Line.prototype ), {
|
|
|
|
constructor: LineLoop,
|
|
|
|
isLineLoop: true,
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* opacity: <float>,
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* size: <float>,
|
|
* sizeAttenuation: <bool>
|
|
* }
|
|
*/
|
|
|
|
function PointsMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'PointsMaterial';
|
|
|
|
this.color = new Color( 0xffffff );
|
|
|
|
this.map = null;
|
|
|
|
this.size = 1;
|
|
this.sizeAttenuation = true;
|
|
|
|
this.lights = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
PointsMaterial.prototype = Object.create( Material.prototype );
|
|
PointsMaterial.prototype.constructor = PointsMaterial;
|
|
|
|
PointsMaterial.prototype.isPointsMaterial = true;
|
|
|
|
PointsMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
|
|
this.map = source.map;
|
|
|
|
this.size = source.size;
|
|
this.sizeAttenuation = source.sizeAttenuation;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Points( geometry, material ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Points';
|
|
|
|
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
|
|
this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );
|
|
|
|
}
|
|
|
|
Points.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Points,
|
|
|
|
isPoints: true,
|
|
|
|
raycast: ( function () {
|
|
|
|
var inverseMatrix = new Matrix4();
|
|
var ray = new Ray();
|
|
var sphere = new Sphere();
|
|
|
|
return function raycast( raycaster, intersects ) {
|
|
|
|
var object = this;
|
|
var geometry = this.geometry;
|
|
var matrixWorld = this.matrixWorld;
|
|
var threshold = raycaster.params.Points.threshold;
|
|
|
|
// Checking boundingSphere distance to ray
|
|
|
|
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
|
|
|
|
sphere.copy( geometry.boundingSphere );
|
|
sphere.applyMatrix4( matrixWorld );
|
|
sphere.radius += threshold;
|
|
|
|
if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
|
|
|
|
//
|
|
|
|
inverseMatrix.getInverse( matrixWorld );
|
|
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
|
|
|
|
var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );
|
|
var localThresholdSq = localThreshold * localThreshold;
|
|
var position = new Vector3();
|
|
|
|
function testPoint( point, index ) {
|
|
|
|
var rayPointDistanceSq = ray.distanceSqToPoint( point );
|
|
|
|
if ( rayPointDistanceSq < localThresholdSq ) {
|
|
|
|
var intersectPoint = ray.closestPointToPoint( point );
|
|
intersectPoint.applyMatrix4( matrixWorld );
|
|
|
|
var distance = raycaster.ray.origin.distanceTo( intersectPoint );
|
|
|
|
if ( distance < raycaster.near || distance > raycaster.far ) return;
|
|
|
|
intersects.push( {
|
|
|
|
distance: distance,
|
|
distanceToRay: Math.sqrt( rayPointDistanceSq ),
|
|
point: intersectPoint.clone(),
|
|
index: index,
|
|
face: null,
|
|
object: object
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( geometry.isBufferGeometry ) {
|
|
|
|
var index = geometry.index;
|
|
var attributes = geometry.attributes;
|
|
var positions = attributes.position.array;
|
|
|
|
if ( index !== null ) {
|
|
|
|
var indices = index.array;
|
|
|
|
for ( var i = 0, il = indices.length; i < il; i ++ ) {
|
|
|
|
var a = indices[ i ];
|
|
|
|
position.fromArray( positions, a * 3 );
|
|
|
|
testPoint( position, a );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for ( var i = 0, l = positions.length / 3; i < l; i ++ ) {
|
|
|
|
position.fromArray( positions, i * 3 );
|
|
|
|
testPoint( position, i );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var vertices = geometry.vertices;
|
|
|
|
for ( var i = 0, l = vertices.length; i < l; i ++ ) {
|
|
|
|
testPoint( vertices[ i ], i );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}() ),
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor( this.geometry, this.material ).copy( this );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Group() {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Group';
|
|
|
|
}
|
|
|
|
Group.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Group
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
|
|
|
|
Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
|
|
|
|
this.generateMipmaps = false;
|
|
|
|
var scope = this;
|
|
|
|
function update() {
|
|
|
|
requestAnimationFrame( update );
|
|
|
|
if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
|
|
|
|
scope.needsUpdate = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
VideoTexture.prototype = Object.create( Texture.prototype );
|
|
VideoTexture.prototype.constructor = VideoTexture;
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {
|
|
|
|
Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
|
|
|
|
this.image = { width: width, height: height };
|
|
this.mipmaps = mipmaps;
|
|
|
|
// no flipping for cube textures
|
|
// (also flipping doesn't work for compressed textures )
|
|
|
|
this.flipY = false;
|
|
|
|
// can't generate mipmaps for compressed textures
|
|
// mips must be embedded in DDS files
|
|
|
|
this.generateMipmaps = false;
|
|
|
|
}
|
|
|
|
CompressedTexture.prototype = Object.create( Texture.prototype );
|
|
CompressedTexture.prototype.constructor = CompressedTexture;
|
|
|
|
CompressedTexture.prototype.isCompressedTexture = true;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
|
|
|
|
Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
|
|
|
|
this.needsUpdate = true;
|
|
|
|
}
|
|
|
|
CanvasTexture.prototype = Object.create( Texture.prototype );
|
|
CanvasTexture.prototype.constructor = CanvasTexture;
|
|
|
|
/**
|
|
* @author Matt DesLauriers / @mattdesl
|
|
* @author atix / arthursilber.de
|
|
*/
|
|
|
|
function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {
|
|
|
|
format = format !== undefined ? format : DepthFormat;
|
|
|
|
if ( format !== DepthFormat && format !== DepthStencilFormat ) {
|
|
|
|
throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' )
|
|
|
|
}
|
|
|
|
if ( type === undefined && format === DepthFormat ) type = UnsignedShortType;
|
|
if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;
|
|
|
|
Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
|
|
|
|
this.image = { width: width, height: height };
|
|
|
|
this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
|
|
this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
|
|
|
|
this.flipY = false;
|
|
this.generateMipmaps = false;
|
|
|
|
}
|
|
|
|
DepthTexture.prototype = Object.create( Texture.prototype );
|
|
DepthTexture.prototype.constructor = DepthTexture;
|
|
DepthTexture.prototype.isDepthTexture = true;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
function WireframeGeometry( geometry ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'WireframeGeometry';
|
|
|
|
// buffer
|
|
|
|
var vertices = [];
|
|
|
|
// helper variables
|
|
|
|
var i, j, l, o, ol;
|
|
var edge = [ 0, 0 ], edges = {}, e, edge1, edge2;
|
|
var key, keys = [ 'a', 'b', 'c' ];
|
|
var vertex;
|
|
|
|
// different logic for Geometry and BufferGeometry
|
|
|
|
if ( geometry && geometry.isGeometry ) {
|
|
|
|
// create a data structure that contains all edges without duplicates
|
|
|
|
var faces = geometry.faces;
|
|
|
|
for ( i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
for ( j = 0; j < 3; j ++ ) {
|
|
|
|
edge1 = face[ keys[ j ] ];
|
|
edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
|
|
edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates
|
|
edge[ 1 ] = Math.max( edge1, edge2 );
|
|
|
|
key = edge[ 0 ] + ',' + edge[ 1 ];
|
|
|
|
if ( edges[ key ] === undefined ) {
|
|
|
|
edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// generate vertices
|
|
|
|
for ( key in edges ) {
|
|
|
|
e = edges[ key ];
|
|
|
|
vertex = geometry.vertices[ e.index1 ];
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
vertex = geometry.vertices[ e.index2 ];
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
} else if ( geometry && geometry.isBufferGeometry ) {
|
|
|
|
var position, indices, groups;
|
|
var group, start, count;
|
|
var index1, index2;
|
|
|
|
vertex = new Vector3();
|
|
|
|
if ( geometry.index !== null ) {
|
|
|
|
// indexed BufferGeometry
|
|
|
|
position = geometry.attributes.position;
|
|
indices = geometry.index;
|
|
groups = geometry.groups;
|
|
|
|
if ( groups.length === 0 ) {
|
|
|
|
groups = [ { start: 0, count: indices.count, materialIndex: 0 } ];
|
|
|
|
}
|
|
|
|
// create a data structure that contains all eges without duplicates
|
|
|
|
for ( o = 0, ol = groups.length; o < ol; ++ o ) {
|
|
|
|
group = groups[ o ];
|
|
|
|
start = group.start;
|
|
count = group.count;
|
|
|
|
for ( i = start, l = ( start + count ); i < l; i += 3 ) {
|
|
|
|
for ( j = 0; j < 3; j ++ ) {
|
|
|
|
edge1 = indices.getX( i + j );
|
|
edge2 = indices.getX( i + ( j + 1 ) % 3 );
|
|
edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates
|
|
edge[ 1 ] = Math.max( edge1, edge2 );
|
|
|
|
key = edge[ 0 ] + ',' + edge[ 1 ];
|
|
|
|
if ( edges[ key ] === undefined ) {
|
|
|
|
edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// generate vertices
|
|
|
|
for ( key in edges ) {
|
|
|
|
e = edges[ key ];
|
|
|
|
vertex.fromBufferAttribute( position, e.index1 );
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
vertex.fromBufferAttribute( position, e.index2 );
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// non-indexed BufferGeometry
|
|
|
|
position = geometry.attributes.position;
|
|
|
|
for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {
|
|
|
|
for ( j = 0; j < 3; j ++ ) {
|
|
|
|
// three edges per triangle, an edge is represented as (index1, index2)
|
|
// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)
|
|
|
|
index1 = 3 * i + j;
|
|
vertex.fromBufferAttribute( position, index1 );
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
index2 = 3 * i + ( ( j + 1 ) % 3 );
|
|
vertex.fromBufferAttribute( position, index2 );
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
|
|
}
|
|
|
|
WireframeGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
WireframeGeometry.prototype.constructor = WireframeGeometry;
|
|
|
|
/**
|
|
* @author zz85 / https://github.com/zz85
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*
|
|
* Parametric Surfaces Geometry
|
|
* based on the brilliant article by @prideout http://prideout.net/blog/?p=44
|
|
*/
|
|
|
|
// ParametricGeometry
|
|
|
|
function ParametricGeometry( func, slices, stacks ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'ParametricGeometry';
|
|
|
|
this.parameters = {
|
|
func: func,
|
|
slices: slices,
|
|
stacks: stacks
|
|
};
|
|
|
|
this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
ParametricGeometry.prototype = Object.create( Geometry.prototype );
|
|
ParametricGeometry.prototype.constructor = ParametricGeometry;
|
|
|
|
// ParametricBufferGeometry
|
|
|
|
function ParametricBufferGeometry( func, slices, stacks ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'ParametricBufferGeometry';
|
|
|
|
this.parameters = {
|
|
func: func,
|
|
slices: slices,
|
|
stacks: stacks
|
|
};
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
var EPS = 0.00001;
|
|
|
|
var normal = new Vector3();
|
|
|
|
var p0 = new Vector3(), p1 = new Vector3();
|
|
var pu = new Vector3(), pv = new Vector3();
|
|
|
|
var i, j;
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
var sliceCount = slices + 1;
|
|
|
|
for ( i = 0; i <= stacks; i ++ ) {
|
|
|
|
var v = i / stacks;
|
|
|
|
for ( j = 0; j <= slices; j ++ ) {
|
|
|
|
var u = j / slices;
|
|
|
|
// vertex
|
|
|
|
p0 = func( u, v, p0 );
|
|
vertices.push( p0.x, p0.y, p0.z );
|
|
|
|
// normal
|
|
|
|
// approximate tangent vectors via finite differences
|
|
|
|
if ( u - EPS >= 0 ) {
|
|
|
|
p1 = func( u - EPS, v, p1 );
|
|
pu.subVectors( p0, p1 );
|
|
|
|
} else {
|
|
|
|
p1 = func( u + EPS, v, p1 );
|
|
pu.subVectors( p1, p0 );
|
|
|
|
}
|
|
|
|
if ( v - EPS >= 0 ) {
|
|
|
|
p1 = func( u, v - EPS, p1 );
|
|
pv.subVectors( p0, p1 );
|
|
|
|
} else {
|
|
|
|
p1 = func( u, v + EPS, p1 );
|
|
pv.subVectors( p1, p0 );
|
|
|
|
}
|
|
|
|
// cross product of tangent vectors returns surface normal
|
|
|
|
normal.crossVectors( pu, pv ).normalize();
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
// uv
|
|
|
|
uvs.push( u, v );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// generate indices
|
|
|
|
for ( i = 0; i < stacks; i ++ ) {
|
|
|
|
for ( j = 0; j < slices; j ++ ) {
|
|
|
|
var a = i * sliceCount + j;
|
|
var b = i * sliceCount + j + 1;
|
|
var c = ( i + 1 ) * sliceCount + j + 1;
|
|
var d = ( i + 1 ) * sliceCount + j;
|
|
|
|
// faces one and two
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
}
|
|
|
|
ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
|
|
|
|
/**
|
|
* @author clockworkgeek / https://github.com/clockworkgeek
|
|
* @author timothypratley / https://github.com/timothypratley
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// PolyhedronGeometry
|
|
|
|
function PolyhedronGeometry( vertices, indices, radius, detail ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'PolyhedronGeometry';
|
|
|
|
this.parameters = {
|
|
vertices: vertices,
|
|
indices: indices,
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
PolyhedronGeometry.prototype = Object.create( Geometry.prototype );
|
|
PolyhedronGeometry.prototype.constructor = PolyhedronGeometry;
|
|
|
|
// PolyhedronBufferGeometry
|
|
|
|
function PolyhedronBufferGeometry( vertices, indices, radius, detail ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'PolyhedronBufferGeometry';
|
|
|
|
this.parameters = {
|
|
vertices: vertices,
|
|
indices: indices,
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
radius = radius || 1;
|
|
detail = detail || 0;
|
|
|
|
// default buffer data
|
|
|
|
var vertexBuffer = [];
|
|
var uvBuffer = [];
|
|
|
|
// the subdivision creates the vertex buffer data
|
|
|
|
subdivide( detail );
|
|
|
|
// all vertices should lie on a conceptual sphere with a given radius
|
|
|
|
appplyRadius( radius );
|
|
|
|
// finally, create the uv data
|
|
|
|
generateUVs();
|
|
|
|
// build non-indexed geometry
|
|
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );
|
|
this.normalizeNormals();
|
|
|
|
// helper functions
|
|
|
|
function subdivide( detail ) {
|
|
|
|
var a = new Vector3();
|
|
var b = new Vector3();
|
|
var c = new Vector3();
|
|
|
|
// iterate over all faces and apply a subdivison with the given detail value
|
|
|
|
for ( var i = 0; i < indices.length; i += 3 ) {
|
|
|
|
// get the vertices of the face
|
|
|
|
getVertexByIndex( indices[ i + 0 ], a );
|
|
getVertexByIndex( indices[ i + 1 ], b );
|
|
getVertexByIndex( indices[ i + 2 ], c );
|
|
|
|
// perform subdivision
|
|
|
|
subdivideFace( a, b, c, detail );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function subdivideFace( a, b, c, detail ) {
|
|
|
|
var cols = Math.pow( 2, detail );
|
|
|
|
// we use this multidimensional array as a data structure for creating the subdivision
|
|
|
|
var v = [];
|
|
|
|
var i, j;
|
|
|
|
// construct all of the vertices for this subdivision
|
|
|
|
for ( i = 0; i <= cols; i ++ ) {
|
|
|
|
v[ i ] = [];
|
|
|
|
var aj = a.clone().lerp( c, i / cols );
|
|
var bj = b.clone().lerp( c, i / cols );
|
|
|
|
var rows = cols - i;
|
|
|
|
for ( j = 0; j <= rows; j ++ ) {
|
|
|
|
if ( j === 0 && i === cols ) {
|
|
|
|
v[ i ][ j ] = aj;
|
|
|
|
} else {
|
|
|
|
v[ i ][ j ] = aj.clone().lerp( bj, j / rows );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// construct all of the faces
|
|
|
|
for ( i = 0; i < cols; i ++ ) {
|
|
|
|
for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {
|
|
|
|
var k = Math.floor( j / 2 );
|
|
|
|
if ( j % 2 === 0 ) {
|
|
|
|
pushVertex( v[ i ][ k + 1 ] );
|
|
pushVertex( v[ i + 1 ][ k ] );
|
|
pushVertex( v[ i ][ k ] );
|
|
|
|
} else {
|
|
|
|
pushVertex( v[ i ][ k + 1 ] );
|
|
pushVertex( v[ i + 1 ][ k + 1 ] );
|
|
pushVertex( v[ i + 1 ][ k ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function appplyRadius( radius ) {
|
|
|
|
var vertex = new Vector3();
|
|
|
|
// iterate over the entire buffer and apply the radius to each vertex
|
|
|
|
for ( var i = 0; i < vertexBuffer.length; i += 3 ) {
|
|
|
|
vertex.x = vertexBuffer[ i + 0 ];
|
|
vertex.y = vertexBuffer[ i + 1 ];
|
|
vertex.z = vertexBuffer[ i + 2 ];
|
|
|
|
vertex.normalize().multiplyScalar( radius );
|
|
|
|
vertexBuffer[ i + 0 ] = vertex.x;
|
|
vertexBuffer[ i + 1 ] = vertex.y;
|
|
vertexBuffer[ i + 2 ] = vertex.z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function generateUVs() {
|
|
|
|
var vertex = new Vector3();
|
|
|
|
for ( var i = 0; i < vertexBuffer.length; i += 3 ) {
|
|
|
|
vertex.x = vertexBuffer[ i + 0 ];
|
|
vertex.y = vertexBuffer[ i + 1 ];
|
|
vertex.z = vertexBuffer[ i + 2 ];
|
|
|
|
var u = azimuth( vertex ) / 2 / Math.PI + 0.5;
|
|
var v = inclination( vertex ) / Math.PI + 0.5;
|
|
uvBuffer.push( u, 1 - v );
|
|
|
|
}
|
|
|
|
correctUVs();
|
|
|
|
correctSeam();
|
|
|
|
}
|
|
|
|
function correctSeam() {
|
|
|
|
// handle case when face straddles the seam, see #3269
|
|
|
|
for ( var i = 0; i < uvBuffer.length; i += 6 ) {
|
|
|
|
// uv data of a single face
|
|
|
|
var x0 = uvBuffer[ i + 0 ];
|
|
var x1 = uvBuffer[ i + 2 ];
|
|
var x2 = uvBuffer[ i + 4 ];
|
|
|
|
var max = Math.max( x0, x1, x2 );
|
|
var min = Math.min( x0, x1, x2 );
|
|
|
|
// 0.9 is somewhat arbitrary
|
|
|
|
if ( max > 0.9 && min < 0.1 ) {
|
|
|
|
if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;
|
|
if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;
|
|
if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function pushVertex( vertex ) {
|
|
|
|
vertexBuffer.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
function getVertexByIndex( index, vertex ) {
|
|
|
|
var stride = index * 3;
|
|
|
|
vertex.x = vertices[ stride + 0 ];
|
|
vertex.y = vertices[ stride + 1 ];
|
|
vertex.z = vertices[ stride + 2 ];
|
|
|
|
}
|
|
|
|
function correctUVs() {
|
|
|
|
var a = new Vector3();
|
|
var b = new Vector3();
|
|
var c = new Vector3();
|
|
|
|
var centroid = new Vector3();
|
|
|
|
var uvA = new Vector2();
|
|
var uvB = new Vector2();
|
|
var uvC = new Vector2();
|
|
|
|
for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {
|
|
|
|
a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );
|
|
b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );
|
|
c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );
|
|
|
|
uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );
|
|
uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );
|
|
uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );
|
|
|
|
centroid.copy( a ).add( b ).add( c ).divideScalar( 3 );
|
|
|
|
var azi = azimuth( centroid );
|
|
|
|
correctUV( uvA, j + 0, a, azi );
|
|
correctUV( uvB, j + 2, b, azi );
|
|
correctUV( uvC, j + 4, c, azi );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function correctUV( uv, stride, vector, azimuth ) {
|
|
|
|
if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {
|
|
|
|
uvBuffer[ stride ] = uv.x - 1;
|
|
|
|
}
|
|
|
|
if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {
|
|
|
|
uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Angle around the Y axis, counter-clockwise when looking from above.
|
|
|
|
function azimuth( vector ) {
|
|
|
|
return Math.atan2( vector.z, - vector.x );
|
|
|
|
}
|
|
|
|
|
|
// Angle above the XZ plane.
|
|
|
|
function inclination( vector ) {
|
|
|
|
return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;
|
|
|
|
/**
|
|
* @author timothypratley / https://github.com/timothypratley
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// TetrahedronGeometry
|
|
|
|
function TetrahedronGeometry( radius, detail ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'TetrahedronGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
TetrahedronGeometry.prototype = Object.create( Geometry.prototype );
|
|
TetrahedronGeometry.prototype.constructor = TetrahedronGeometry;
|
|
|
|
// TetrahedronBufferGeometry
|
|
|
|
function TetrahedronBufferGeometry( radius, detail ) {
|
|
|
|
var vertices = [
|
|
1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1
|
|
];
|
|
|
|
var indices = [
|
|
2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1
|
|
];
|
|
|
|
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
|
|
|
|
this.type = 'TetrahedronBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
}
|
|
|
|
TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
|
|
TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;
|
|
|
|
/**
|
|
* @author timothypratley / https://github.com/timothypratley
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// OctahedronGeometry
|
|
|
|
function OctahedronGeometry( radius, detail ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'OctahedronGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
OctahedronGeometry.prototype = Object.create( Geometry.prototype );
|
|
OctahedronGeometry.prototype.constructor = OctahedronGeometry;
|
|
|
|
// OctahedronBufferGeometry
|
|
|
|
function OctahedronBufferGeometry( radius, detail ) {
|
|
|
|
var vertices = [
|
|
1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1
|
|
];
|
|
|
|
var indices = [
|
|
0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2
|
|
];
|
|
|
|
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
|
|
|
|
this.type = 'OctahedronBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
}
|
|
|
|
OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
|
|
OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;
|
|
|
|
/**
|
|
* @author timothypratley / https://github.com/timothypratley
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// IcosahedronGeometry
|
|
|
|
function IcosahedronGeometry( radius, detail ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'IcosahedronGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
IcosahedronGeometry.prototype = Object.create( Geometry.prototype );
|
|
IcosahedronGeometry.prototype.constructor = IcosahedronGeometry;
|
|
|
|
// IcosahedronBufferGeometry
|
|
|
|
function IcosahedronBufferGeometry( radius, detail ) {
|
|
|
|
var t = ( 1 + Math.sqrt( 5 ) ) / 2;
|
|
|
|
var vertices = [
|
|
- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,
|
|
0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,
|
|
t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1
|
|
];
|
|
|
|
var indices = [
|
|
0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,
|
|
1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,
|
|
3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,
|
|
4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1
|
|
];
|
|
|
|
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
|
|
|
|
this.type = 'IcosahedronBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
}
|
|
|
|
IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
|
|
IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;
|
|
|
|
/**
|
|
* @author Abe Pazos / https://hamoid.com
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// DodecahedronGeometry
|
|
|
|
function DodecahedronGeometry( radius, detail ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'DodecahedronGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
DodecahedronGeometry.prototype = Object.create( Geometry.prototype );
|
|
DodecahedronGeometry.prototype.constructor = DodecahedronGeometry;
|
|
|
|
// DodecahedronBufferGeometry
|
|
|
|
function DodecahedronBufferGeometry( radius, detail ) {
|
|
|
|
var t = ( 1 + Math.sqrt( 5 ) ) / 2;
|
|
var r = 1 / t;
|
|
|
|
var vertices = [
|
|
|
|
// (±1, ±1, ±1)
|
|
- 1, - 1, - 1, - 1, - 1, 1,
|
|
- 1, 1, - 1, - 1, 1, 1,
|
|
1, - 1, - 1, 1, - 1, 1,
|
|
1, 1, - 1, 1, 1, 1,
|
|
|
|
// (0, ±1/φ, ±φ)
|
|
0, - r, - t, 0, - r, t,
|
|
0, r, - t, 0, r, t,
|
|
|
|
// (±1/φ, ±φ, 0)
|
|
- r, - t, 0, - r, t, 0,
|
|
r, - t, 0, r, t, 0,
|
|
|
|
// (±φ, 0, ±1/φ)
|
|
- t, 0, - r, t, 0, - r,
|
|
- t, 0, r, t, 0, r
|
|
];
|
|
|
|
var indices = [
|
|
3, 11, 7, 3, 7, 15, 3, 15, 13,
|
|
7, 19, 17, 7, 17, 6, 7, 6, 15,
|
|
17, 4, 8, 17, 8, 10, 17, 10, 6,
|
|
8, 0, 16, 8, 16, 2, 8, 2, 10,
|
|
0, 12, 1, 0, 1, 18, 0, 18, 16,
|
|
6, 10, 2, 6, 2, 13, 6, 13, 15,
|
|
2, 16, 18, 2, 18, 3, 2, 3, 13,
|
|
18, 1, 9, 18, 9, 11, 18, 11, 3,
|
|
4, 14, 12, 4, 12, 0, 4, 0, 8,
|
|
11, 9, 5, 11, 5, 19, 11, 19, 7,
|
|
19, 5, 14, 19, 14, 4, 19, 4, 17,
|
|
1, 12, 14, 1, 14, 5, 1, 5, 9
|
|
];
|
|
|
|
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
|
|
|
|
this.type = 'DodecahedronBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
detail: detail
|
|
};
|
|
|
|
}
|
|
|
|
DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
|
|
DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;
|
|
|
|
/**
|
|
* @author oosmoxiecode / https://github.com/oosmoxiecode
|
|
* @author WestLangley / https://github.com/WestLangley
|
|
* @author zz85 / https://github.com/zz85
|
|
* @author miningold / https://github.com/miningold
|
|
* @author jonobr1 / https://github.com/jonobr1
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*
|
|
*/
|
|
|
|
// TubeGeometry
|
|
|
|
function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'TubeGeometry';
|
|
|
|
this.parameters = {
|
|
path: path,
|
|
tubularSegments: tubularSegments,
|
|
radius: radius,
|
|
radialSegments: radialSegments,
|
|
closed: closed
|
|
};
|
|
|
|
if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );
|
|
|
|
var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );
|
|
|
|
// expose internals
|
|
|
|
this.tangents = bufferGeometry.tangents;
|
|
this.normals = bufferGeometry.normals;
|
|
this.binormals = bufferGeometry.binormals;
|
|
|
|
// create geometry
|
|
|
|
this.fromBufferGeometry( bufferGeometry );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
TubeGeometry.prototype = Object.create( Geometry.prototype );
|
|
TubeGeometry.prototype.constructor = TubeGeometry;
|
|
|
|
// TubeBufferGeometry
|
|
|
|
function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'TubeBufferGeometry';
|
|
|
|
this.parameters = {
|
|
path: path,
|
|
tubularSegments: tubularSegments,
|
|
radius: radius,
|
|
radialSegments: radialSegments,
|
|
closed: closed
|
|
};
|
|
|
|
tubularSegments = tubularSegments || 64;
|
|
radius = radius || 1;
|
|
radialSegments = radialSegments || 8;
|
|
closed = closed || false;
|
|
|
|
var frames = path.computeFrenetFrames( tubularSegments, closed );
|
|
|
|
// expose internals
|
|
|
|
this.tangents = frames.tangents;
|
|
this.normals = frames.normals;
|
|
this.binormals = frames.binormals;
|
|
|
|
// helper variables
|
|
|
|
var vertex = new Vector3();
|
|
var normal = new Vector3();
|
|
var uv = new Vector2();
|
|
|
|
var i, j;
|
|
|
|
// buffer
|
|
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
var indices = [];
|
|
|
|
// create buffer data
|
|
|
|
generateBufferData();
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
// functions
|
|
|
|
function generateBufferData() {
|
|
|
|
for ( i = 0; i < tubularSegments; i ++ ) {
|
|
|
|
generateSegment( i );
|
|
|
|
}
|
|
|
|
// if the geometry is not closed, generate the last row of vertices and normals
|
|
// at the regular position on the given path
|
|
//
|
|
// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)
|
|
|
|
generateSegment( ( closed === false ) ? tubularSegments : 0 );
|
|
|
|
// uvs are generated in a separate function.
|
|
// this makes it easy compute correct values for closed geometries
|
|
|
|
generateUVs();
|
|
|
|
// finally create faces
|
|
|
|
generateIndices();
|
|
|
|
}
|
|
|
|
function generateSegment( i ) {
|
|
|
|
// we use getPointAt to sample evenly distributed points from the given path
|
|
|
|
var P = path.getPointAt( i / tubularSegments );
|
|
|
|
// retrieve corresponding normal and binormal
|
|
|
|
var N = frames.normals[ i ];
|
|
var B = frames.binormals[ i ];
|
|
|
|
// generate normals and vertices for the current segment
|
|
|
|
for ( j = 0; j <= radialSegments; j ++ ) {
|
|
|
|
var v = j / radialSegments * Math.PI * 2;
|
|
|
|
var sin = Math.sin( v );
|
|
var cos = - Math.cos( v );
|
|
|
|
// normal
|
|
|
|
normal.x = ( cos * N.x + sin * B.x );
|
|
normal.y = ( cos * N.y + sin * B.y );
|
|
normal.z = ( cos * N.z + sin * B.z );
|
|
normal.normalize();
|
|
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
// vertex
|
|
|
|
vertex.x = P.x + radius * normal.x;
|
|
vertex.y = P.y + radius * normal.y;
|
|
vertex.z = P.z + radius * normal.z;
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function generateIndices() {
|
|
|
|
for ( j = 1; j <= tubularSegments; j ++ ) {
|
|
|
|
for ( i = 1; i <= radialSegments; i ++ ) {
|
|
|
|
var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
|
|
var b = ( radialSegments + 1 ) * j + ( i - 1 );
|
|
var c = ( radialSegments + 1 ) * j + i;
|
|
var d = ( radialSegments + 1 ) * ( j - 1 ) + i;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function generateUVs() {
|
|
|
|
for ( i = 0; i <= tubularSegments; i ++ ) {
|
|
|
|
for ( j = 0; j <= radialSegments; j ++ ) {
|
|
|
|
uv.x = i / tubularSegments;
|
|
uv.y = j / radialSegments;
|
|
|
|
uvs.push( uv.x, uv.y );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
TubeBufferGeometry.prototype.constructor = TubeBufferGeometry;
|
|
|
|
/**
|
|
* @author oosmoxiecode
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*
|
|
* based on http://www.blackpawn.com/texts/pqtorus/
|
|
*/
|
|
|
|
// TorusKnotGeometry
|
|
|
|
function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'TorusKnotGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
tube: tube,
|
|
tubularSegments: tubularSegments,
|
|
radialSegments: radialSegments,
|
|
p: p,
|
|
q: q
|
|
};
|
|
|
|
if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );
|
|
|
|
this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
TorusKnotGeometry.prototype = Object.create( Geometry.prototype );
|
|
TorusKnotGeometry.prototype.constructor = TorusKnotGeometry;
|
|
|
|
// TorusKnotBufferGeometry
|
|
|
|
function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'TorusKnotBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
tube: tube,
|
|
tubularSegments: tubularSegments,
|
|
radialSegments: radialSegments,
|
|
p: p,
|
|
q: q
|
|
};
|
|
|
|
radius = radius || 100;
|
|
tube = tube || 40;
|
|
tubularSegments = Math.floor( tubularSegments ) || 64;
|
|
radialSegments = Math.floor( radialSegments ) || 8;
|
|
p = p || 2;
|
|
q = q || 3;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var i, j;
|
|
|
|
var vertex = new Vector3();
|
|
var normal = new Vector3();
|
|
|
|
var P1 = new Vector3();
|
|
var P2 = new Vector3();
|
|
|
|
var B = new Vector3();
|
|
var T = new Vector3();
|
|
var N = new Vector3();
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( i = 0; i <= tubularSegments; ++ i ) {
|
|
|
|
// the radian "u" is used to calculate the position on the torus curve of the current tubular segement
|
|
|
|
var u = i / tubularSegments * p * Math.PI * 2;
|
|
|
|
// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.
|
|
// these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions
|
|
|
|
calculatePositionOnCurve( u, p, q, radius, P1 );
|
|
calculatePositionOnCurve( u + 0.01, p, q, radius, P2 );
|
|
|
|
// calculate orthonormal basis
|
|
|
|
T.subVectors( P2, P1 );
|
|
N.addVectors( P2, P1 );
|
|
B.crossVectors( T, N );
|
|
N.crossVectors( B, T );
|
|
|
|
// normalize B, N. T can be ignored, we don't use it
|
|
|
|
B.normalize();
|
|
N.normalize();
|
|
|
|
for ( j = 0; j <= radialSegments; ++ j ) {
|
|
|
|
// now calculate the vertices. they are nothing more than an extrusion of the torus curve.
|
|
// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.
|
|
|
|
var v = j / radialSegments * Math.PI * 2;
|
|
var cx = - tube * Math.cos( v );
|
|
var cy = tube * Math.sin( v );
|
|
|
|
// now calculate the final vertex position.
|
|
// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve
|
|
|
|
vertex.x = P1.x + ( cx * N.x + cy * B.x );
|
|
vertex.y = P1.y + ( cx * N.y + cy * B.y );
|
|
vertex.z = P1.z + ( cx * N.z + cy * B.z );
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)
|
|
|
|
normal.subVectors( vertex, P1 ).normalize();
|
|
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
// uv
|
|
|
|
uvs.push( i / tubularSegments );
|
|
uvs.push( j / radialSegments );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// generate indices
|
|
|
|
for ( j = 1; j <= tubularSegments; j ++ ) {
|
|
|
|
for ( i = 1; i <= radialSegments; i ++ ) {
|
|
|
|
// indices
|
|
|
|
var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
|
|
var b = ( radialSegments + 1 ) * j + ( i - 1 );
|
|
var c = ( radialSegments + 1 ) * j + i;
|
|
var d = ( radialSegments + 1 ) * ( j - 1 ) + i;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
// this function calculates the current position on the torus curve
|
|
|
|
function calculatePositionOnCurve( u, p, q, radius, position ) {
|
|
|
|
var cu = Math.cos( u );
|
|
var su = Math.sin( u );
|
|
var quOverP = q / p * u;
|
|
var cs = Math.cos( quOverP );
|
|
|
|
position.x = radius * ( 2 + cs ) * 0.5 * cu;
|
|
position.y = radius * ( 2 + cs ) * su * 0.5;
|
|
position.z = radius * Math.sin( quOverP ) * 0.5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;
|
|
|
|
/**
|
|
* @author oosmoxiecode
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// TorusGeometry
|
|
|
|
function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'TorusGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
tube: tube,
|
|
radialSegments: radialSegments,
|
|
tubularSegments: tubularSegments,
|
|
arc: arc
|
|
};
|
|
|
|
this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
TorusGeometry.prototype = Object.create( Geometry.prototype );
|
|
TorusGeometry.prototype.constructor = TorusGeometry;
|
|
|
|
// TorusBufferGeometry
|
|
|
|
function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'TorusBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
tube: tube,
|
|
radialSegments: radialSegments,
|
|
tubularSegments: tubularSegments,
|
|
arc: arc
|
|
};
|
|
|
|
radius = radius || 100;
|
|
tube = tube || 40;
|
|
radialSegments = Math.floor( radialSegments ) || 8;
|
|
tubularSegments = Math.floor( tubularSegments ) || 6;
|
|
arc = arc || Math.PI * 2;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var center = new Vector3();
|
|
var vertex = new Vector3();
|
|
var normal = new Vector3();
|
|
|
|
var j, i;
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( j = 0; j <= radialSegments; j ++ ) {
|
|
|
|
for ( i = 0; i <= tubularSegments; i ++ ) {
|
|
|
|
var u = i / tubularSegments * arc;
|
|
var v = j / radialSegments * Math.PI * 2;
|
|
|
|
// vertex
|
|
|
|
vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
|
|
vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
|
|
vertex.z = tube * Math.sin( v );
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal
|
|
|
|
center.x = radius * Math.cos( u );
|
|
center.y = radius * Math.sin( u );
|
|
normal.subVectors( vertex, center ).normalize();
|
|
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
// uv
|
|
|
|
uvs.push( i / tubularSegments );
|
|
uvs.push( j / radialSegments );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// generate indices
|
|
|
|
for ( j = 1; j <= radialSegments; j ++ ) {
|
|
|
|
for ( i = 1; i <= tubularSegments; i ++ ) {
|
|
|
|
// indices
|
|
|
|
var a = ( tubularSegments + 1 ) * j + i - 1;
|
|
var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;
|
|
var c = ( tubularSegments + 1 ) * ( j - 1 ) + i;
|
|
var d = ( tubularSegments + 1 ) * j + i;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
}
|
|
|
|
TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
TorusBufferGeometry.prototype.constructor = TorusBufferGeometry;
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
*/
|
|
|
|
var ShapeUtils = {
|
|
|
|
// calculate area of the contour polygon
|
|
|
|
area: function ( contour ) {
|
|
|
|
var n = contour.length;
|
|
var a = 0.0;
|
|
|
|
for ( var p = n - 1, q = 0; q < n; p = q ++ ) {
|
|
|
|
a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
|
|
|
|
}
|
|
|
|
return a * 0.5;
|
|
|
|
},
|
|
|
|
triangulate: ( function () {
|
|
|
|
/**
|
|
* This code is a quick port of code written in C++ which was submitted to
|
|
* flipcode.com by John W. Ratcliff // July 22, 2000
|
|
* See original code and more information here:
|
|
* http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
|
|
*
|
|
* ported to actionscript by Zevan Rosser
|
|
* www.actionsnippet.com
|
|
*
|
|
* ported to javascript by Joshua Koo
|
|
* http://www.lab4games.net/zz85/blog
|
|
*
|
|
*/
|
|
|
|
function snip( contour, u, v, w, n, verts ) {
|
|
|
|
var p;
|
|
var ax, ay, bx, by;
|
|
var cx, cy, px, py;
|
|
|
|
ax = contour[ verts[ u ] ].x;
|
|
ay = contour[ verts[ u ] ].y;
|
|
|
|
bx = contour[ verts[ v ] ].x;
|
|
by = contour[ verts[ v ] ].y;
|
|
|
|
cx = contour[ verts[ w ] ].x;
|
|
cy = contour[ verts[ w ] ].y;
|
|
|
|
if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;
|
|
|
|
var aX, aY, bX, bY, cX, cY;
|
|
var apx, apy, bpx, bpy, cpx, cpy;
|
|
var cCROSSap, bCROSScp, aCROSSbp;
|
|
|
|
aX = cx - bx; aY = cy - by;
|
|
bX = ax - cx; bY = ay - cy;
|
|
cX = bx - ax; cY = by - ay;
|
|
|
|
for ( p = 0; p < n; p ++ ) {
|
|
|
|
px = contour[ verts[ p ] ].x;
|
|
py = contour[ verts[ p ] ].y;
|
|
|
|
if ( ( ( px === ax ) && ( py === ay ) ) ||
|
|
( ( px === bx ) && ( py === by ) ) ||
|
|
( ( px === cx ) && ( py === cy ) ) ) continue;
|
|
|
|
apx = px - ax; apy = py - ay;
|
|
bpx = px - bx; bpy = py - by;
|
|
cpx = px - cx; cpy = py - cy;
|
|
|
|
// see if p is inside triangle abc
|
|
|
|
aCROSSbp = aX * bpy - aY * bpx;
|
|
cCROSSap = cX * apy - cY * apx;
|
|
bCROSScp = bX * cpy - bY * cpx;
|
|
|
|
if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// takes in an contour array and returns
|
|
|
|
return function triangulate( contour, indices ) {
|
|
|
|
var n = contour.length;
|
|
|
|
if ( n < 3 ) return null;
|
|
|
|
var result = [],
|
|
verts = [],
|
|
vertIndices = [];
|
|
|
|
/* we want a counter-clockwise polygon in verts */
|
|
|
|
var u, v, w;
|
|
|
|
if ( ShapeUtils.area( contour ) > 0.0 ) {
|
|
|
|
for ( v = 0; v < n; v ++ ) verts[ v ] = v;
|
|
|
|
} else {
|
|
|
|
for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;
|
|
|
|
}
|
|
|
|
var nv = n;
|
|
|
|
/* remove nv - 2 vertices, creating 1 triangle every time */
|
|
|
|
var count = 2 * nv; /* error detection */
|
|
|
|
for ( v = nv - 1; nv > 2; ) {
|
|
|
|
/* if we loop, it is probably a non-simple polygon */
|
|
|
|
if ( ( count -- ) <= 0 ) {
|
|
|
|
//** Triangulate: ERROR - probable bad polygon!
|
|
|
|
//throw ( "Warning, unable to triangulate polygon!" );
|
|
//return null;
|
|
// Sometimes warning is fine, especially polygons are triangulated in reverse.
|
|
console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );
|
|
|
|
if ( indices ) return vertIndices;
|
|
return result;
|
|
|
|
}
|
|
|
|
/* three consecutive vertices in current polygon, <u,v,w> */
|
|
|
|
u = v; if ( nv <= u ) u = 0; /* previous */
|
|
v = u + 1; if ( nv <= v ) v = 0; /* new v */
|
|
w = v + 1; if ( nv <= w ) w = 0; /* next */
|
|
|
|
if ( snip( contour, u, v, w, nv, verts ) ) {
|
|
|
|
var a, b, c, s, t;
|
|
|
|
/* true names of the vertices */
|
|
|
|
a = verts[ u ];
|
|
b = verts[ v ];
|
|
c = verts[ w ];
|
|
|
|
/* output Triangle */
|
|
|
|
result.push( [ contour[ a ],
|
|
contour[ b ],
|
|
contour[ c ] ] );
|
|
|
|
|
|
vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );
|
|
|
|
/* remove v from the remaining polygon */
|
|
|
|
for ( s = v, t = v + 1; t < nv; s ++, t ++ ) {
|
|
|
|
verts[ s ] = verts[ t ];
|
|
|
|
}
|
|
|
|
nv --;
|
|
|
|
/* reset error detection counter */
|
|
|
|
count = 2 * nv;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( indices ) return vertIndices;
|
|
return result;
|
|
|
|
}
|
|
|
|
} )(),
|
|
|
|
triangulateShape: function ( contour, holes ) {
|
|
|
|
function removeDupEndPts(points) {
|
|
|
|
var l = points.length;
|
|
|
|
if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {
|
|
|
|
points.pop();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
removeDupEndPts( contour );
|
|
holes.forEach( removeDupEndPts );
|
|
|
|
function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {
|
|
|
|
// inOtherPt needs to be collinear to the inSegment
|
|
if ( inSegPt1.x !== inSegPt2.x ) {
|
|
|
|
if ( inSegPt1.x < inSegPt2.x ) {
|
|
|
|
return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );
|
|
|
|
} else {
|
|
|
|
return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( inSegPt1.y < inSegPt2.y ) {
|
|
|
|
return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );
|
|
|
|
} else {
|
|
|
|
return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {
|
|
|
|
var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;
|
|
var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;
|
|
|
|
var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;
|
|
var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;
|
|
|
|
var limit = seg1dy * seg2dx - seg1dx * seg2dy;
|
|
var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;
|
|
|
|
if ( Math.abs( limit ) > Number.EPSILON ) {
|
|
|
|
// not parallel
|
|
|
|
var perpSeg2;
|
|
if ( limit > 0 ) {
|
|
|
|
if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return [];
|
|
perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;
|
|
if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return [];
|
|
|
|
} else {
|
|
|
|
if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return [];
|
|
perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;
|
|
if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return [];
|
|
|
|
}
|
|
|
|
// i.e. to reduce rounding errors
|
|
// intersection at endpoint of segment#1?
|
|
if ( perpSeg2 === 0 ) {
|
|
|
|
if ( ( inExcludeAdjacentSegs ) &&
|
|
( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return [];
|
|
return [ inSeg1Pt1 ];
|
|
|
|
}
|
|
if ( perpSeg2 === limit ) {
|
|
|
|
if ( ( inExcludeAdjacentSegs ) &&
|
|
( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return [];
|
|
return [ inSeg1Pt2 ];
|
|
|
|
}
|
|
// intersection at endpoint of segment#2?
|
|
if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ];
|
|
if ( perpSeg1 === limit ) return [ inSeg2Pt2 ];
|
|
|
|
// return real intersection point
|
|
var factorSeg1 = perpSeg2 / limit;
|
|
return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,
|
|
y: inSeg1Pt1.y + factorSeg1 * seg1dy } ];
|
|
|
|
} else {
|
|
|
|
// parallel or collinear
|
|
if ( ( perpSeg1 !== 0 ) ||
|
|
( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return [];
|
|
|
|
// they are collinear or degenerate
|
|
var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point?
|
|
var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point?
|
|
// both segments are points
|
|
if ( seg1Pt && seg2Pt ) {
|
|
|
|
if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||
|
|
( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points
|
|
return [ inSeg1Pt1 ]; // they are the same point
|
|
|
|
}
|
|
// segment#1 is a single point
|
|
if ( seg1Pt ) {
|
|
|
|
if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2
|
|
return [ inSeg1Pt1 ];
|
|
|
|
}
|
|
// segment#2 is a single point
|
|
if ( seg2Pt ) {
|
|
|
|
if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1
|
|
return [ inSeg2Pt1 ];
|
|
|
|
}
|
|
|
|
// they are collinear segments, which might overlap
|
|
var seg1min, seg1max, seg1minVal, seg1maxVal;
|
|
var seg2min, seg2max, seg2minVal, seg2maxVal;
|
|
if ( seg1dx !== 0 ) {
|
|
|
|
// the segments are NOT on a vertical line
|
|
if ( inSeg1Pt1.x < inSeg1Pt2.x ) {
|
|
|
|
seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;
|
|
seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;
|
|
|
|
} else {
|
|
|
|
seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;
|
|
seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;
|
|
|
|
}
|
|
if ( inSeg2Pt1.x < inSeg2Pt2.x ) {
|
|
|
|
seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;
|
|
seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;
|
|
|
|
} else {
|
|
|
|
seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;
|
|
seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// the segments are on a vertical line
|
|
if ( inSeg1Pt1.y < inSeg1Pt2.y ) {
|
|
|
|
seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;
|
|
seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;
|
|
|
|
} else {
|
|
|
|
seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;
|
|
seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;
|
|
|
|
}
|
|
if ( inSeg2Pt1.y < inSeg2Pt2.y ) {
|
|
|
|
seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;
|
|
seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;
|
|
|
|
} else {
|
|
|
|
seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;
|
|
seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;
|
|
|
|
}
|
|
|
|
}
|
|
if ( seg1minVal <= seg2minVal ) {
|
|
|
|
if ( seg1maxVal < seg2minVal ) return [];
|
|
if ( seg1maxVal === seg2minVal ) {
|
|
|
|
if ( inExcludeAdjacentSegs ) return [];
|
|
return [ seg2min ];
|
|
|
|
}
|
|
if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ];
|
|
return [ seg2min, seg2max ];
|
|
|
|
} else {
|
|
|
|
if ( seg1minVal > seg2maxVal ) return [];
|
|
if ( seg1minVal === seg2maxVal ) {
|
|
|
|
if ( inExcludeAdjacentSegs ) return [];
|
|
return [ seg1min ];
|
|
|
|
}
|
|
if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ];
|
|
return [ seg1min, seg2max ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {
|
|
|
|
// The order of legs is important
|
|
|
|
// translation of all points, so that Vertex is at (0,0)
|
|
var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y;
|
|
var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y;
|
|
var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y;
|
|
|
|
// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.
|
|
var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX;
|
|
var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX;
|
|
|
|
if ( Math.abs( from2toAngle ) > Number.EPSILON ) {
|
|
|
|
// angle != 180 deg.
|
|
|
|
var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX;
|
|
// console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle );
|
|
|
|
if ( from2toAngle > 0 ) {
|
|
|
|
// main angle < 180 deg.
|
|
return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );
|
|
|
|
} else {
|
|
|
|
// main angle > 180 deg.
|
|
return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// angle == 180 deg.
|
|
// console.log( "from2to: 180 deg., from2other: " + from2otherAngle );
|
|
return ( from2otherAngle > 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
function removeHoles( contour, holes ) {
|
|
|
|
var shape = contour.concat(); // work on this shape
|
|
var hole;
|
|
|
|
function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {
|
|
|
|
// Check if hole point lies within angle around shape point
|
|
var lastShapeIdx = shape.length - 1;
|
|
|
|
var prevShapeIdx = inShapeIdx - 1;
|
|
if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx;
|
|
|
|
var nextShapeIdx = inShapeIdx + 1;
|
|
if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0;
|
|
|
|
var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );
|
|
if ( ! insideAngle ) {
|
|
|
|
// console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y );
|
|
return false;
|
|
|
|
}
|
|
|
|
// Check if shape point lies within angle around hole point
|
|
var lastHoleIdx = hole.length - 1;
|
|
|
|
var prevHoleIdx = inHoleIdx - 1;
|
|
if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx;
|
|
|
|
var nextHoleIdx = inHoleIdx + 1;
|
|
if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0;
|
|
|
|
insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );
|
|
if ( ! insideAngle ) {
|
|
|
|
// console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y );
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
function intersectsShapeEdge( inShapePt, inHolePt ) {
|
|
|
|
// checks for intersections with shape edges
|
|
var sIdx, nextIdx, intersection;
|
|
for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {
|
|
|
|
nextIdx = sIdx + 1; nextIdx %= shape.length;
|
|
intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );
|
|
if ( intersection.length > 0 ) return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
var indepHoles = [];
|
|
|
|
function intersectsHoleEdge( inShapePt, inHolePt ) {
|
|
|
|
// checks for intersections with hole edges
|
|
var ihIdx, chkHole,
|
|
hIdx, nextIdx, intersection;
|
|
for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {
|
|
|
|
chkHole = holes[ indepHoles[ ihIdx ]];
|
|
for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {
|
|
|
|
nextIdx = hIdx + 1; nextIdx %= chkHole.length;
|
|
intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );
|
|
if ( intersection.length > 0 ) return true;
|
|
|
|
}
|
|
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
var holeIndex, shapeIndex,
|
|
shapePt, holePt,
|
|
holeIdx, cutKey, failedCuts = [],
|
|
tmpShape1, tmpShape2,
|
|
tmpHole1, tmpHole2;
|
|
|
|
for ( var h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
indepHoles.push( h );
|
|
|
|
}
|
|
|
|
var minShapeIndex = 0;
|
|
var counter = indepHoles.length * 2;
|
|
while ( indepHoles.length > 0 ) {
|
|
|
|
counter --;
|
|
if ( counter < 0 ) {
|
|
|
|
console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" );
|
|
break;
|
|
|
|
}
|
|
|
|
// search for shape-vertex and hole-vertex,
|
|
// which can be connected without intersections
|
|
for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {
|
|
|
|
shapePt = shape[ shapeIndex ];
|
|
holeIndex = - 1;
|
|
|
|
// search for hole which can be reached without intersections
|
|
for ( var h = 0; h < indepHoles.length; h ++ ) {
|
|
|
|
holeIdx = indepHoles[ h ];
|
|
|
|
// prevent multiple checks
|
|
cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx;
|
|
if ( failedCuts[ cutKey ] !== undefined ) continue;
|
|
|
|
hole = holes[ holeIdx ];
|
|
for ( var h2 = 0; h2 < hole.length; h2 ++ ) {
|
|
|
|
holePt = hole[ h2 ];
|
|
if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue;
|
|
if ( intersectsShapeEdge( shapePt, holePt ) ) continue;
|
|
if ( intersectsHoleEdge( shapePt, holePt ) ) continue;
|
|
|
|
holeIndex = h2;
|
|
indepHoles.splice( h, 1 );
|
|
|
|
tmpShape1 = shape.slice( 0, shapeIndex + 1 );
|
|
tmpShape2 = shape.slice( shapeIndex );
|
|
tmpHole1 = hole.slice( holeIndex );
|
|
tmpHole2 = hole.slice( 0, holeIndex + 1 );
|
|
|
|
shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );
|
|
|
|
minShapeIndex = shapeIndex;
|
|
|
|
// Debug only, to show the selected cuts
|
|
// glob_CutLines.push( [ shapePt, holePt ] );
|
|
|
|
break;
|
|
|
|
}
|
|
if ( holeIndex >= 0 ) break; // hole-vertex found
|
|
|
|
failedCuts[ cutKey ] = true; // remember failure
|
|
|
|
}
|
|
if ( holeIndex >= 0 ) break; // hole-vertex found
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return shape; /* shape with no holes */
|
|
|
|
}
|
|
|
|
|
|
var i, il, f, face,
|
|
key, index,
|
|
allPointsMap = {};
|
|
|
|
// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.
|
|
|
|
var allpoints = contour.concat();
|
|
|
|
for ( var h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
Array.prototype.push.apply( allpoints, holes[ h ] );
|
|
|
|
}
|
|
|
|
//console.log( "allpoints",allpoints, allpoints.length );
|
|
|
|
// prepare all points map
|
|
|
|
for ( i = 0, il = allpoints.length; i < il; i ++ ) {
|
|
|
|
key = allpoints[ i ].x + ":" + allpoints[ i ].y;
|
|
|
|
if ( allPointsMap[ key ] !== undefined ) {
|
|
|
|
console.warn( "THREE.ShapeUtils: Duplicate point", key, i );
|
|
|
|
}
|
|
|
|
allPointsMap[ key ] = i;
|
|
|
|
}
|
|
|
|
// remove holes by cutting paths to holes and adding them to the shape
|
|
var shapeWithoutHoles = removeHoles( contour, holes );
|
|
|
|
var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape
|
|
//console.log( "triangles",triangles, triangles.length );
|
|
|
|
// check all face vertices against all points map
|
|
|
|
for ( i = 0, il = triangles.length; i < il; i ++ ) {
|
|
|
|
face = triangles[ i ];
|
|
|
|
for ( f = 0; f < 3; f ++ ) {
|
|
|
|
key = face[ f ].x + ":" + face[ f ].y;
|
|
|
|
index = allPointsMap[ key ];
|
|
|
|
if ( index !== undefined ) {
|
|
|
|
face[ f ] = index;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return triangles.concat();
|
|
|
|
},
|
|
|
|
isClockWise: function ( pts ) {
|
|
|
|
return ShapeUtils.area( pts ) < 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
*
|
|
* Creates extruded geometry from a path shape.
|
|
*
|
|
* parameters = {
|
|
*
|
|
* curveSegments: <int>, // number of points on the curves
|
|
* steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too
|
|
* amount: <int>, // Depth to extrude the shape
|
|
*
|
|
* bevelEnabled: <bool>, // turn on bevel
|
|
* bevelThickness: <float>, // how deep into the original shape bevel goes
|
|
* bevelSize: <float>, // how far from shape outline is bevel
|
|
* bevelSegments: <int>, // number of bevel layers
|
|
*
|
|
* extrudePath: <THREE.Curve> // curve to extrude shape along
|
|
* frames: <Object> // containing arrays of tangents, normals, binormals
|
|
*
|
|
* UVGenerator: <Object> // object that provides UV generator functions
|
|
*
|
|
* }
|
|
*/
|
|
|
|
// ExtrudeGeometry
|
|
|
|
function ExtrudeGeometry( shapes, options ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'ExtrudeGeometry';
|
|
|
|
this.parameters = {
|
|
shapes: shapes,
|
|
options: options
|
|
};
|
|
|
|
this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
ExtrudeGeometry.prototype = Object.create( Geometry.prototype );
|
|
ExtrudeGeometry.prototype.constructor = ExtrudeGeometry;
|
|
|
|
// ExtrudeBufferGeometry
|
|
|
|
function ExtrudeBufferGeometry( shapes, options ) {
|
|
|
|
if ( typeof ( shapes ) === "undefined" ) {
|
|
|
|
shapes = [];
|
|
return;
|
|
|
|
}
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'ExtrudeBufferGeometry';
|
|
|
|
shapes = Array.isArray( shapes ) ? shapes : [ shapes ];
|
|
|
|
this.addShapeList( shapes, options );
|
|
|
|
this.computeVertexNormals();
|
|
|
|
// can't really use automatic vertex normals
|
|
// as then front and back sides get smoothed too
|
|
// should do separate smoothing just for sides
|
|
|
|
//this.computeVertexNormals();
|
|
|
|
//console.log( "took", ( Date.now() - startTime ) );
|
|
|
|
}
|
|
|
|
ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;
|
|
|
|
ExtrudeBufferGeometry.prototype.getArrays = function () {
|
|
|
|
var positionAttribute = this.getAttribute( "position" );
|
|
var verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : [];
|
|
|
|
var uvAttribute = this.getAttribute( "uv" );
|
|
var uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : [];
|
|
|
|
var IndexAttribute = this.index;
|
|
var indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : [];
|
|
|
|
return {
|
|
position: verticesArray,
|
|
uv: uvArray,
|
|
index: indicesArray
|
|
};
|
|
|
|
};
|
|
|
|
ExtrudeBufferGeometry.prototype.addShapeList = function ( shapes, options ) {
|
|
|
|
var sl = shapes.length;
|
|
options.arrays = this.getArrays();
|
|
|
|
for ( var s = 0; s < sl; s ++ ) {
|
|
|
|
var shape = shapes[ s ];
|
|
this.addShape( shape, options );
|
|
|
|
}
|
|
|
|
this.setIndex( options.arrays.index );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( options.arrays.position, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) );
|
|
|
|
};
|
|
|
|
ExtrudeBufferGeometry.prototype.addShape = function ( shape, options ) {
|
|
|
|
var arrays = options.arrays ? options.arrays : this.getArrays();
|
|
var verticesArray = arrays.position;
|
|
var indicesArray = arrays.index;
|
|
var uvArray = arrays.uv;
|
|
|
|
var placeholder = [];
|
|
|
|
|
|
var amount = options.amount !== undefined ? options.amount : 100;
|
|
|
|
var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10
|
|
var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8
|
|
var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;
|
|
|
|
var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false
|
|
|
|
var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
|
|
|
|
var steps = options.steps !== undefined ? options.steps : 1;
|
|
|
|
var extrudePath = options.extrudePath;
|
|
var extrudePts, extrudeByPath = false;
|
|
|
|
// Use default WorldUVGenerator if no UV generators are specified.
|
|
var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;
|
|
|
|
var splineTube, binormal, normal, position2;
|
|
if ( extrudePath ) {
|
|
|
|
extrudePts = extrudePath.getSpacedPoints( steps );
|
|
|
|
extrudeByPath = true;
|
|
bevelEnabled = false; // bevels not supported for path extrusion
|
|
|
|
// SETUP TNB variables
|
|
|
|
// TODO1 - have a .isClosed in spline?
|
|
|
|
splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );
|
|
|
|
// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
|
|
|
|
binormal = new Vector3();
|
|
normal = new Vector3();
|
|
position2 = new Vector3();
|
|
|
|
}
|
|
|
|
// Safeguards if bevels are not enabled
|
|
|
|
if ( ! bevelEnabled ) {
|
|
|
|
bevelSegments = 0;
|
|
bevelThickness = 0;
|
|
bevelSize = 0;
|
|
|
|
}
|
|
|
|
// Variables initialization
|
|
|
|
var ahole, h, hl; // looping of holes
|
|
var scope = this;
|
|
|
|
var shapePoints = shape.extractPoints( curveSegments );
|
|
|
|
var vertices = shapePoints.shape;
|
|
var holes = shapePoints.holes;
|
|
|
|
var reverse = ! ShapeUtils.isClockWise( vertices );
|
|
|
|
if ( reverse ) {
|
|
|
|
vertices = vertices.reverse();
|
|
|
|
// Maybe we should also check if holes are in the opposite direction, just to be safe ...
|
|
|
|
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
ahole = holes[ h ];
|
|
|
|
if ( ShapeUtils.isClockWise( ahole ) ) {
|
|
|
|
holes[ h ] = ahole.reverse();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!
|
|
|
|
}
|
|
|
|
|
|
var faces = ShapeUtils.triangulateShape( vertices, holes );
|
|
|
|
/* Vertices */
|
|
|
|
var contour = vertices; // vertices has all points but contour has only points of circumference
|
|
|
|
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
ahole = holes[ h ];
|
|
|
|
vertices = vertices.concat( ahole );
|
|
|
|
}
|
|
|
|
|
|
function scalePt2( pt, vec, size ) {
|
|
|
|
if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" );
|
|
|
|
return vec.clone().multiplyScalar( size ).add( pt );
|
|
|
|
}
|
|
|
|
var b, bs, t, z,
|
|
vert, vlen = vertices.length,
|
|
face, flen = faces.length;
|
|
|
|
|
|
// Find directions for point movement
|
|
|
|
|
|
function getBevelVec( inPt, inPrev, inNext ) {
|
|
|
|
// computes for inPt the corresponding point inPt' on a new contour
|
|
// shifted by 1 unit (length of normalized vector) to the left
|
|
// if we walk along contour clockwise, this new contour is outside the old one
|
|
//
|
|
// inPt' is the intersection of the two lines parallel to the two
|
|
// adjacent edges of inPt at a distance of 1 unit on the left side.
|
|
|
|
var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt
|
|
|
|
// good reading for geometry algorithms (here: line-line intersection)
|
|
// http://geomalgorithms.com/a05-_intersect-1.html
|
|
|
|
var v_prev_x = inPt.x - inPrev.x,
|
|
v_prev_y = inPt.y - inPrev.y;
|
|
var v_next_x = inNext.x - inPt.x,
|
|
v_next_y = inNext.y - inPt.y;
|
|
|
|
var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );
|
|
|
|
// check for collinear edges
|
|
var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );
|
|
|
|
if ( Math.abs( collinear0 ) > Number.EPSILON ) {
|
|
|
|
// not collinear
|
|
|
|
// length of vectors for normalizing
|
|
|
|
var v_prev_len = Math.sqrt( v_prev_lensq );
|
|
var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );
|
|
|
|
// shift adjacent points by unit vectors to the left
|
|
|
|
var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );
|
|
var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );
|
|
|
|
var ptNextShift_x = ( inNext.x - v_next_y / v_next_len );
|
|
var ptNextShift_y = ( inNext.y + v_next_x / v_next_len );
|
|
|
|
// scaling factor for v_prev to intersection point
|
|
|
|
var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -
|
|
( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /
|
|
( v_prev_x * v_next_y - v_prev_y * v_next_x );
|
|
|
|
// vector from inPt to intersection point
|
|
|
|
v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );
|
|
v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );
|
|
|
|
// Don't normalize!, otherwise sharp corners become ugly
|
|
// but prevent crazy spikes
|
|
var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );
|
|
if ( v_trans_lensq <= 2 ) {
|
|
|
|
return new Vector2( v_trans_x, v_trans_y );
|
|
|
|
} else {
|
|
|
|
shrink_by = Math.sqrt( v_trans_lensq / 2 );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// handle special case of collinear edges
|
|
|
|
var direction_eq = false; // assumes: opposite
|
|
if ( v_prev_x > Number.EPSILON ) {
|
|
|
|
if ( v_next_x > Number.EPSILON ) {
|
|
|
|
direction_eq = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( v_prev_x < - Number.EPSILON ) {
|
|
|
|
if ( v_next_x < - Number.EPSILON ) {
|
|
|
|
direction_eq = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {
|
|
|
|
direction_eq = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( direction_eq ) {
|
|
|
|
// console.log("Warning: lines are a straight sequence");
|
|
v_trans_x = - v_prev_y;
|
|
v_trans_y = v_prev_x;
|
|
shrink_by = Math.sqrt( v_prev_lensq );
|
|
|
|
} else {
|
|
|
|
// console.log("Warning: lines are a straight spike");
|
|
v_trans_x = v_prev_x;
|
|
v_trans_y = v_prev_y;
|
|
shrink_by = Math.sqrt( v_prev_lensq / 2 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );
|
|
|
|
}
|
|
|
|
|
|
var contourMovements = [];
|
|
|
|
for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
|
|
|
|
if ( j === il ) j = 0;
|
|
if ( k === il ) k = 0;
|
|
|
|
// (j)---(i)---(k)
|
|
// console.log('i,j,k', i, j , k)
|
|
|
|
contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );
|
|
|
|
}
|
|
|
|
var holesMovements = [],
|
|
oneHoleMovements, verticesMovements = contourMovements.concat();
|
|
|
|
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
ahole = holes[ h ];
|
|
|
|
oneHoleMovements = [];
|
|
|
|
for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
|
|
|
|
if ( j === il ) j = 0;
|
|
if ( k === il ) k = 0;
|
|
|
|
// (j)---(i)---(k)
|
|
oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );
|
|
|
|
}
|
|
|
|
holesMovements.push( oneHoleMovements );
|
|
verticesMovements = verticesMovements.concat( oneHoleMovements );
|
|
|
|
}
|
|
|
|
|
|
// Loop bevelSegments, 1 for the front, 1 for the back
|
|
|
|
for ( b = 0; b < bevelSegments; b ++ ) {
|
|
|
|
//for ( b = bevelSegments; b > 0; b -- ) {
|
|
|
|
t = b / bevelSegments;
|
|
z = bevelThickness * Math.cos( t * Math.PI / 2 );
|
|
bs = bevelSize * Math.sin( t * Math.PI / 2 );
|
|
|
|
// contract shape
|
|
|
|
for ( i = 0, il = contour.length; i < il; i ++ ) {
|
|
|
|
vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
|
|
|
|
v( vert.x, vert.y, - z );
|
|
|
|
}
|
|
|
|
// expand holes
|
|
|
|
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
ahole = holes[ h ];
|
|
oneHoleMovements = holesMovements[ h ];
|
|
|
|
for ( i = 0, il = ahole.length; i < il; i ++ ) {
|
|
|
|
vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
|
|
|
|
v( vert.x, vert.y, - z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bs = bevelSize;
|
|
|
|
// Back facing vertices
|
|
|
|
for ( i = 0; i < vlen; i ++ ) {
|
|
|
|
vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
|
|
|
|
if ( ! extrudeByPath ) {
|
|
|
|
v( vert.x, vert.y, 0 );
|
|
|
|
} else {
|
|
|
|
// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
|
|
|
|
normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );
|
|
binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );
|
|
|
|
position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );
|
|
|
|
v( position2.x, position2.y, position2.z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Add stepped vertices...
|
|
// Including front facing vertices
|
|
|
|
var s;
|
|
|
|
for ( s = 1; s <= steps; s ++ ) {
|
|
|
|
for ( i = 0; i < vlen; i ++ ) {
|
|
|
|
vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
|
|
|
|
if ( ! extrudeByPath ) {
|
|
|
|
v( vert.x, vert.y, amount / steps * s );
|
|
|
|
} else {
|
|
|
|
// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
|
|
|
|
normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );
|
|
binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );
|
|
|
|
position2.copy( extrudePts[ s ] ).add( normal ).add( binormal );
|
|
|
|
v( position2.x, position2.y, position2.z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// Add bevel segments planes
|
|
|
|
//for ( b = 1; b <= bevelSegments; b ++ ) {
|
|
for ( b = bevelSegments - 1; b >= 0; b -- ) {
|
|
|
|
t = b / bevelSegments;
|
|
z = bevelThickness * Math.cos( t * Math.PI / 2 );
|
|
bs = bevelSize * Math.sin( t * Math.PI / 2 );
|
|
|
|
// contract shape
|
|
|
|
for ( i = 0, il = contour.length; i < il; i ++ ) {
|
|
|
|
vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
|
|
v( vert.x, vert.y, amount + z );
|
|
|
|
}
|
|
|
|
// expand holes
|
|
|
|
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
ahole = holes[ h ];
|
|
oneHoleMovements = holesMovements[ h ];
|
|
|
|
for ( i = 0, il = ahole.length; i < il; i ++ ) {
|
|
|
|
vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
|
|
|
|
if ( ! extrudeByPath ) {
|
|
|
|
v( vert.x, vert.y, amount + z );
|
|
|
|
} else {
|
|
|
|
v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* Faces */
|
|
|
|
// Top and bottom faces
|
|
|
|
buildLidFaces();
|
|
|
|
// Sides faces
|
|
|
|
buildSideFaces();
|
|
|
|
|
|
///// Internal functions
|
|
|
|
function buildLidFaces() {
|
|
|
|
var start = verticesArray.length/3;
|
|
|
|
if ( bevelEnabled ) {
|
|
|
|
var layer = 0; // steps + 1
|
|
var offset = vlen * layer;
|
|
|
|
// Bottom faces
|
|
|
|
for ( i = 0; i < flen; i ++ ) {
|
|
|
|
face = faces[ i ];
|
|
f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );
|
|
|
|
}
|
|
|
|
layer = steps + bevelSegments * 2;
|
|
offset = vlen * layer;
|
|
|
|
// Top faces
|
|
|
|
for ( i = 0; i < flen; i ++ ) {
|
|
|
|
face = faces[ i ];
|
|
f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Bottom faces
|
|
|
|
for ( i = 0; i < flen; i ++ ) {
|
|
|
|
face = faces[ i ];
|
|
f3( face[ 2 ], face[ 1 ], face[ 0 ] );
|
|
|
|
}
|
|
|
|
// Top faces
|
|
|
|
for ( i = 0; i < flen; i ++ ) {
|
|
|
|
face = faces[ i ];
|
|
f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
scope.addGroup( start, verticesArray.length/3 -start, options.material !== undefined ? options.material : 0);
|
|
|
|
}
|
|
|
|
// Create faces for the z-sides of the shape
|
|
|
|
function buildSideFaces() {
|
|
|
|
var start = verticesArray.length/3;
|
|
var layeroffset = 0;
|
|
sidewalls( contour, layeroffset );
|
|
layeroffset += contour.length;
|
|
|
|
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
|
|
|
|
ahole = holes[ h ];
|
|
sidewalls( ahole, layeroffset );
|
|
|
|
//, true
|
|
layeroffset += ahole.length;
|
|
|
|
}
|
|
|
|
|
|
scope.addGroup( start, verticesArray.length/3 -start, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1);
|
|
|
|
|
|
}
|
|
|
|
function sidewalls( contour, layeroffset ) {
|
|
|
|
var j, k;
|
|
i = contour.length;
|
|
|
|
while ( -- i >= 0 ) {
|
|
|
|
j = i;
|
|
k = i - 1;
|
|
if ( k < 0 ) k = contour.length - 1;
|
|
|
|
//console.log('b', i,j, i-1, k,vertices.length);
|
|
|
|
var s = 0,
|
|
sl = steps + bevelSegments * 2;
|
|
|
|
for ( s = 0; s < sl; s ++ ) {
|
|
|
|
var slen1 = vlen * s;
|
|
var slen2 = vlen * ( s + 1 );
|
|
|
|
var a = layeroffset + j + slen1,
|
|
b = layeroffset + k + slen1,
|
|
c = layeroffset + k + slen2,
|
|
d = layeroffset + j + slen2;
|
|
|
|
f4( a, b, c, d, contour, s, sl, j, k );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function v( x, y, z ) {
|
|
|
|
placeholder.push( x );
|
|
placeholder.push( y );
|
|
placeholder.push( z );
|
|
|
|
}
|
|
|
|
|
|
function f3( a, b, c ) {
|
|
|
|
addVertex( a );
|
|
addVertex( b );
|
|
addVertex( c );
|
|
|
|
var nextIndex = verticesArray.length / 3;
|
|
var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
|
|
|
|
addUV( uvs[ 0 ] );
|
|
addUV( uvs[ 1 ] );
|
|
addUV( uvs[ 2 ] );
|
|
|
|
}
|
|
|
|
function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {
|
|
|
|
addVertex( a );
|
|
addVertex( b );
|
|
addVertex( d );
|
|
|
|
addVertex( b );
|
|
addVertex( c );
|
|
addVertex( d );
|
|
|
|
|
|
var nextIndex = verticesArray.length / 3;
|
|
var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
|
|
|
|
addUV( uvs[ 0 ] );
|
|
addUV( uvs[ 1 ] );
|
|
addUV( uvs[ 3 ] );
|
|
|
|
addUV( uvs[ 1 ] );
|
|
addUV( uvs[ 2 ] );
|
|
addUV( uvs[ 3 ] );
|
|
|
|
}
|
|
|
|
function addVertex( index ) {
|
|
|
|
indicesArray.push( verticesArray.length / 3 );
|
|
verticesArray.push( placeholder[ index * 3 + 0 ] );
|
|
verticesArray.push( placeholder[ index * 3 + 1 ] );
|
|
verticesArray.push( placeholder[ index * 3 + 2 ] );
|
|
|
|
}
|
|
|
|
|
|
function addUV( vector2 ) {
|
|
|
|
uvArray.push( vector2.x );
|
|
uvArray.push( vector2.y );
|
|
|
|
}
|
|
|
|
if ( ! options.arrays ) {
|
|
|
|
this.setIndex( indicesArray );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
ExtrudeGeometry.WorldUVGenerator = {
|
|
|
|
generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {
|
|
|
|
var a_x = vertices[ indexA * 3 ];
|
|
var a_y = vertices[ indexA * 3 + 1 ];
|
|
var b_x = vertices[ indexB * 3 ];
|
|
var b_y = vertices[ indexB * 3 + 1 ];
|
|
var c_x = vertices[ indexC * 3 ];
|
|
var c_y = vertices[ indexC * 3 + 1 ];
|
|
|
|
return [
|
|
new Vector2( a_x, a_y ),
|
|
new Vector2( b_x, b_y ),
|
|
new Vector2( c_x, c_y )
|
|
];
|
|
|
|
},
|
|
|
|
generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {
|
|
|
|
var a_x = vertices[ indexA * 3 ];
|
|
var a_y = vertices[ indexA * 3 + 1 ];
|
|
var a_z = vertices[ indexA * 3 + 2 ];
|
|
var b_x = vertices[ indexB * 3 ];
|
|
var b_y = vertices[ indexB * 3 + 1 ];
|
|
var b_z = vertices[ indexB * 3 + 2 ];
|
|
var c_x = vertices[ indexC * 3 ];
|
|
var c_y = vertices[ indexC * 3 + 1 ];
|
|
var c_z = vertices[ indexC * 3 + 2 ];
|
|
var d_x = vertices[ indexD * 3 ];
|
|
var d_y = vertices[ indexD * 3 + 1 ];
|
|
var d_z = vertices[ indexD * 3 + 2 ];
|
|
|
|
if ( Math.abs( a_y - b_y ) < 0.01 ) {
|
|
|
|
return [
|
|
new Vector2( a_x, 1 - a_z ),
|
|
new Vector2( b_x, 1 - b_z ),
|
|
new Vector2( c_x, 1 - c_z ),
|
|
new Vector2( d_x, 1 - d_z )
|
|
];
|
|
|
|
} else {
|
|
|
|
return [
|
|
new Vector2( a_y, 1 - a_z ),
|
|
new Vector2( b_y, 1 - b_z ),
|
|
new Vector2( c_y, 1 - c_z ),
|
|
new Vector2( d_y, 1 - d_z )
|
|
];
|
|
|
|
}
|
|
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* Text = 3D Text
|
|
*
|
|
* parameters = {
|
|
* font: <THREE.Font>, // font
|
|
*
|
|
* size: <float>, // size of the text
|
|
* height: <float>, // thickness to extrude text
|
|
* curveSegments: <int>, // number of points on the curves
|
|
*
|
|
* bevelEnabled: <bool>, // turn on bevel
|
|
* bevelThickness: <float>, // how deep into text bevel goes
|
|
* bevelSize: <float> // how far from text outline is bevel
|
|
* }
|
|
*/
|
|
|
|
// TextGeometry
|
|
|
|
function TextGeometry( text, parameters ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'TextGeometry';
|
|
|
|
this.parameters = {
|
|
text: text,
|
|
parameters: parameters
|
|
};
|
|
|
|
this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
TextGeometry.prototype = Object.create( Geometry.prototype );
|
|
TextGeometry.prototype.constructor = TextGeometry;
|
|
|
|
// TextBufferGeometry
|
|
|
|
function TextBufferGeometry( text, parameters ) {
|
|
|
|
parameters = parameters || {};
|
|
|
|
var font = parameters.font;
|
|
|
|
if ( ( font && font.isFont ) === false ) {
|
|
|
|
console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );
|
|
return new Geometry();
|
|
|
|
}
|
|
|
|
var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );
|
|
|
|
// translate parameters to ExtrudeGeometry API
|
|
|
|
parameters.amount = parameters.height !== undefined ? parameters.height : 50;
|
|
|
|
// defaults
|
|
|
|
if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;
|
|
if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;
|
|
if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;
|
|
|
|
ExtrudeBufferGeometry.call( this, shapes, parameters );
|
|
|
|
this.type = 'TextBufferGeometry';
|
|
|
|
}
|
|
|
|
TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );
|
|
TextBufferGeometry.prototype.constructor = TextBufferGeometry;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// SphereGeometry
|
|
|
|
function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'SphereGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
widthSegments: widthSegments,
|
|
heightSegments: heightSegments,
|
|
phiStart: phiStart,
|
|
phiLength: phiLength,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
SphereGeometry.prototype = Object.create( Geometry.prototype );
|
|
SphereGeometry.prototype.constructor = SphereGeometry;
|
|
|
|
// SphereBufferGeometry
|
|
|
|
function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'SphereBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
widthSegments: widthSegments,
|
|
heightSegments: heightSegments,
|
|
phiStart: phiStart,
|
|
phiLength: phiLength,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
radius = radius || 50;
|
|
|
|
widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );
|
|
heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );
|
|
|
|
phiStart = phiStart !== undefined ? phiStart : 0;
|
|
phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;
|
|
|
|
thetaStart = thetaStart !== undefined ? thetaStart : 0;
|
|
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;
|
|
|
|
var thetaEnd = thetaStart + thetaLength;
|
|
|
|
var ix, iy;
|
|
|
|
var index = 0;
|
|
var grid = [];
|
|
|
|
var vertex = new Vector3();
|
|
var normal = new Vector3();
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( iy = 0; iy <= heightSegments; iy ++ ) {
|
|
|
|
var verticesRow = [];
|
|
|
|
var v = iy / heightSegments;
|
|
|
|
for ( ix = 0; ix <= widthSegments; ix ++ ) {
|
|
|
|
var u = ix / widthSegments;
|
|
|
|
// vertex
|
|
|
|
vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
|
|
vertex.y = radius * Math.cos( thetaStart + v * thetaLength );
|
|
vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal
|
|
|
|
normal.set( vertex.x, vertex.y, vertex.z ).normalize();
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
// uv
|
|
|
|
uvs.push( u, 1 - v );
|
|
|
|
verticesRow.push( index ++ );
|
|
|
|
}
|
|
|
|
grid.push( verticesRow );
|
|
|
|
}
|
|
|
|
// indices
|
|
|
|
for ( iy = 0; iy < heightSegments; iy ++ ) {
|
|
|
|
for ( ix = 0; ix < widthSegments; ix ++ ) {
|
|
|
|
var a = grid[ iy ][ ix + 1 ];
|
|
var b = grid[ iy ][ ix ];
|
|
var c = grid[ iy + 1 ][ ix ];
|
|
var d = grid[ iy + 1 ][ ix + 1 ];
|
|
|
|
if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );
|
|
if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
}
|
|
|
|
SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
SphereBufferGeometry.prototype.constructor = SphereBufferGeometry;
|
|
|
|
/**
|
|
* @author Kaleb Murphy
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// RingGeometry
|
|
|
|
function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'RingGeometry';
|
|
|
|
this.parameters = {
|
|
innerRadius: innerRadius,
|
|
outerRadius: outerRadius,
|
|
thetaSegments: thetaSegments,
|
|
phiSegments: phiSegments,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
RingGeometry.prototype = Object.create( Geometry.prototype );
|
|
RingGeometry.prototype.constructor = RingGeometry;
|
|
|
|
// RingBufferGeometry
|
|
|
|
function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'RingBufferGeometry';
|
|
|
|
this.parameters = {
|
|
innerRadius: innerRadius,
|
|
outerRadius: outerRadius,
|
|
thetaSegments: thetaSegments,
|
|
phiSegments: phiSegments,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
innerRadius = innerRadius || 20;
|
|
outerRadius = outerRadius || 50;
|
|
|
|
thetaStart = thetaStart !== undefined ? thetaStart : 0;
|
|
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
|
|
|
|
thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;
|
|
phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// some helper variables
|
|
|
|
var segment;
|
|
var radius = innerRadius;
|
|
var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );
|
|
var vertex = new Vector3();
|
|
var uv = new Vector2();
|
|
var j, i;
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( j = 0; j <= phiSegments; j ++ ) {
|
|
|
|
for ( i = 0; i <= thetaSegments; i ++ ) {
|
|
|
|
// values are generate from the inside of the ring to the outside
|
|
|
|
segment = thetaStart + i / thetaSegments * thetaLength;
|
|
|
|
// vertex
|
|
|
|
vertex.x = radius * Math.cos( segment );
|
|
vertex.y = radius * Math.sin( segment );
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal
|
|
|
|
normals.push( 0, 0, 1 );
|
|
|
|
// uv
|
|
|
|
uv.x = ( vertex.x / outerRadius + 1 ) / 2;
|
|
uv.y = ( vertex.y / outerRadius + 1 ) / 2;
|
|
|
|
uvs.push( uv.x, uv.y );
|
|
|
|
}
|
|
|
|
// increase the radius for next row of vertices
|
|
|
|
radius += radiusStep;
|
|
|
|
}
|
|
|
|
// indices
|
|
|
|
for ( j = 0; j < phiSegments; j ++ ) {
|
|
|
|
var thetaSegmentLevel = j * ( thetaSegments + 1 );
|
|
|
|
for ( i = 0; i < thetaSegments; i ++ ) {
|
|
|
|
segment = i + thetaSegmentLevel;
|
|
|
|
var a = segment;
|
|
var b = segment + thetaSegments + 1;
|
|
var c = segment + thetaSegments + 2;
|
|
var d = segment + 1;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
}
|
|
|
|
RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
RingBufferGeometry.prototype.constructor = RingBufferGeometry;
|
|
|
|
/**
|
|
* @author astrodud / http://astrodud.isgreat.org/
|
|
* @author zz85 / https://github.com/zz85
|
|
* @author bhouston / http://clara.io
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// LatheGeometry
|
|
|
|
function LatheGeometry( points, segments, phiStart, phiLength ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'LatheGeometry';
|
|
|
|
this.parameters = {
|
|
points: points,
|
|
segments: segments,
|
|
phiStart: phiStart,
|
|
phiLength: phiLength
|
|
};
|
|
|
|
this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
LatheGeometry.prototype = Object.create( Geometry.prototype );
|
|
LatheGeometry.prototype.constructor = LatheGeometry;
|
|
|
|
// LatheBufferGeometry
|
|
|
|
function LatheBufferGeometry( points, segments, phiStart, phiLength ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'LatheBufferGeometry';
|
|
|
|
this.parameters = {
|
|
points: points,
|
|
segments: segments,
|
|
phiStart: phiStart,
|
|
phiLength: phiLength
|
|
};
|
|
|
|
segments = Math.floor( segments ) || 12;
|
|
phiStart = phiStart || 0;
|
|
phiLength = phiLength || Math.PI * 2;
|
|
|
|
// clamp phiLength so it's in range of [ 0, 2PI ]
|
|
|
|
phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );
|
|
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var base;
|
|
var inverseSegments = 1.0 / segments;
|
|
var vertex = new Vector3();
|
|
var uv = new Vector2();
|
|
var i, j;
|
|
|
|
// generate vertices and uvs
|
|
|
|
for ( i = 0; i <= segments; i ++ ) {
|
|
|
|
var phi = phiStart + i * inverseSegments * phiLength;
|
|
|
|
var sin = Math.sin( phi );
|
|
var cos = Math.cos( phi );
|
|
|
|
for ( j = 0; j <= ( points.length - 1 ); j ++ ) {
|
|
|
|
// vertex
|
|
|
|
vertex.x = points[ j ].x * sin;
|
|
vertex.y = points[ j ].y;
|
|
vertex.z = points[ j ].x * cos;
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// uv
|
|
|
|
uv.x = i / segments;
|
|
uv.y = j / ( points.length - 1 );
|
|
|
|
uvs.push( uv.x, uv.y );
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// indices
|
|
|
|
for ( i = 0; i < segments; i ++ ) {
|
|
|
|
for ( j = 0; j < ( points.length - 1 ); j ++ ) {
|
|
|
|
base = j + i * points.length;
|
|
|
|
var a = base;
|
|
var b = base + points.length;
|
|
var c = base + points.length + 1;
|
|
var d = base + 1;
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
// generate normals
|
|
|
|
this.computeVertexNormals();
|
|
|
|
// if the geometry is closed, we need to average the normals along the seam.
|
|
// because the corresponding vertices are identical (but still have different UVs).
|
|
|
|
if ( phiLength === Math.PI * 2 ) {
|
|
|
|
var normals = this.attributes.normal.array;
|
|
var n1 = new Vector3();
|
|
var n2 = new Vector3();
|
|
var n = new Vector3();
|
|
|
|
// this is the buffer offset for the last line of vertices
|
|
|
|
base = segments * points.length * 3;
|
|
|
|
for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {
|
|
|
|
// select the normal of the vertex in the first line
|
|
|
|
n1.x = normals[ j + 0 ];
|
|
n1.y = normals[ j + 1 ];
|
|
n1.z = normals[ j + 2 ];
|
|
|
|
// select the normal of the vertex in the last line
|
|
|
|
n2.x = normals[ base + j + 0 ];
|
|
n2.y = normals[ base + j + 1 ];
|
|
n2.z = normals[ base + j + 2 ];
|
|
|
|
// average normals
|
|
|
|
n.addVectors( n1, n2 ).normalize();
|
|
|
|
// assign the new values to both normals
|
|
|
|
normals[ j + 0 ] = normals[ base + j + 0 ] = n.x;
|
|
normals[ j + 1 ] = normals[ base + j + 1 ] = n.y;
|
|
normals[ j + 2 ] = normals[ base + j + 2 ] = n.z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
LatheBufferGeometry.prototype.constructor = LatheBufferGeometry;
|
|
|
|
/**
|
|
* @author jonobr1 / http://jonobr1.com
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// ShapeGeometry
|
|
|
|
function ShapeGeometry( shapes, curveSegments ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'ShapeGeometry';
|
|
|
|
if ( typeof curveSegments === 'object' ) {
|
|
|
|
console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );
|
|
|
|
curveSegments = curveSegments.curveSegments;
|
|
|
|
}
|
|
|
|
this.parameters = {
|
|
shapes: shapes,
|
|
curveSegments: curveSegments
|
|
};
|
|
|
|
this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
ShapeGeometry.prototype = Object.create( Geometry.prototype );
|
|
ShapeGeometry.prototype.constructor = ShapeGeometry;
|
|
|
|
// ShapeBufferGeometry
|
|
|
|
function ShapeBufferGeometry( shapes, curveSegments ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'ShapeBufferGeometry';
|
|
|
|
this.parameters = {
|
|
shapes: shapes,
|
|
curveSegments: curveSegments
|
|
};
|
|
|
|
curveSegments = curveSegments || 12;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var groupStart = 0;
|
|
var groupCount = 0;
|
|
|
|
// allow single and array values for "shapes" parameter
|
|
|
|
if ( Array.isArray( shapes ) === false ) {
|
|
|
|
addShape( shapes );
|
|
|
|
} else {
|
|
|
|
for ( var i = 0; i < shapes.length; i ++ ) {
|
|
|
|
addShape( shapes[ i ] );
|
|
|
|
this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support
|
|
|
|
groupStart += groupCount;
|
|
groupCount = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
|
|
// helper functions
|
|
|
|
function addShape( shape ) {
|
|
|
|
var i, l, shapeHole;
|
|
|
|
var indexOffset = vertices.length / 3;
|
|
var points = shape.extractPoints( curveSegments );
|
|
|
|
var shapeVertices = points.shape;
|
|
var shapeHoles = points.holes;
|
|
|
|
// check direction of vertices
|
|
|
|
if ( ShapeUtils.isClockWise( shapeVertices ) === false ) {
|
|
|
|
shapeVertices = shapeVertices.reverse();
|
|
|
|
// also check if holes are in the opposite direction
|
|
|
|
for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
|
|
|
|
shapeHole = shapeHoles[ i ];
|
|
|
|
if ( ShapeUtils.isClockWise( shapeHole ) === true ) {
|
|
|
|
shapeHoles[ i ] = shapeHole.reverse();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );
|
|
|
|
// join vertices of inner and outer paths to a single array
|
|
|
|
for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
|
|
|
|
shapeHole = shapeHoles[ i ];
|
|
shapeVertices = shapeVertices.concat( shapeHole );
|
|
|
|
}
|
|
|
|
// vertices, normals, uvs
|
|
|
|
for ( i = 0, l = shapeVertices.length; i < l; i ++ ) {
|
|
|
|
var vertex = shapeVertices[ i ];
|
|
|
|
vertices.push( vertex.x, vertex.y, 0 );
|
|
normals.push( 0, 0, 1 );
|
|
uvs.push( vertex.x, vertex.y ); // world uvs
|
|
|
|
}
|
|
|
|
// incides
|
|
|
|
for ( i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
var a = face[ 0 ] + indexOffset;
|
|
var b = face[ 1 ] + indexOffset;
|
|
var c = face[ 2 ] + indexOffset;
|
|
|
|
indices.push( a, b, c );
|
|
groupCount += 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;
|
|
|
|
/**
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
function EdgesGeometry( geometry, thresholdAngle ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'EdgesGeometry';
|
|
|
|
this.parameters = {
|
|
thresholdAngle: thresholdAngle
|
|
};
|
|
|
|
thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;
|
|
|
|
// buffer
|
|
|
|
var vertices = [];
|
|
|
|
// helper variables
|
|
|
|
var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );
|
|
var edge = [ 0, 0 ], edges = {}, edge1, edge2;
|
|
var key, keys = [ 'a', 'b', 'c' ];
|
|
|
|
// prepare source geometry
|
|
|
|
var geometry2;
|
|
|
|
if ( geometry.isBufferGeometry ) {
|
|
|
|
geometry2 = new Geometry();
|
|
geometry2.fromBufferGeometry( geometry );
|
|
|
|
} else {
|
|
|
|
geometry2 = geometry.clone();
|
|
|
|
}
|
|
|
|
geometry2.mergeVertices();
|
|
geometry2.computeFaceNormals();
|
|
|
|
var sourceVertices = geometry2.vertices;
|
|
var faces = geometry2.faces;
|
|
|
|
// now create a data structure where each entry represents an edge with its adjoining faces
|
|
|
|
for ( var i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
for ( var j = 0; j < 3; j ++ ) {
|
|
|
|
edge1 = face[ keys[ j ] ];
|
|
edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
|
|
edge[ 0 ] = Math.min( edge1, edge2 );
|
|
edge[ 1 ] = Math.max( edge1, edge2 );
|
|
|
|
key = edge[ 0 ] + ',' + edge[ 1 ];
|
|
|
|
if ( edges[ key ] === undefined ) {
|
|
|
|
edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };
|
|
|
|
} else {
|
|
|
|
edges[ key ].face2 = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// generate vertices
|
|
|
|
for ( key in edges ) {
|
|
|
|
var e = edges[ key ];
|
|
|
|
// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.
|
|
|
|
if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {
|
|
|
|
var vertex = sourceVertices[ e.index1 ];
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
vertex = sourceVertices[ e.index2 ];
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
|
|
}
|
|
|
|
EdgesGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
EdgesGeometry.prototype.constructor = EdgesGeometry;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
// CylinderGeometry
|
|
|
|
function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'CylinderGeometry';
|
|
|
|
this.parameters = {
|
|
radiusTop: radiusTop,
|
|
radiusBottom: radiusBottom,
|
|
height: height,
|
|
radialSegments: radialSegments,
|
|
heightSegments: heightSegments,
|
|
openEnded: openEnded,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
CylinderGeometry.prototype = Object.create( Geometry.prototype );
|
|
CylinderGeometry.prototype.constructor = CylinderGeometry;
|
|
|
|
// CylinderBufferGeometry
|
|
|
|
function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'CylinderBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radiusTop: radiusTop,
|
|
radiusBottom: radiusBottom,
|
|
height: height,
|
|
radialSegments: radialSegments,
|
|
heightSegments: heightSegments,
|
|
openEnded: openEnded,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
var scope = this;
|
|
|
|
radiusTop = radiusTop !== undefined ? radiusTop : 20;
|
|
radiusBottom = radiusBottom !== undefined ? radiusBottom : 20;
|
|
height = height !== undefined ? height : 100;
|
|
|
|
radialSegments = Math.floor( radialSegments ) || 8;
|
|
heightSegments = Math.floor( heightSegments ) || 1;
|
|
|
|
openEnded = openEnded !== undefined ? openEnded : false;
|
|
thetaStart = thetaStart !== undefined ? thetaStart : 0.0;
|
|
thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var index = 0;
|
|
var indexArray = [];
|
|
var halfHeight = height / 2;
|
|
var groupStart = 0;
|
|
|
|
// generate geometry
|
|
|
|
generateTorso();
|
|
|
|
if ( openEnded === false ) {
|
|
|
|
if ( radiusTop > 0 ) generateCap( true );
|
|
if ( radiusBottom > 0 ) generateCap( false );
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
function generateTorso() {
|
|
|
|
var x, y;
|
|
var normal = new Vector3();
|
|
var vertex = new Vector3();
|
|
|
|
var groupCount = 0;
|
|
|
|
// this will be used to calculate the normal
|
|
var slope = ( radiusBottom - radiusTop ) / height;
|
|
|
|
// generate vertices, normals and uvs
|
|
|
|
for ( y = 0; y <= heightSegments; y ++ ) {
|
|
|
|
var indexRow = [];
|
|
|
|
var v = y / heightSegments;
|
|
|
|
// calculate the radius of the current row
|
|
|
|
var radius = v * ( radiusBottom - radiusTop ) + radiusTop;
|
|
|
|
for ( x = 0; x <= radialSegments; x ++ ) {
|
|
|
|
var u = x / radialSegments;
|
|
|
|
var theta = u * thetaLength + thetaStart;
|
|
|
|
var sinTheta = Math.sin( theta );
|
|
var cosTheta = Math.cos( theta );
|
|
|
|
// vertex
|
|
|
|
vertex.x = radius * sinTheta;
|
|
vertex.y = - v * height + halfHeight;
|
|
vertex.z = radius * cosTheta;
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal
|
|
|
|
normal.set( sinTheta, slope, cosTheta ).normalize();
|
|
normals.push( normal.x, normal.y, normal.z );
|
|
|
|
// uv
|
|
|
|
uvs.push( u, 1 - v );
|
|
|
|
// save index of vertex in respective row
|
|
|
|
indexRow.push( index ++ );
|
|
|
|
}
|
|
|
|
// now save vertices of the row in our index array
|
|
|
|
indexArray.push( indexRow );
|
|
|
|
}
|
|
|
|
// generate indices
|
|
|
|
for ( x = 0; x < radialSegments; x ++ ) {
|
|
|
|
for ( y = 0; y < heightSegments; y ++ ) {
|
|
|
|
// we use the index array to access the correct indices
|
|
|
|
var a = indexArray[ y ][ x ];
|
|
var b = indexArray[ y + 1 ][ x ];
|
|
var c = indexArray[ y + 1 ][ x + 1 ];
|
|
var d = indexArray[ y ][ x + 1 ];
|
|
|
|
// faces
|
|
|
|
indices.push( a, b, d );
|
|
indices.push( b, c, d );
|
|
|
|
// update group counter
|
|
|
|
groupCount += 6;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// add a group to the geometry. this will ensure multi material support
|
|
|
|
scope.addGroup( groupStart, groupCount, 0 );
|
|
|
|
// calculate new start value for groups
|
|
|
|
groupStart += groupCount;
|
|
|
|
}
|
|
|
|
function generateCap( top ) {
|
|
|
|
var x, centerIndexStart, centerIndexEnd;
|
|
|
|
var uv = new Vector2();
|
|
var vertex = new Vector3();
|
|
|
|
var groupCount = 0;
|
|
|
|
var radius = ( top === true ) ? radiusTop : radiusBottom;
|
|
var sign = ( top === true ) ? 1 : - 1;
|
|
|
|
// save the index of the first center vertex
|
|
centerIndexStart = index;
|
|
|
|
// first we generate the center vertex data of the cap.
|
|
// because the geometry needs one set of uvs per face,
|
|
// we must generate a center vertex per face/segment
|
|
|
|
for ( x = 1; x <= radialSegments; x ++ ) {
|
|
|
|
// vertex
|
|
|
|
vertices.push( 0, halfHeight * sign, 0 );
|
|
|
|
// normal
|
|
|
|
normals.push( 0, sign, 0 );
|
|
|
|
// uv
|
|
|
|
uvs.push( 0.5, 0.5 );
|
|
|
|
// increase index
|
|
|
|
index ++;
|
|
|
|
}
|
|
|
|
// save the index of the last center vertex
|
|
|
|
centerIndexEnd = index;
|
|
|
|
// now we generate the surrounding vertices, normals and uvs
|
|
|
|
for ( x = 0; x <= radialSegments; x ++ ) {
|
|
|
|
var u = x / radialSegments;
|
|
var theta = u * thetaLength + thetaStart;
|
|
|
|
var cosTheta = Math.cos( theta );
|
|
var sinTheta = Math.sin( theta );
|
|
|
|
// vertex
|
|
|
|
vertex.x = radius * sinTheta;
|
|
vertex.y = halfHeight * sign;
|
|
vertex.z = radius * cosTheta;
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal
|
|
|
|
normals.push( 0, sign, 0 );
|
|
|
|
// uv
|
|
|
|
uv.x = ( cosTheta * 0.5 ) + 0.5;
|
|
uv.y = ( sinTheta * 0.5 * sign ) + 0.5;
|
|
uvs.push( uv.x, uv.y );
|
|
|
|
// increase index
|
|
|
|
index ++;
|
|
|
|
}
|
|
|
|
// generate indices
|
|
|
|
for ( x = 0; x < radialSegments; x ++ ) {
|
|
|
|
var c = centerIndexStart + x;
|
|
var i = centerIndexEnd + x;
|
|
|
|
if ( top === true ) {
|
|
|
|
// face top
|
|
|
|
indices.push( i, i + 1, c );
|
|
|
|
} else {
|
|
|
|
// face bottom
|
|
|
|
indices.push( i + 1, i, c );
|
|
|
|
}
|
|
|
|
groupCount += 3;
|
|
|
|
}
|
|
|
|
// add a group to the geometry. this will ensure multi material support
|
|
|
|
scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );
|
|
|
|
// calculate new start value for groups
|
|
|
|
groupStart += groupCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;
|
|
|
|
/**
|
|
* @author abelnation / http://github.com/abelnation
|
|
*/
|
|
|
|
// ConeGeometry
|
|
|
|
function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
|
|
|
|
CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
|
|
|
|
this.type = 'ConeGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
height: height,
|
|
radialSegments: radialSegments,
|
|
heightSegments: heightSegments,
|
|
openEnded: openEnded,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
}
|
|
|
|
ConeGeometry.prototype = Object.create( CylinderGeometry.prototype );
|
|
ConeGeometry.prototype.constructor = ConeGeometry;
|
|
|
|
// ConeBufferGeometry
|
|
|
|
function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
|
|
|
|
CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
|
|
|
|
this.type = 'ConeBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
height: height,
|
|
radialSegments: radialSegments,
|
|
heightSegments: heightSegments,
|
|
openEnded: openEnded,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
}
|
|
|
|
ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );
|
|
ConeBufferGeometry.prototype.constructor = ConeBufferGeometry;
|
|
|
|
/**
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
* @author hughes
|
|
*/
|
|
|
|
// CircleGeometry
|
|
|
|
function CircleGeometry( radius, segments, thetaStart, thetaLength ) {
|
|
|
|
Geometry.call( this );
|
|
|
|
this.type = 'CircleGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
segments: segments,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );
|
|
this.mergeVertices();
|
|
|
|
}
|
|
|
|
CircleGeometry.prototype = Object.create( Geometry.prototype );
|
|
CircleGeometry.prototype.constructor = CircleGeometry;
|
|
|
|
// CircleBufferGeometry
|
|
|
|
function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'CircleBufferGeometry';
|
|
|
|
this.parameters = {
|
|
radius: radius,
|
|
segments: segments,
|
|
thetaStart: thetaStart,
|
|
thetaLength: thetaLength
|
|
};
|
|
|
|
radius = radius || 50;
|
|
segments = segments !== undefined ? Math.max( 3, segments ) : 8;
|
|
|
|
thetaStart = thetaStart !== undefined ? thetaStart : 0;
|
|
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
|
|
|
|
// buffers
|
|
|
|
var indices = [];
|
|
var vertices = [];
|
|
var normals = [];
|
|
var uvs = [];
|
|
|
|
// helper variables
|
|
|
|
var i, s;
|
|
var vertex = new Vector3();
|
|
var uv = new Vector2();
|
|
|
|
// center point
|
|
|
|
vertices.push( 0, 0, 0 );
|
|
normals.push( 0, 0, 1 );
|
|
uvs.push( 0.5, 0.5 );
|
|
|
|
for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {
|
|
|
|
var segment = thetaStart + s / segments * thetaLength;
|
|
|
|
// vertex
|
|
|
|
vertex.x = radius * Math.cos( segment );
|
|
vertex.y = radius * Math.sin( segment );
|
|
|
|
vertices.push( vertex.x, vertex.y, vertex.z );
|
|
|
|
// normal
|
|
|
|
normals.push( 0, 0, 1 );
|
|
|
|
// uvs
|
|
|
|
uv.x = ( vertices[ i ] / radius + 1 ) / 2;
|
|
uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;
|
|
|
|
uvs.push( uv.x, uv.y );
|
|
|
|
}
|
|
|
|
// indices
|
|
|
|
for ( i = 1; i <= segments; i ++ ) {
|
|
|
|
indices.push( i, i + 1, 0 );
|
|
|
|
}
|
|
|
|
// build geometry
|
|
|
|
this.setIndex( indices );
|
|
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
|
|
}
|
|
|
|
CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
CircleBufferGeometry.prototype.constructor = CircleBufferGeometry;
|
|
|
|
|
|
|
|
var Geometries = Object.freeze({
|
|
WireframeGeometry: WireframeGeometry,
|
|
ParametricGeometry: ParametricGeometry,
|
|
ParametricBufferGeometry: ParametricBufferGeometry,
|
|
TetrahedronGeometry: TetrahedronGeometry,
|
|
TetrahedronBufferGeometry: TetrahedronBufferGeometry,
|
|
OctahedronGeometry: OctahedronGeometry,
|
|
OctahedronBufferGeometry: OctahedronBufferGeometry,
|
|
IcosahedronGeometry: IcosahedronGeometry,
|
|
IcosahedronBufferGeometry: IcosahedronBufferGeometry,
|
|
DodecahedronGeometry: DodecahedronGeometry,
|
|
DodecahedronBufferGeometry: DodecahedronBufferGeometry,
|
|
PolyhedronGeometry: PolyhedronGeometry,
|
|
PolyhedronBufferGeometry: PolyhedronBufferGeometry,
|
|
TubeGeometry: TubeGeometry,
|
|
TubeBufferGeometry: TubeBufferGeometry,
|
|
TorusKnotGeometry: TorusKnotGeometry,
|
|
TorusKnotBufferGeometry: TorusKnotBufferGeometry,
|
|
TorusGeometry: TorusGeometry,
|
|
TorusBufferGeometry: TorusBufferGeometry,
|
|
TextGeometry: TextGeometry,
|
|
TextBufferGeometry: TextBufferGeometry,
|
|
SphereGeometry: SphereGeometry,
|
|
SphereBufferGeometry: SphereBufferGeometry,
|
|
RingGeometry: RingGeometry,
|
|
RingBufferGeometry: RingBufferGeometry,
|
|
PlaneGeometry: PlaneGeometry,
|
|
PlaneBufferGeometry: PlaneBufferGeometry,
|
|
LatheGeometry: LatheGeometry,
|
|
LatheBufferGeometry: LatheBufferGeometry,
|
|
ShapeGeometry: ShapeGeometry,
|
|
ShapeBufferGeometry: ShapeBufferGeometry,
|
|
ExtrudeGeometry: ExtrudeGeometry,
|
|
ExtrudeBufferGeometry: ExtrudeBufferGeometry,
|
|
EdgesGeometry: EdgesGeometry,
|
|
ConeGeometry: ConeGeometry,
|
|
ConeBufferGeometry: ConeBufferGeometry,
|
|
CylinderGeometry: CylinderGeometry,
|
|
CylinderBufferGeometry: CylinderBufferGeometry,
|
|
CircleGeometry: CircleGeometry,
|
|
CircleBufferGeometry: CircleBufferGeometry,
|
|
BoxGeometry: BoxGeometry,
|
|
BoxBufferGeometry: BoxBufferGeometry
|
|
});
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*
|
|
* parameters = {
|
|
* opacity: <float>
|
|
* }
|
|
*/
|
|
|
|
function ShadowMaterial( parameters ) {
|
|
|
|
ShaderMaterial.call( this, {
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.lights,
|
|
{
|
|
opacity: { value: 1.0 }
|
|
}
|
|
] ),
|
|
vertexShader: ShaderChunk[ 'shadow_vert' ],
|
|
fragmentShader: ShaderChunk[ 'shadow_frag' ]
|
|
} );
|
|
|
|
this.lights = true;
|
|
this.transparent = true;
|
|
|
|
Object.defineProperties( this, {
|
|
opacity: {
|
|
enumerable: true,
|
|
get: function () {
|
|
return this.uniforms.opacity.value;
|
|
},
|
|
set: function ( value ) {
|
|
this.uniforms.opacity.value = value;
|
|
}
|
|
}
|
|
} );
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );
|
|
ShadowMaterial.prototype.constructor = ShadowMaterial;
|
|
|
|
ShadowMaterial.prototype.isShadowMaterial = true;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function RawShaderMaterial( parameters ) {
|
|
|
|
ShaderMaterial.call( this, parameters );
|
|
|
|
this.type = 'RawShaderMaterial';
|
|
|
|
}
|
|
|
|
RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );
|
|
RawShaderMaterial.prototype.constructor = RawShaderMaterial;
|
|
|
|
RawShaderMaterial.prototype.isRawShaderMaterial = true;
|
|
|
|
/**
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* roughness: <float>,
|
|
* metalness: <float>,
|
|
* opacity: <float>,
|
|
*
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* lightMap: new THREE.Texture( <Image> ),
|
|
* lightMapIntensity: <float>
|
|
*
|
|
* aoMap: new THREE.Texture( <Image> ),
|
|
* aoMapIntensity: <float>
|
|
*
|
|
* emissive: <hex>,
|
|
* emissiveIntensity: <float>
|
|
* emissiveMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* bumpMap: new THREE.Texture( <Image> ),
|
|
* bumpScale: <float>,
|
|
*
|
|
* normalMap: new THREE.Texture( <Image> ),
|
|
* normalScale: <Vector2>,
|
|
*
|
|
* displacementMap: new THREE.Texture( <Image> ),
|
|
* displacementScale: <float>,
|
|
* displacementBias: <float>,
|
|
*
|
|
* roughnessMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* metalnessMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* alphaMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
|
|
* envMapIntensity: <float>
|
|
*
|
|
* refractionRatio: <float>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>,
|
|
*
|
|
* skinning: <bool>,
|
|
* morphTargets: <bool>,
|
|
* morphNormals: <bool>
|
|
* }
|
|
*/
|
|
|
|
function MeshStandardMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.defines = { 'STANDARD': '' };
|
|
|
|
this.type = 'MeshStandardMaterial';
|
|
|
|
this.color = new Color( 0xffffff ); // diffuse
|
|
this.roughness = 0.5;
|
|
this.metalness = 0.5;
|
|
|
|
this.map = null;
|
|
|
|
this.lightMap = null;
|
|
this.lightMapIntensity = 1.0;
|
|
|
|
this.aoMap = null;
|
|
this.aoMapIntensity = 1.0;
|
|
|
|
this.emissive = new Color( 0x000000 );
|
|
this.emissiveIntensity = 1.0;
|
|
this.emissiveMap = null;
|
|
|
|
this.bumpMap = null;
|
|
this.bumpScale = 1;
|
|
|
|
this.normalMap = null;
|
|
this.normalScale = new Vector2( 1, 1 );
|
|
|
|
this.displacementMap = null;
|
|
this.displacementScale = 1;
|
|
this.displacementBias = 0;
|
|
|
|
this.roughnessMap = null;
|
|
|
|
this.metalnessMap = null;
|
|
|
|
this.alphaMap = null;
|
|
|
|
this.envMap = null;
|
|
this.envMapIntensity = 1.0;
|
|
|
|
this.refractionRatio = 0.98;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
this.wireframeLinecap = 'round';
|
|
this.wireframeLinejoin = 'round';
|
|
|
|
this.skinning = false;
|
|
this.morphTargets = false;
|
|
this.morphNormals = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshStandardMaterial.prototype = Object.create( Material.prototype );
|
|
MeshStandardMaterial.prototype.constructor = MeshStandardMaterial;
|
|
|
|
MeshStandardMaterial.prototype.isMeshStandardMaterial = true;
|
|
|
|
MeshStandardMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.defines = { 'STANDARD': '' };
|
|
|
|
this.color.copy( source.color );
|
|
this.roughness = source.roughness;
|
|
this.metalness = source.metalness;
|
|
|
|
this.map = source.map;
|
|
|
|
this.lightMap = source.lightMap;
|
|
this.lightMapIntensity = source.lightMapIntensity;
|
|
|
|
this.aoMap = source.aoMap;
|
|
this.aoMapIntensity = source.aoMapIntensity;
|
|
|
|
this.emissive.copy( source.emissive );
|
|
this.emissiveMap = source.emissiveMap;
|
|
this.emissiveIntensity = source.emissiveIntensity;
|
|
|
|
this.bumpMap = source.bumpMap;
|
|
this.bumpScale = source.bumpScale;
|
|
|
|
this.normalMap = source.normalMap;
|
|
this.normalScale.copy( source.normalScale );
|
|
|
|
this.displacementMap = source.displacementMap;
|
|
this.displacementScale = source.displacementScale;
|
|
this.displacementBias = source.displacementBias;
|
|
|
|
this.roughnessMap = source.roughnessMap;
|
|
|
|
this.metalnessMap = source.metalnessMap;
|
|
|
|
this.alphaMap = source.alphaMap;
|
|
|
|
this.envMap = source.envMap;
|
|
this.envMapIntensity = source.envMapIntensity;
|
|
|
|
this.refractionRatio = source.refractionRatio;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
this.wireframeLinecap = source.wireframeLinecap;
|
|
this.wireframeLinejoin = source.wireframeLinejoin;
|
|
|
|
this.skinning = source.skinning;
|
|
this.morphTargets = source.morphTargets;
|
|
this.morphNormals = source.morphNormals;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*
|
|
* parameters = {
|
|
* reflectivity: <float>
|
|
* }
|
|
*/
|
|
|
|
function MeshPhysicalMaterial( parameters ) {
|
|
|
|
MeshStandardMaterial.call( this );
|
|
|
|
this.defines = { 'PHYSICAL': '' };
|
|
|
|
this.type = 'MeshPhysicalMaterial';
|
|
|
|
this.reflectivity = 0.5; // maps to F0 = 0.04
|
|
|
|
this.clearCoat = 0.0;
|
|
this.clearCoatRoughness = 0.0;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );
|
|
MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;
|
|
|
|
MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;
|
|
|
|
MeshPhysicalMaterial.prototype.copy = function ( source ) {
|
|
|
|
MeshStandardMaterial.prototype.copy.call( this, source );
|
|
|
|
this.defines = { 'PHYSICAL': '' };
|
|
|
|
this.reflectivity = source.reflectivity;
|
|
|
|
this.clearCoat = source.clearCoat;
|
|
this.clearCoatRoughness = source.clearCoatRoughness;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* specular: <hex>,
|
|
* shininess: <float>,
|
|
* opacity: <float>,
|
|
*
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* lightMap: new THREE.Texture( <Image> ),
|
|
* lightMapIntensity: <float>
|
|
*
|
|
* aoMap: new THREE.Texture( <Image> ),
|
|
* aoMapIntensity: <float>
|
|
*
|
|
* emissive: <hex>,
|
|
* emissiveIntensity: <float>
|
|
* emissiveMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* bumpMap: new THREE.Texture( <Image> ),
|
|
* bumpScale: <float>,
|
|
*
|
|
* normalMap: new THREE.Texture( <Image> ),
|
|
* normalScale: <Vector2>,
|
|
*
|
|
* displacementMap: new THREE.Texture( <Image> ),
|
|
* displacementScale: <float>,
|
|
* displacementBias: <float>,
|
|
*
|
|
* specularMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* alphaMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
|
|
* combine: THREE.Multiply,
|
|
* reflectivity: <float>,
|
|
* refractionRatio: <float>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>,
|
|
*
|
|
* skinning: <bool>,
|
|
* morphTargets: <bool>,
|
|
* morphNormals: <bool>
|
|
* }
|
|
*/
|
|
|
|
function MeshPhongMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'MeshPhongMaterial';
|
|
|
|
this.color = new Color( 0xffffff ); // diffuse
|
|
this.specular = new Color( 0x111111 );
|
|
this.shininess = 30;
|
|
|
|
this.map = null;
|
|
|
|
this.lightMap = null;
|
|
this.lightMapIntensity = 1.0;
|
|
|
|
this.aoMap = null;
|
|
this.aoMapIntensity = 1.0;
|
|
|
|
this.emissive = new Color( 0x000000 );
|
|
this.emissiveIntensity = 1.0;
|
|
this.emissiveMap = null;
|
|
|
|
this.bumpMap = null;
|
|
this.bumpScale = 1;
|
|
|
|
this.normalMap = null;
|
|
this.normalScale = new Vector2( 1, 1 );
|
|
|
|
this.displacementMap = null;
|
|
this.displacementScale = 1;
|
|
this.displacementBias = 0;
|
|
|
|
this.specularMap = null;
|
|
|
|
this.alphaMap = null;
|
|
|
|
this.envMap = null;
|
|
this.combine = MultiplyOperation;
|
|
this.reflectivity = 1;
|
|
this.refractionRatio = 0.98;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
this.wireframeLinecap = 'round';
|
|
this.wireframeLinejoin = 'round';
|
|
|
|
this.skinning = false;
|
|
this.morphTargets = false;
|
|
this.morphNormals = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshPhongMaterial.prototype = Object.create( Material.prototype );
|
|
MeshPhongMaterial.prototype.constructor = MeshPhongMaterial;
|
|
|
|
MeshPhongMaterial.prototype.isMeshPhongMaterial = true;
|
|
|
|
MeshPhongMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
this.specular.copy( source.specular );
|
|
this.shininess = source.shininess;
|
|
|
|
this.map = source.map;
|
|
|
|
this.lightMap = source.lightMap;
|
|
this.lightMapIntensity = source.lightMapIntensity;
|
|
|
|
this.aoMap = source.aoMap;
|
|
this.aoMapIntensity = source.aoMapIntensity;
|
|
|
|
this.emissive.copy( source.emissive );
|
|
this.emissiveMap = source.emissiveMap;
|
|
this.emissiveIntensity = source.emissiveIntensity;
|
|
|
|
this.bumpMap = source.bumpMap;
|
|
this.bumpScale = source.bumpScale;
|
|
|
|
this.normalMap = source.normalMap;
|
|
this.normalScale.copy( source.normalScale );
|
|
|
|
this.displacementMap = source.displacementMap;
|
|
this.displacementScale = source.displacementScale;
|
|
this.displacementBias = source.displacementBias;
|
|
|
|
this.specularMap = source.specularMap;
|
|
|
|
this.alphaMap = source.alphaMap;
|
|
|
|
this.envMap = source.envMap;
|
|
this.combine = source.combine;
|
|
this.reflectivity = source.reflectivity;
|
|
this.refractionRatio = source.refractionRatio;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
this.wireframeLinecap = source.wireframeLinecap;
|
|
this.wireframeLinejoin = source.wireframeLinejoin;
|
|
|
|
this.skinning = source.skinning;
|
|
this.morphTargets = source.morphTargets;
|
|
this.morphNormals = source.morphNormals;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author takahirox / http://github.com/takahirox
|
|
*
|
|
* parameters = {
|
|
* gradientMap: new THREE.Texture( <Image> )
|
|
* }
|
|
*/
|
|
|
|
function MeshToonMaterial( parameters ) {
|
|
|
|
MeshPhongMaterial.call( this );
|
|
|
|
this.defines = { 'TOON': '' };
|
|
|
|
this.type = 'MeshToonMaterial';
|
|
|
|
this.gradientMap = null;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );
|
|
MeshToonMaterial.prototype.constructor = MeshToonMaterial;
|
|
|
|
MeshToonMaterial.prototype.isMeshToonMaterial = true;
|
|
|
|
MeshToonMaterial.prototype.copy = function ( source ) {
|
|
|
|
MeshPhongMaterial.prototype.copy.call( this, source );
|
|
|
|
this.gradientMap = source.gradientMap;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*
|
|
* parameters = {
|
|
* opacity: <float>,
|
|
*
|
|
* bumpMap: new THREE.Texture( <Image> ),
|
|
* bumpScale: <float>,
|
|
*
|
|
* normalMap: new THREE.Texture( <Image> ),
|
|
* normalScale: <Vector2>,
|
|
*
|
|
* displacementMap: new THREE.Texture( <Image> ),
|
|
* displacementScale: <float>,
|
|
* displacementBias: <float>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>
|
|
*
|
|
* skinning: <bool>,
|
|
* morphTargets: <bool>,
|
|
* morphNormals: <bool>
|
|
* }
|
|
*/
|
|
|
|
function MeshNormalMaterial( parameters ) {
|
|
|
|
Material.call( this, parameters );
|
|
|
|
this.type = 'MeshNormalMaterial';
|
|
|
|
this.bumpMap = null;
|
|
this.bumpScale = 1;
|
|
|
|
this.normalMap = null;
|
|
this.normalScale = new Vector2( 1, 1 );
|
|
|
|
this.displacementMap = null;
|
|
this.displacementScale = 1;
|
|
this.displacementBias = 0;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
|
|
this.fog = false;
|
|
this.lights = false;
|
|
|
|
this.skinning = false;
|
|
this.morphTargets = false;
|
|
this.morphNormals = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshNormalMaterial.prototype = Object.create( Material.prototype );
|
|
MeshNormalMaterial.prototype.constructor = MeshNormalMaterial;
|
|
|
|
MeshNormalMaterial.prototype.isMeshNormalMaterial = true;
|
|
|
|
MeshNormalMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.bumpMap = source.bumpMap;
|
|
this.bumpScale = source.bumpScale;
|
|
|
|
this.normalMap = source.normalMap;
|
|
this.normalScale.copy( source.normalScale );
|
|
|
|
this.displacementMap = source.displacementMap;
|
|
this.displacementScale = source.displacementScale;
|
|
this.displacementBias = source.displacementBias;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
|
|
this.skinning = source.skinning;
|
|
this.morphTargets = source.morphTargets;
|
|
this.morphNormals = source.morphNormals;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* opacity: <float>,
|
|
*
|
|
* map: new THREE.Texture( <Image> ),
|
|
*
|
|
* lightMap: new THREE.Texture( <Image> ),
|
|
* lightMapIntensity: <float>
|
|
*
|
|
* aoMap: new THREE.Texture( <Image> ),
|
|
* aoMapIntensity: <float>
|
|
*
|
|
* emissive: <hex>,
|
|
* emissiveIntensity: <float>
|
|
* emissiveMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* specularMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* alphaMap: new THREE.Texture( <Image> ),
|
|
*
|
|
* envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),
|
|
* combine: THREE.Multiply,
|
|
* reflectivity: <float>,
|
|
* refractionRatio: <float>,
|
|
*
|
|
* wireframe: <boolean>,
|
|
* wireframeLinewidth: <float>,
|
|
*
|
|
* skinning: <bool>,
|
|
* morphTargets: <bool>,
|
|
* morphNormals: <bool>
|
|
* }
|
|
*/
|
|
|
|
function MeshLambertMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'MeshLambertMaterial';
|
|
|
|
this.color = new Color( 0xffffff ); // diffuse
|
|
|
|
this.map = null;
|
|
|
|
this.lightMap = null;
|
|
this.lightMapIntensity = 1.0;
|
|
|
|
this.aoMap = null;
|
|
this.aoMapIntensity = 1.0;
|
|
|
|
this.emissive = new Color( 0x000000 );
|
|
this.emissiveIntensity = 1.0;
|
|
this.emissiveMap = null;
|
|
|
|
this.specularMap = null;
|
|
|
|
this.alphaMap = null;
|
|
|
|
this.envMap = null;
|
|
this.combine = MultiplyOperation;
|
|
this.reflectivity = 1;
|
|
this.refractionRatio = 0.98;
|
|
|
|
this.wireframe = false;
|
|
this.wireframeLinewidth = 1;
|
|
this.wireframeLinecap = 'round';
|
|
this.wireframeLinejoin = 'round';
|
|
|
|
this.skinning = false;
|
|
this.morphTargets = false;
|
|
this.morphNormals = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
MeshLambertMaterial.prototype = Object.create( Material.prototype );
|
|
MeshLambertMaterial.prototype.constructor = MeshLambertMaterial;
|
|
|
|
MeshLambertMaterial.prototype.isMeshLambertMaterial = true;
|
|
|
|
MeshLambertMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
|
|
this.map = source.map;
|
|
|
|
this.lightMap = source.lightMap;
|
|
this.lightMapIntensity = source.lightMapIntensity;
|
|
|
|
this.aoMap = source.aoMap;
|
|
this.aoMapIntensity = source.aoMapIntensity;
|
|
|
|
this.emissive.copy( source.emissive );
|
|
this.emissiveMap = source.emissiveMap;
|
|
this.emissiveIntensity = source.emissiveIntensity;
|
|
|
|
this.specularMap = source.specularMap;
|
|
|
|
this.alphaMap = source.alphaMap;
|
|
|
|
this.envMap = source.envMap;
|
|
this.combine = source.combine;
|
|
this.reflectivity = source.reflectivity;
|
|
this.refractionRatio = source.refractionRatio;
|
|
|
|
this.wireframe = source.wireframe;
|
|
this.wireframeLinewidth = source.wireframeLinewidth;
|
|
this.wireframeLinecap = source.wireframeLinecap;
|
|
this.wireframeLinejoin = source.wireframeLinejoin;
|
|
|
|
this.skinning = source.skinning;
|
|
this.morphTargets = source.morphTargets;
|
|
this.morphNormals = source.morphNormals;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*
|
|
* parameters = {
|
|
* color: <hex>,
|
|
* opacity: <float>,
|
|
*
|
|
* linewidth: <float>,
|
|
*
|
|
* scale: <float>,
|
|
* dashSize: <float>,
|
|
* gapSize: <float>
|
|
* }
|
|
*/
|
|
|
|
function LineDashedMaterial( parameters ) {
|
|
|
|
Material.call( this );
|
|
|
|
this.type = 'LineDashedMaterial';
|
|
|
|
this.color = new Color( 0xffffff );
|
|
|
|
this.linewidth = 1;
|
|
|
|
this.scale = 1;
|
|
this.dashSize = 3;
|
|
this.gapSize = 1;
|
|
|
|
this.lights = false;
|
|
|
|
this.setValues( parameters );
|
|
|
|
}
|
|
|
|
LineDashedMaterial.prototype = Object.create( Material.prototype );
|
|
LineDashedMaterial.prototype.constructor = LineDashedMaterial;
|
|
|
|
LineDashedMaterial.prototype.isLineDashedMaterial = true;
|
|
|
|
LineDashedMaterial.prototype.copy = function ( source ) {
|
|
|
|
Material.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
|
|
this.linewidth = source.linewidth;
|
|
|
|
this.scale = source.scale;
|
|
this.dashSize = source.dashSize;
|
|
this.gapSize = source.gapSize;
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
|
|
|
|
var Materials = Object.freeze({
|
|
ShadowMaterial: ShadowMaterial,
|
|
SpriteMaterial: SpriteMaterial,
|
|
RawShaderMaterial: RawShaderMaterial,
|
|
ShaderMaterial: ShaderMaterial,
|
|
PointsMaterial: PointsMaterial,
|
|
MeshPhysicalMaterial: MeshPhysicalMaterial,
|
|
MeshStandardMaterial: MeshStandardMaterial,
|
|
MeshPhongMaterial: MeshPhongMaterial,
|
|
MeshToonMaterial: MeshToonMaterial,
|
|
MeshNormalMaterial: MeshNormalMaterial,
|
|
MeshLambertMaterial: MeshLambertMaterial,
|
|
MeshDepthMaterial: MeshDepthMaterial,
|
|
MeshBasicMaterial: MeshBasicMaterial,
|
|
LineDashedMaterial: LineDashedMaterial,
|
|
LineBasicMaterial: LineBasicMaterial,
|
|
Material: Material
|
|
});
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
var Cache = {
|
|
|
|
enabled: false,
|
|
|
|
files: {},
|
|
|
|
add: function ( key, file ) {
|
|
|
|
if ( this.enabled === false ) return;
|
|
|
|
// console.log( 'THREE.Cache', 'Adding key:', key );
|
|
|
|
this.files[ key ] = file;
|
|
|
|
},
|
|
|
|
get: function ( key ) {
|
|
|
|
if ( this.enabled === false ) return;
|
|
|
|
// console.log( 'THREE.Cache', 'Checking key:', key );
|
|
|
|
return this.files[ key ];
|
|
|
|
},
|
|
|
|
remove: function ( key ) {
|
|
|
|
delete this.files[ key ];
|
|
|
|
},
|
|
|
|
clear: function () {
|
|
|
|
this.files = {};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function LoadingManager( onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var isLoading = false, itemsLoaded = 0, itemsTotal = 0;
|
|
|
|
this.onStart = undefined;
|
|
this.onLoad = onLoad;
|
|
this.onProgress = onProgress;
|
|
this.onError = onError;
|
|
|
|
this.itemStart = function ( url ) {
|
|
|
|
itemsTotal ++;
|
|
|
|
if ( isLoading === false ) {
|
|
|
|
if ( scope.onStart !== undefined ) {
|
|
|
|
scope.onStart( url, itemsLoaded, itemsTotal );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
isLoading = true;
|
|
|
|
};
|
|
|
|
this.itemEnd = function ( url ) {
|
|
|
|
itemsLoaded ++;
|
|
|
|
if ( scope.onProgress !== undefined ) {
|
|
|
|
scope.onProgress( url, itemsLoaded, itemsTotal );
|
|
|
|
}
|
|
|
|
if ( itemsLoaded === itemsTotal ) {
|
|
|
|
isLoading = false;
|
|
|
|
if ( scope.onLoad !== undefined ) {
|
|
|
|
scope.onLoad();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
this.itemError = function ( url ) {
|
|
|
|
if ( scope.onError !== undefined ) {
|
|
|
|
scope.onError( url );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
var DefaultLoadingManager = new LoadingManager();
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function FileLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( FileLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
if ( url === undefined ) url = '';
|
|
|
|
if ( this.path !== undefined ) url = this.path + url;
|
|
|
|
var scope = this;
|
|
|
|
var cached = Cache.get( url );
|
|
|
|
if ( cached !== undefined ) {
|
|
|
|
scope.manager.itemStart( url );
|
|
|
|
setTimeout( function () {
|
|
|
|
if ( onLoad ) onLoad( cached );
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
}, 0 );
|
|
|
|
return cached;
|
|
|
|
}
|
|
|
|
// Check for data: URI
|
|
var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;
|
|
var dataUriRegexResult = url.match( dataUriRegex );
|
|
|
|
// Safari can not handle Data URIs through XMLHttpRequest so process manually
|
|
if ( dataUriRegexResult ) {
|
|
|
|
var mimeType = dataUriRegexResult[ 1 ];
|
|
var isBase64 = !! dataUriRegexResult[ 2 ];
|
|
var data = dataUriRegexResult[ 3 ];
|
|
|
|
data = window.decodeURIComponent( data );
|
|
|
|
if ( isBase64 ) data = window.atob( data );
|
|
|
|
try {
|
|
|
|
var response;
|
|
var responseType = ( this.responseType || '' ).toLowerCase();
|
|
|
|
switch ( responseType ) {
|
|
|
|
case 'arraybuffer':
|
|
case 'blob':
|
|
|
|
response = new ArrayBuffer( data.length );
|
|
|
|
var view = new Uint8Array( response );
|
|
|
|
for ( var i = 0; i < data.length; i ++ ) {
|
|
|
|
view[ i ] = data.charCodeAt( i );
|
|
|
|
}
|
|
|
|
if ( responseType === 'blob' ) {
|
|
|
|
response = new Blob( [ response ], { type: mimeType } );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'document':
|
|
|
|
var parser = new DOMParser();
|
|
response = parser.parseFromString( data, mimeType );
|
|
|
|
break;
|
|
|
|
case 'json':
|
|
|
|
response = JSON.parse( data );
|
|
|
|
break;
|
|
|
|
default: // 'text' or other
|
|
|
|
response = data;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// Wait for next browser tick
|
|
window.setTimeout( function () {
|
|
|
|
if ( onLoad ) onLoad( response );
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
}, 0 );
|
|
|
|
} catch ( error ) {
|
|
|
|
// Wait for next browser tick
|
|
window.setTimeout( function () {
|
|
|
|
if ( onError ) onError( error );
|
|
|
|
scope.manager.itemEnd( url );
|
|
scope.manager.itemError( url );
|
|
|
|
}, 0 );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var request = new XMLHttpRequest();
|
|
request.open( 'GET', url, true );
|
|
|
|
request.addEventListener( 'load', function ( event ) {
|
|
|
|
var response = event.target.response;
|
|
|
|
Cache.add( url, response );
|
|
|
|
if ( this.status === 200 ) {
|
|
|
|
if ( onLoad ) onLoad( response );
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
} else if ( this.status === 0 ) {
|
|
|
|
// Some browsers return HTTP Status 0 when using non-http protocol
|
|
// e.g. 'file://' or 'data://'. Handle as success.
|
|
|
|
console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
|
|
|
|
if ( onLoad ) onLoad( response );
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
} else {
|
|
|
|
if ( onError ) onError( event );
|
|
|
|
scope.manager.itemEnd( url );
|
|
scope.manager.itemError( url );
|
|
|
|
}
|
|
|
|
}, false );
|
|
|
|
if ( onProgress !== undefined ) {
|
|
|
|
request.addEventListener( 'progress', function ( event ) {
|
|
|
|
onProgress( event );
|
|
|
|
}, false );
|
|
|
|
}
|
|
|
|
request.addEventListener( 'error', function ( event ) {
|
|
|
|
if ( onError ) onError( event );
|
|
|
|
scope.manager.itemEnd( url );
|
|
scope.manager.itemError( url );
|
|
|
|
}, false );
|
|
|
|
if ( this.responseType !== undefined ) request.responseType = this.responseType;
|
|
if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;
|
|
|
|
if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );
|
|
|
|
for ( var header in this.requestHeader ) {
|
|
|
|
request.setRequestHeader( header, this.requestHeader[ header ] );
|
|
|
|
}
|
|
|
|
request.send( null );
|
|
|
|
}
|
|
|
|
scope.manager.itemStart( url );
|
|
|
|
return request;
|
|
|
|
},
|
|
|
|
setPath: function ( value ) {
|
|
|
|
this.path = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setResponseType: function ( value ) {
|
|
|
|
this.responseType = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setWithCredentials: function ( value ) {
|
|
|
|
this.withCredentials = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setMimeType: function ( value ) {
|
|
|
|
this.mimeType = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setRequestHeader: function ( value ) {
|
|
|
|
this.requestHeader = value;
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*
|
|
* Abstract Base class to block based textures loader (dds, pvr, ...)
|
|
*/
|
|
|
|
function CompressedTextureLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
// override in sub classes
|
|
this._parser = null;
|
|
|
|
}
|
|
|
|
Object.assign( CompressedTextureLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var images = [];
|
|
|
|
var texture = new CompressedTexture();
|
|
texture.image = images;
|
|
|
|
var loader = new FileLoader( this.manager );
|
|
loader.setPath( this.path );
|
|
loader.setResponseType( 'arraybuffer' );
|
|
|
|
function loadTexture( i ) {
|
|
|
|
loader.load( url[ i ], function ( buffer ) {
|
|
|
|
var texDatas = scope._parser( buffer, true );
|
|
|
|
images[ i ] = {
|
|
width: texDatas.width,
|
|
height: texDatas.height,
|
|
format: texDatas.format,
|
|
mipmaps: texDatas.mipmaps
|
|
};
|
|
|
|
loaded += 1;
|
|
|
|
if ( loaded === 6 ) {
|
|
|
|
if ( texDatas.mipmapCount === 1 )
|
|
texture.minFilter = LinearFilter;
|
|
|
|
texture.format = texDatas.format;
|
|
texture.needsUpdate = true;
|
|
|
|
if ( onLoad ) onLoad( texture );
|
|
|
|
}
|
|
|
|
}, onProgress, onError );
|
|
|
|
}
|
|
|
|
if ( Array.isArray( url ) ) {
|
|
|
|
var loaded = 0;
|
|
|
|
for ( var i = 0, il = url.length; i < il; ++ i ) {
|
|
|
|
loadTexture( i );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// compressed cubemap texture stored in a single DDS file
|
|
|
|
loader.load( url, function ( buffer ) {
|
|
|
|
var texDatas = scope._parser( buffer, true );
|
|
|
|
if ( texDatas.isCubemap ) {
|
|
|
|
var faces = texDatas.mipmaps.length / texDatas.mipmapCount;
|
|
|
|
for ( var f = 0; f < faces; f ++ ) {
|
|
|
|
images[ f ] = { mipmaps : [] };
|
|
|
|
for ( var i = 0; i < texDatas.mipmapCount; i ++ ) {
|
|
|
|
images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
|
|
images[ f ].format = texDatas.format;
|
|
images[ f ].width = texDatas.width;
|
|
images[ f ].height = texDatas.height;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
texture.image.width = texDatas.width;
|
|
texture.image.height = texDatas.height;
|
|
texture.mipmaps = texDatas.mipmaps;
|
|
|
|
}
|
|
|
|
if ( texDatas.mipmapCount === 1 ) {
|
|
|
|
texture.minFilter = LinearFilter;
|
|
|
|
}
|
|
|
|
texture.format = texDatas.format;
|
|
texture.needsUpdate = true;
|
|
|
|
if ( onLoad ) onLoad( texture );
|
|
|
|
}, onProgress, onError );
|
|
|
|
}
|
|
|
|
return texture;
|
|
|
|
},
|
|
|
|
setPath: function ( value ) {
|
|
|
|
this.path = value;
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author Nikos M. / https://github.com/foo123/
|
|
*
|
|
* Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
|
|
*/
|
|
|
|
function DataTextureLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
// override in sub classes
|
|
this._parser = null;
|
|
|
|
}
|
|
|
|
Object.assign( DataTextureLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var texture = new DataTexture();
|
|
|
|
var loader = new FileLoader( this.manager );
|
|
loader.setResponseType( 'arraybuffer' );
|
|
|
|
loader.load( url, function ( buffer ) {
|
|
|
|
var texData = scope._parser( buffer );
|
|
|
|
if ( ! texData ) return;
|
|
|
|
if ( undefined !== texData.image ) {
|
|
|
|
texture.image = texData.image;
|
|
|
|
} else if ( undefined !== texData.data ) {
|
|
|
|
texture.image.width = texData.width;
|
|
texture.image.height = texData.height;
|
|
texture.image.data = texData.data;
|
|
|
|
}
|
|
|
|
texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;
|
|
texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;
|
|
|
|
texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;
|
|
texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;
|
|
|
|
texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;
|
|
|
|
if ( undefined !== texData.format ) {
|
|
|
|
texture.format = texData.format;
|
|
|
|
}
|
|
if ( undefined !== texData.type ) {
|
|
|
|
texture.type = texData.type;
|
|
|
|
}
|
|
|
|
if ( undefined !== texData.mipmaps ) {
|
|
|
|
texture.mipmaps = texData.mipmaps;
|
|
|
|
}
|
|
|
|
if ( 1 === texData.mipmapCount ) {
|
|
|
|
texture.minFilter = LinearFilter;
|
|
|
|
}
|
|
|
|
texture.needsUpdate = true;
|
|
|
|
if ( onLoad ) onLoad( texture, texData );
|
|
|
|
}, onProgress, onError );
|
|
|
|
|
|
return texture;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function ImageLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( ImageLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
if ( url === undefined ) url = '';
|
|
|
|
if ( this.path !== undefined ) url = this.path + url;
|
|
|
|
var scope = this;
|
|
|
|
var cached = Cache.get( url );
|
|
|
|
if ( cached !== undefined ) {
|
|
|
|
scope.manager.itemStart( url );
|
|
|
|
setTimeout( function () {
|
|
|
|
if ( onLoad ) onLoad( cached );
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
}, 0 );
|
|
|
|
return cached;
|
|
|
|
}
|
|
|
|
var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );
|
|
|
|
image.addEventListener( 'load', function () {
|
|
|
|
Cache.add( url, this );
|
|
|
|
if ( onLoad ) onLoad( this );
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
}, false );
|
|
|
|
/*
|
|
image.addEventListener( 'progress', function ( event ) {
|
|
|
|
if ( onProgress ) onProgress( event );
|
|
|
|
}, false );
|
|
*/
|
|
|
|
image.addEventListener( 'error', function ( event ) {
|
|
|
|
if ( onError ) onError( event );
|
|
|
|
scope.manager.itemEnd( url );
|
|
scope.manager.itemError( url );
|
|
|
|
}, false );
|
|
|
|
if ( url.substr( 0, 5 ) !== 'data:' ) {
|
|
|
|
if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
|
|
|
|
}
|
|
|
|
scope.manager.itemStart( url );
|
|
|
|
image.src = url;
|
|
|
|
return image;
|
|
|
|
},
|
|
|
|
setCrossOrigin: function ( value ) {
|
|
|
|
this.crossOrigin = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setPath: function ( value ) {
|
|
|
|
this.path = value;
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function CubeTextureLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( CubeTextureLoader.prototype, {
|
|
|
|
load: function ( urls, onLoad, onProgress, onError ) {
|
|
|
|
var texture = new CubeTexture();
|
|
|
|
var loader = new ImageLoader( this.manager );
|
|
loader.setCrossOrigin( this.crossOrigin );
|
|
loader.setPath( this.path );
|
|
|
|
var loaded = 0;
|
|
|
|
function loadTexture( i ) {
|
|
|
|
loader.load( urls[ i ], function ( image ) {
|
|
|
|
texture.images[ i ] = image;
|
|
|
|
loaded ++;
|
|
|
|
if ( loaded === 6 ) {
|
|
|
|
texture.needsUpdate = true;
|
|
|
|
if ( onLoad ) onLoad( texture );
|
|
|
|
}
|
|
|
|
}, undefined, onError );
|
|
|
|
}
|
|
|
|
for ( var i = 0; i < urls.length; ++ i ) {
|
|
|
|
loadTexture( i );
|
|
|
|
}
|
|
|
|
return texture;
|
|
|
|
},
|
|
|
|
setCrossOrigin: function ( value ) {
|
|
|
|
this.crossOrigin = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setPath: function ( value ) {
|
|
|
|
this.path = value;
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function TextureLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( TextureLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var loader = new ImageLoader( this.manager );
|
|
loader.setCrossOrigin( this.crossOrigin );
|
|
loader.setPath( this.path );
|
|
|
|
var texture = new Texture();
|
|
texture.image = loader.load( url, function () {
|
|
|
|
// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.
|
|
var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0;
|
|
|
|
texture.format = isJPEG ? RGBFormat : RGBAFormat;
|
|
texture.needsUpdate = true;
|
|
|
|
if ( onLoad !== undefined ) {
|
|
|
|
onLoad( texture );
|
|
|
|
}
|
|
|
|
}, onProgress, onError );
|
|
|
|
return texture;
|
|
|
|
},
|
|
|
|
setCrossOrigin: function ( value ) {
|
|
|
|
this.crossOrigin = value;
|
|
return this;
|
|
|
|
},
|
|
|
|
setPath: function ( value ) {
|
|
|
|
this.path = value;
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Light( color, intensity ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Light';
|
|
|
|
this.color = new Color( color );
|
|
this.intensity = intensity !== undefined ? intensity : 1;
|
|
|
|
this.receiveShadow = undefined;
|
|
|
|
}
|
|
|
|
Light.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Light,
|
|
|
|
isLight: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Object3D.prototype.copy.call( this, source );
|
|
|
|
this.color.copy( source.color );
|
|
this.intensity = source.intensity;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var data = Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
data.object.color = this.color.getHex();
|
|
data.object.intensity = this.intensity;
|
|
|
|
if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();
|
|
|
|
if ( this.distance !== undefined ) data.object.distance = this.distance;
|
|
if ( this.angle !== undefined ) data.object.angle = this.angle;
|
|
if ( this.decay !== undefined ) data.object.decay = this.decay;
|
|
if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
|
|
|
|
if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function HemisphereLight( skyColor, groundColor, intensity ) {
|
|
|
|
Light.call( this, skyColor, intensity );
|
|
|
|
this.type = 'HemisphereLight';
|
|
|
|
this.castShadow = undefined;
|
|
|
|
this.position.copy( Object3D.DefaultUp );
|
|
this.updateMatrix();
|
|
|
|
this.groundColor = new Color( groundColor );
|
|
|
|
}
|
|
|
|
HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {
|
|
|
|
constructor: HemisphereLight,
|
|
|
|
isHemisphereLight: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Light.prototype.copy.call( this, source );
|
|
|
|
this.groundColor.copy( source.groundColor );
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function LightShadow( camera ) {
|
|
|
|
this.camera = camera;
|
|
|
|
this.bias = 0;
|
|
this.radius = 1;
|
|
|
|
this.mapSize = new Vector2( 512, 512 );
|
|
|
|
this.map = null;
|
|
this.matrix = new Matrix4();
|
|
|
|
}
|
|
|
|
Object.assign( LightShadow.prototype, {
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.camera = source.camera.clone();
|
|
|
|
this.bias = source.bias;
|
|
this.radius = source.radius;
|
|
|
|
this.mapSize.copy( source.mapSize );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
toJSON: function () {
|
|
|
|
var object = {};
|
|
|
|
if ( this.bias !== 0 ) object.bias = this.bias;
|
|
if ( this.radius !== 1 ) object.radius = this.radius;
|
|
if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
|
|
|
|
object.camera = this.camera.toJSON( false ).object;
|
|
delete object.camera.matrix;
|
|
|
|
return object;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function SpotLightShadow() {
|
|
|
|
LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );
|
|
|
|
}
|
|
|
|
SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
|
|
|
|
constructor: SpotLightShadow,
|
|
|
|
isSpotLightShadow: true,
|
|
|
|
update: function ( light ) {
|
|
|
|
var camera = this.camera;
|
|
|
|
var fov = _Math.RAD2DEG * 2 * light.angle;
|
|
var aspect = this.mapSize.width / this.mapSize.height;
|
|
var far = light.distance || camera.far;
|
|
|
|
if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {
|
|
|
|
camera.fov = fov;
|
|
camera.aspect = aspect;
|
|
camera.far = far;
|
|
camera.updateProjectionMatrix();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function SpotLight( color, intensity, distance, angle, penumbra, decay ) {
|
|
|
|
Light.call( this, color, intensity );
|
|
|
|
this.type = 'SpotLight';
|
|
|
|
this.position.copy( Object3D.DefaultUp );
|
|
this.updateMatrix();
|
|
|
|
this.target = new Object3D();
|
|
|
|
Object.defineProperty( this, 'power', {
|
|
get: function () {
|
|
// intensity = power per solid angle.
|
|
// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf
|
|
return this.intensity * Math.PI;
|
|
},
|
|
set: function ( power ) {
|
|
// intensity = power per solid angle.
|
|
// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf
|
|
this.intensity = power / Math.PI;
|
|
}
|
|
} );
|
|
|
|
this.distance = ( distance !== undefined ) ? distance : 0;
|
|
this.angle = ( angle !== undefined ) ? angle : Math.PI / 3;
|
|
this.penumbra = ( penumbra !== undefined ) ? penumbra : 0;
|
|
this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2.
|
|
|
|
this.shadow = new SpotLightShadow();
|
|
|
|
}
|
|
|
|
SpotLight.prototype = Object.assign( Object.create( Light.prototype ), {
|
|
|
|
constructor: SpotLight,
|
|
|
|
isSpotLight: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Light.prototype.copy.call( this, source );
|
|
|
|
this.distance = source.distance;
|
|
this.angle = source.angle;
|
|
this.penumbra = source.penumbra;
|
|
this.decay = source.decay;
|
|
|
|
this.target = source.target.clone();
|
|
|
|
this.shadow = source.shadow.clone();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
|
|
function PointLight( color, intensity, distance, decay ) {
|
|
|
|
Light.call( this, color, intensity );
|
|
|
|
this.type = 'PointLight';
|
|
|
|
Object.defineProperty( this, 'power', {
|
|
get: function () {
|
|
// intensity = power per solid angle.
|
|
// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf
|
|
return this.intensity * 4 * Math.PI;
|
|
|
|
},
|
|
set: function ( power ) {
|
|
// intensity = power per solid angle.
|
|
// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf
|
|
this.intensity = power / ( 4 * Math.PI );
|
|
}
|
|
} );
|
|
|
|
this.distance = ( distance !== undefined ) ? distance : 0;
|
|
this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2.
|
|
|
|
this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
|
|
|
|
}
|
|
|
|
PointLight.prototype = Object.assign( Object.create( Light.prototype ), {
|
|
|
|
constructor: PointLight,
|
|
|
|
isPointLight: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Light.prototype.copy.call( this, source );
|
|
|
|
this.distance = source.distance;
|
|
this.decay = source.decay;
|
|
|
|
this.shadow = source.shadow.clone();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function DirectionalLightShadow( ) {
|
|
|
|
LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );
|
|
|
|
}
|
|
|
|
DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
|
|
|
|
constructor: DirectionalLightShadow
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function DirectionalLight( color, intensity ) {
|
|
|
|
Light.call( this, color, intensity );
|
|
|
|
this.type = 'DirectionalLight';
|
|
|
|
this.position.copy( Object3D.DefaultUp );
|
|
this.updateMatrix();
|
|
|
|
this.target = new Object3D();
|
|
|
|
this.shadow = new DirectionalLightShadow();
|
|
|
|
}
|
|
|
|
DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {
|
|
|
|
constructor: DirectionalLight,
|
|
|
|
isDirectionalLight: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Light.prototype.copy.call( this, source );
|
|
|
|
this.target = source.target.clone();
|
|
|
|
this.shadow = source.shadow.clone();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function AmbientLight( color, intensity ) {
|
|
|
|
Light.call( this, color, intensity );
|
|
|
|
this.type = 'AmbientLight';
|
|
|
|
this.castShadow = undefined;
|
|
|
|
}
|
|
|
|
AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {
|
|
|
|
constructor: AmbientLight,
|
|
|
|
isAmbientLight: true
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author abelnation / http://github.com/abelnation
|
|
*/
|
|
|
|
function RectAreaLight( color, intensity, width, height ) {
|
|
|
|
Light.call( this, color, intensity );
|
|
|
|
this.type = 'RectAreaLight';
|
|
|
|
this.position.set( 0, 1, 0 );
|
|
this.updateMatrix();
|
|
|
|
this.width = ( width !== undefined ) ? width : 10;
|
|
this.height = ( height !== undefined ) ? height : 10;
|
|
|
|
// TODO (abelnation): distance/decay
|
|
|
|
// TODO (abelnation): update method for RectAreaLight to update transform to lookat target
|
|
|
|
// TODO (abelnation): shadows
|
|
|
|
}
|
|
|
|
// TODO (abelnation): RectAreaLight update when light shape is changed
|
|
RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {
|
|
|
|
constructor: RectAreaLight,
|
|
|
|
isRectAreaLight: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
Light.prototype.copy.call( this, source );
|
|
|
|
this.width = source.width;
|
|
this.height = source.height;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toJSON: function ( meta ) {
|
|
|
|
var data = Light.prototype.toJSON.call( this, meta );
|
|
|
|
data.object.width = this.width;
|
|
data.object.height = this.height;
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author tschw
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
*/
|
|
|
|
var AnimationUtils = {
|
|
|
|
// same as Array.prototype.slice, but also works on typed arrays
|
|
arraySlice: function ( array, from, to ) {
|
|
|
|
if ( AnimationUtils.isTypedArray( array ) ) {
|
|
|
|
// in ios9 array.subarray(from, undefined) will return empty array
|
|
// but array.subarray(from) or array.subarray(from, len) is correct
|
|
return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );
|
|
|
|
}
|
|
|
|
return array.slice( from, to );
|
|
|
|
},
|
|
|
|
// converts an array to a specific type
|
|
convertArray: function ( array, type, forceClone ) {
|
|
|
|
if ( ! array || // let 'undefined' and 'null' pass
|
|
! forceClone && array.constructor === type ) return array;
|
|
|
|
if ( typeof type.BYTES_PER_ELEMENT === 'number' ) {
|
|
|
|
return new type( array ); // create typed array
|
|
|
|
}
|
|
|
|
return Array.prototype.slice.call( array ); // create Array
|
|
|
|
},
|
|
|
|
isTypedArray: function ( object ) {
|
|
|
|
return ArrayBuffer.isView( object ) &&
|
|
! ( object instanceof DataView );
|
|
|
|
},
|
|
|
|
// returns an array by which times and values can be sorted
|
|
getKeyframeOrder: function ( times ) {
|
|
|
|
function compareTime( i, j ) {
|
|
|
|
return times[ i ] - times[ j ];
|
|
|
|
}
|
|
|
|
var n = times.length;
|
|
var result = new Array( n );
|
|
for ( var i = 0; i !== n; ++ i ) result[ i ] = i;
|
|
|
|
result.sort( compareTime );
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
// uses the array previously returned by 'getKeyframeOrder' to sort data
|
|
sortedArray: function ( values, stride, order ) {
|
|
|
|
var nValues = values.length;
|
|
var result = new values.constructor( nValues );
|
|
|
|
for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {
|
|
|
|
var srcOffset = order[ i ] * stride;
|
|
|
|
for ( var j = 0; j !== stride; ++ j ) {
|
|
|
|
result[ dstOffset ++ ] = values[ srcOffset + j ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
// function for parsing AOS keyframe formats
|
|
flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {
|
|
|
|
var i = 1, key = jsonKeys[ 0 ];
|
|
|
|
while ( key !== undefined && key[ valuePropertyName ] === undefined ) {
|
|
|
|
key = jsonKeys[ i ++ ];
|
|
|
|
}
|
|
|
|
if ( key === undefined ) return; // no data
|
|
|
|
var value = key[ valuePropertyName ];
|
|
if ( value === undefined ) return; // no data
|
|
|
|
if ( Array.isArray( value ) ) {
|
|
|
|
do {
|
|
|
|
value = key[ valuePropertyName ];
|
|
|
|
if ( value !== undefined ) {
|
|
|
|
times.push( key.time );
|
|
values.push.apply( values, value ); // push all elements
|
|
|
|
}
|
|
|
|
key = jsonKeys[ i ++ ];
|
|
|
|
} while ( key !== undefined );
|
|
|
|
} else if ( value.toArray !== undefined ) {
|
|
|
|
// ...assume THREE.Math-ish
|
|
|
|
do {
|
|
|
|
value = key[ valuePropertyName ];
|
|
|
|
if ( value !== undefined ) {
|
|
|
|
times.push( key.time );
|
|
value.toArray( values, values.length );
|
|
|
|
}
|
|
|
|
key = jsonKeys[ i ++ ];
|
|
|
|
} while ( key !== undefined );
|
|
|
|
} else {
|
|
|
|
// otherwise push as-is
|
|
|
|
do {
|
|
|
|
value = key[ valuePropertyName ];
|
|
|
|
if ( value !== undefined ) {
|
|
|
|
times.push( key.time );
|
|
values.push( value );
|
|
|
|
}
|
|
|
|
key = jsonKeys[ i ++ ];
|
|
|
|
} while ( key !== undefined );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* Abstract base class of interpolants over parametric samples.
|
|
*
|
|
* The parameter domain is one dimensional, typically the time or a path
|
|
* along a curve defined by the data.
|
|
*
|
|
* The sample values can have any dimensionality and derived classes may
|
|
* apply special interpretations to the data.
|
|
*
|
|
* This class provides the interval seek in a Template Method, deferring
|
|
* the actual interpolation to derived classes.
|
|
*
|
|
* Time complexity is O(1) for linear access crossing at most two points
|
|
* and O(log N) for random access, where N is the number of positions.
|
|
*
|
|
* References:
|
|
*
|
|
* http://www.oodesign.com/template-method-pattern.html
|
|
*
|
|
* @author tschw
|
|
*/
|
|
|
|
function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
|
|
|
|
this.parameterPositions = parameterPositions;
|
|
this._cachedIndex = 0;
|
|
|
|
this.resultBuffer = resultBuffer !== undefined ?
|
|
resultBuffer : new sampleValues.constructor( sampleSize );
|
|
this.sampleValues = sampleValues;
|
|
this.valueSize = sampleSize;
|
|
|
|
}
|
|
|
|
Object.assign( Interpolant.prototype, {
|
|
|
|
evaluate: function( t ) {
|
|
|
|
var pp = this.parameterPositions,
|
|
i1 = this._cachedIndex,
|
|
|
|
t1 = pp[ i1 ],
|
|
t0 = pp[ i1 - 1 ];
|
|
|
|
validate_interval: {
|
|
|
|
seek: {
|
|
|
|
var right;
|
|
|
|
linear_scan: {
|
|
//- See http://jsperf.com/comparison-to-undefined/3
|
|
//- slower code:
|
|
//-
|
|
//- if ( t >= t1 || t1 === undefined ) {
|
|
forward_scan: if ( ! ( t < t1 ) ) {
|
|
|
|
for ( var giveUpAt = i1 + 2; ;) {
|
|
|
|
if ( t1 === undefined ) {
|
|
|
|
if ( t < t0 ) break forward_scan;
|
|
|
|
// after end
|
|
|
|
i1 = pp.length;
|
|
this._cachedIndex = i1;
|
|
return this.afterEnd_( i1 - 1, t, t0 );
|
|
|
|
}
|
|
|
|
if ( i1 === giveUpAt ) break; // this loop
|
|
|
|
t0 = t1;
|
|
t1 = pp[ ++ i1 ];
|
|
|
|
if ( t < t1 ) {
|
|
|
|
// we have arrived at the sought interval
|
|
break seek;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// prepare binary search on the right side of the index
|
|
right = pp.length;
|
|
break linear_scan;
|
|
|
|
}
|
|
|
|
//- slower code:
|
|
//- if ( t < t0 || t0 === undefined ) {
|
|
if ( ! ( t >= t0 ) ) {
|
|
|
|
// looping?
|
|
|
|
var t1global = pp[ 1 ];
|
|
|
|
if ( t < t1global ) {
|
|
|
|
i1 = 2; // + 1, using the scan for the details
|
|
t0 = t1global;
|
|
|
|
}
|
|
|
|
// linear reverse scan
|
|
|
|
for ( var giveUpAt = i1 - 2; ;) {
|
|
|
|
if ( t0 === undefined ) {
|
|
|
|
// before start
|
|
|
|
this._cachedIndex = 0;
|
|
return this.beforeStart_( 0, t, t1 );
|
|
|
|
}
|
|
|
|
if ( i1 === giveUpAt ) break; // this loop
|
|
|
|
t1 = t0;
|
|
t0 = pp[ -- i1 - 1 ];
|
|
|
|
if ( t >= t0 ) {
|
|
|
|
// we have arrived at the sought interval
|
|
break seek;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// prepare binary search on the left side of the index
|
|
right = i1;
|
|
i1 = 0;
|
|
break linear_scan;
|
|
|
|
}
|
|
|
|
// the interval is valid
|
|
|
|
break validate_interval;
|
|
|
|
} // linear scan
|
|
|
|
// binary search
|
|
|
|
while ( i1 < right ) {
|
|
|
|
var mid = ( i1 + right ) >>> 1;
|
|
|
|
if ( t < pp[ mid ] ) {
|
|
|
|
right = mid;
|
|
|
|
} else {
|
|
|
|
i1 = mid + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
t1 = pp[ i1 ];
|
|
t0 = pp[ i1 - 1 ];
|
|
|
|
// check boundary cases, again
|
|
|
|
if ( t0 === undefined ) {
|
|
|
|
this._cachedIndex = 0;
|
|
return this.beforeStart_( 0, t, t1 );
|
|
|
|
}
|
|
|
|
if ( t1 === undefined ) {
|
|
|
|
i1 = pp.length;
|
|
this._cachedIndex = i1;
|
|
return this.afterEnd_( i1 - 1, t0, t );
|
|
|
|
}
|
|
|
|
} // seek
|
|
|
|
this._cachedIndex = i1;
|
|
|
|
this.intervalChanged_( i1, t0, t1 );
|
|
|
|
} // validate_interval
|
|
|
|
return this.interpolate_( i1, t0, t, t1 );
|
|
|
|
},
|
|
|
|
settings: null, // optional, subclass-specific settings structure
|
|
// Note: The indirection allows central control of many interpolants.
|
|
|
|
// --- Protected interface
|
|
|
|
DefaultSettings_: {},
|
|
|
|
getSettings_: function() {
|
|
|
|
return this.settings || this.DefaultSettings_;
|
|
|
|
},
|
|
|
|
copySampleValue_: function( index ) {
|
|
|
|
// copies a sample value to the result buffer
|
|
|
|
var result = this.resultBuffer,
|
|
values = this.sampleValues,
|
|
stride = this.valueSize,
|
|
offset = index * stride;
|
|
|
|
for ( var i = 0; i !== stride; ++ i ) {
|
|
|
|
result[ i ] = values[ offset + i ];
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
// Template methods for derived classes:
|
|
|
|
interpolate_: function( i1, t0, t, t1 ) {
|
|
|
|
throw new Error( "call to abstract method" );
|
|
// implementations shall return this.resultBuffer
|
|
|
|
},
|
|
|
|
intervalChanged_: function( i1, t0, t1 ) {
|
|
|
|
// empty
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
//!\ DECLARE ALIAS AFTER assign prototype !
|
|
Object.assign( Interpolant.prototype, {
|
|
|
|
//( 0, t, t0 ), returns this.resultBuffer
|
|
beforeStart_: Interpolant.prototype.copySampleValue_,
|
|
|
|
//( N-1, tN-1, t ), returns this.resultBuffer
|
|
afterEnd_: Interpolant.prototype.copySampleValue_,
|
|
|
|
} );
|
|
|
|
/**
|
|
* Fast and simple cubic spline interpolant.
|
|
*
|
|
* It was derived from a Hermitian construction setting the first derivative
|
|
* at each sample position to the linear slope between neighboring positions
|
|
* over their parameter interval.
|
|
*
|
|
* @author tschw
|
|
*/
|
|
|
|
function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
|
|
|
|
Interpolant.call(
|
|
this, parameterPositions, sampleValues, sampleSize, resultBuffer );
|
|
|
|
this._weightPrev = -0;
|
|
this._offsetPrev = -0;
|
|
this._weightNext = -0;
|
|
this._offsetNext = -0;
|
|
|
|
}
|
|
|
|
CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
|
|
|
|
constructor: CubicInterpolant,
|
|
|
|
DefaultSettings_: {
|
|
|
|
endingStart: ZeroCurvatureEnding,
|
|
endingEnd: ZeroCurvatureEnding
|
|
|
|
},
|
|
|
|
intervalChanged_: function( i1, t0, t1 ) {
|
|
|
|
var pp = this.parameterPositions,
|
|
iPrev = i1 - 2,
|
|
iNext = i1 + 1,
|
|
|
|
tPrev = pp[ iPrev ],
|
|
tNext = pp[ iNext ];
|
|
|
|
if ( tPrev === undefined ) {
|
|
|
|
switch ( this.getSettings_().endingStart ) {
|
|
|
|
case ZeroSlopeEnding:
|
|
|
|
// f'(t0) = 0
|
|
iPrev = i1;
|
|
tPrev = 2 * t0 - t1;
|
|
|
|
break;
|
|
|
|
case WrapAroundEnding:
|
|
|
|
// use the other end of the curve
|
|
iPrev = pp.length - 2;
|
|
tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];
|
|
|
|
break;
|
|
|
|
default: // ZeroCurvatureEnding
|
|
|
|
// f''(t0) = 0 a.k.a. Natural Spline
|
|
iPrev = i1;
|
|
tPrev = t1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( tNext === undefined ) {
|
|
|
|
switch ( this.getSettings_().endingEnd ) {
|
|
|
|
case ZeroSlopeEnding:
|
|
|
|
// f'(tN) = 0
|
|
iNext = i1;
|
|
tNext = 2 * t1 - t0;
|
|
|
|
break;
|
|
|
|
case WrapAroundEnding:
|
|
|
|
// use the other end of the curve
|
|
iNext = 1;
|
|
tNext = t1 + pp[ 1 ] - pp[ 0 ];
|
|
|
|
break;
|
|
|
|
default: // ZeroCurvatureEnding
|
|
|
|
// f''(tN) = 0, a.k.a. Natural Spline
|
|
iNext = i1 - 1;
|
|
tNext = t0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var halfDt = ( t1 - t0 ) * 0.5,
|
|
stride = this.valueSize;
|
|
|
|
this._weightPrev = halfDt / ( t0 - tPrev );
|
|
this._weightNext = halfDt / ( tNext - t1 );
|
|
this._offsetPrev = iPrev * stride;
|
|
this._offsetNext = iNext * stride;
|
|
|
|
},
|
|
|
|
interpolate_: function( i1, t0, t, t1 ) {
|
|
|
|
var result = this.resultBuffer,
|
|
values = this.sampleValues,
|
|
stride = this.valueSize,
|
|
|
|
o1 = i1 * stride, o0 = o1 - stride,
|
|
oP = this._offsetPrev, oN = this._offsetNext,
|
|
wP = this._weightPrev, wN = this._weightNext,
|
|
|
|
p = ( t - t0 ) / ( t1 - t0 ),
|
|
pp = p * p,
|
|
ppp = pp * p;
|
|
|
|
// evaluate polynomials
|
|
|
|
var sP = - wP * ppp + 2 * wP * pp - wP * p;
|
|
var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;
|
|
var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;
|
|
var sN = wN * ppp - wN * pp;
|
|
|
|
// combine data linearly
|
|
|
|
for ( var i = 0; i !== stride; ++ i ) {
|
|
|
|
result[ i ] =
|
|
sP * values[ oP + i ] +
|
|
s0 * values[ o0 + i ] +
|
|
s1 * values[ o1 + i ] +
|
|
sN * values[ oN + i ];
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author tschw
|
|
*/
|
|
|
|
function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
|
|
|
|
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
|
|
|
|
}
|
|
|
|
LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
|
|
|
|
constructor: LinearInterpolant,
|
|
|
|
interpolate_: function( i1, t0, t, t1 ) {
|
|
|
|
var result = this.resultBuffer,
|
|
values = this.sampleValues,
|
|
stride = this.valueSize,
|
|
|
|
offset1 = i1 * stride,
|
|
offset0 = offset1 - stride,
|
|
|
|
weight1 = ( t - t0 ) / ( t1 - t0 ),
|
|
weight0 = 1 - weight1;
|
|
|
|
for ( var i = 0; i !== stride; ++ i ) {
|
|
|
|
result[ i ] =
|
|
values[ offset0 + i ] * weight0 +
|
|
values[ offset1 + i ] * weight1;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* Interpolant that evaluates to the sample value at the position preceeding
|
|
* the parameter.
|
|
*
|
|
* @author tschw
|
|
*/
|
|
|
|
function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
|
|
|
|
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
|
|
|
|
}
|
|
|
|
DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
|
|
|
|
constructor: DiscreteInterpolant,
|
|
|
|
interpolate_: function( i1, t0, t, t1 ) {
|
|
|
|
return this.copySampleValue_( i1 - 1 );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
var KeyframeTrackPrototype;
|
|
|
|
KeyframeTrackPrototype = {
|
|
|
|
TimeBufferType: Float32Array,
|
|
ValueBufferType: Float32Array,
|
|
|
|
DefaultInterpolation: InterpolateLinear,
|
|
|
|
InterpolantFactoryMethodDiscrete: function ( result ) {
|
|
|
|
return new DiscreteInterpolant(
|
|
this.times, this.values, this.getValueSize(), result );
|
|
|
|
},
|
|
|
|
InterpolantFactoryMethodLinear: function ( result ) {
|
|
|
|
return new LinearInterpolant(
|
|
this.times, this.values, this.getValueSize(), result );
|
|
|
|
},
|
|
|
|
InterpolantFactoryMethodSmooth: function ( result ) {
|
|
|
|
return new CubicInterpolant(
|
|
this.times, this.values, this.getValueSize(), result );
|
|
|
|
},
|
|
|
|
setInterpolation: function ( interpolation ) {
|
|
|
|
var factoryMethod;
|
|
|
|
switch ( interpolation ) {
|
|
|
|
case InterpolateDiscrete:
|
|
|
|
factoryMethod = this.InterpolantFactoryMethodDiscrete;
|
|
|
|
break;
|
|
|
|
case InterpolateLinear:
|
|
|
|
factoryMethod = this.InterpolantFactoryMethodLinear;
|
|
|
|
break;
|
|
|
|
case InterpolateSmooth:
|
|
|
|
factoryMethod = this.InterpolantFactoryMethodSmooth;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if ( factoryMethod === undefined ) {
|
|
|
|
var message = "unsupported interpolation for " +
|
|
this.ValueTypeName + " keyframe track named " + this.name;
|
|
|
|
if ( this.createInterpolant === undefined ) {
|
|
|
|
// fall back to default, unless the default itself is messed up
|
|
if ( interpolation !== this.DefaultInterpolation ) {
|
|
|
|
this.setInterpolation( this.DefaultInterpolation );
|
|
|
|
} else {
|
|
|
|
throw new Error( message ); // fatal, in this case
|
|
|
|
}
|
|
|
|
}
|
|
|
|
console.warn( message );
|
|
return;
|
|
|
|
}
|
|
|
|
this.createInterpolant = factoryMethod;
|
|
|
|
},
|
|
|
|
getInterpolation: function () {
|
|
|
|
switch ( this.createInterpolant ) {
|
|
|
|
case this.InterpolantFactoryMethodDiscrete:
|
|
|
|
return InterpolateDiscrete;
|
|
|
|
case this.InterpolantFactoryMethodLinear:
|
|
|
|
return InterpolateLinear;
|
|
|
|
case this.InterpolantFactoryMethodSmooth:
|
|
|
|
return InterpolateSmooth;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
getValueSize: function () {
|
|
|
|
return this.values.length / this.times.length;
|
|
|
|
},
|
|
|
|
// move all keyframes either forwards or backwards in time
|
|
shift: function ( timeOffset ) {
|
|
|
|
if ( timeOffset !== 0.0 ) {
|
|
|
|
var times = this.times;
|
|
|
|
for ( var i = 0, n = times.length; i !== n; ++ i ) {
|
|
|
|
times[ i ] += timeOffset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// scale all keyframe times by a factor (useful for frame <-> seconds conversions)
|
|
scale: function ( timeScale ) {
|
|
|
|
if ( timeScale !== 1.0 ) {
|
|
|
|
var times = this.times;
|
|
|
|
for ( var i = 0, n = times.length; i !== n; ++ i ) {
|
|
|
|
times[ i ] *= timeScale;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// removes keyframes before and after animation without changing any values within the range [startTime, endTime].
|
|
// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values
|
|
trim: function ( startTime, endTime ) {
|
|
|
|
var times = this.times,
|
|
nKeys = times.length,
|
|
from = 0,
|
|
to = nKeys - 1;
|
|
|
|
while ( from !== nKeys && times[ from ] < startTime ) ++ from;
|
|
while ( to !== - 1 && times[ to ] > endTime ) -- to;
|
|
|
|
++ to; // inclusive -> exclusive bound
|
|
|
|
if ( from !== 0 || to !== nKeys ) {
|
|
|
|
// empty tracks are forbidden, so keep at least one keyframe
|
|
if ( from >= to ) to = Math.max( to, 1 ), from = to - 1;
|
|
|
|
var stride = this.getValueSize();
|
|
this.times = AnimationUtils.arraySlice( times, from, to );
|
|
this.values = AnimationUtils.
|
|
arraySlice( this.values, from * stride, to * stride );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable
|
|
validate: function () {
|
|
|
|
var valid = true;
|
|
|
|
var valueSize = this.getValueSize();
|
|
if ( valueSize - Math.floor( valueSize ) !== 0 ) {
|
|
|
|
console.error( "invalid value size in track", this );
|
|
valid = false;
|
|
|
|
}
|
|
|
|
var times = this.times,
|
|
values = this.values,
|
|
|
|
nKeys = times.length;
|
|
|
|
if ( nKeys === 0 ) {
|
|
|
|
console.error( "track is empty", this );
|
|
valid = false;
|
|
|
|
}
|
|
|
|
var prevTime = null;
|
|
|
|
for ( var i = 0; i !== nKeys; i ++ ) {
|
|
|
|
var currTime = times[ i ];
|
|
|
|
if ( typeof currTime === 'number' && isNaN( currTime ) ) {
|
|
|
|
console.error( "time is not a valid number", this, i, currTime );
|
|
valid = false;
|
|
break;
|
|
|
|
}
|
|
|
|
if ( prevTime !== null && prevTime > currTime ) {
|
|
|
|
console.error( "out of order keys", this, i, currTime, prevTime );
|
|
valid = false;
|
|
break;
|
|
|
|
}
|
|
|
|
prevTime = currTime;
|
|
|
|
}
|
|
|
|
if ( values !== undefined ) {
|
|
|
|
if ( AnimationUtils.isTypedArray( values ) ) {
|
|
|
|
for ( var i = 0, n = values.length; i !== n; ++ i ) {
|
|
|
|
var value = values[ i ];
|
|
|
|
if ( isNaN( value ) ) {
|
|
|
|
console.error( "value is not a valid number", this, i, value );
|
|
valid = false;
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return valid;
|
|
|
|
},
|
|
|
|
// removes equivalent sequential keys as common in morph target sequences
|
|
// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)
|
|
optimize: function () {
|
|
|
|
var times = this.times,
|
|
values = this.values,
|
|
stride = this.getValueSize(),
|
|
|
|
smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
|
|
|
|
writeIndex = 1,
|
|
lastIndex = times.length - 1;
|
|
|
|
for ( var i = 1; i < lastIndex; ++ i ) {
|
|
|
|
var keep = false;
|
|
|
|
var time = times[ i ];
|
|
var timeNext = times[ i + 1 ];
|
|
|
|
// remove adjacent keyframes scheduled at the same time
|
|
|
|
if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {
|
|
|
|
if ( ! smoothInterpolation ) {
|
|
|
|
// remove unnecessary keyframes same as their neighbors
|
|
|
|
var offset = i * stride,
|
|
offsetP = offset - stride,
|
|
offsetN = offset + stride;
|
|
|
|
for ( var j = 0; j !== stride; ++ j ) {
|
|
|
|
var value = values[ offset + j ];
|
|
|
|
if ( value !== values[ offsetP + j ] ||
|
|
value !== values[ offsetN + j ] ) {
|
|
|
|
keep = true;
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else keep = true;
|
|
|
|
}
|
|
|
|
// in-place compaction
|
|
|
|
if ( keep ) {
|
|
|
|
if ( i !== writeIndex ) {
|
|
|
|
times[ writeIndex ] = times[ i ];
|
|
|
|
var readOffset = i * stride,
|
|
writeOffset = writeIndex * stride;
|
|
|
|
for ( var j = 0; j !== stride; ++ j )
|
|
|
|
values[ writeOffset + j ] = values[ readOffset + j ];
|
|
|
|
}
|
|
|
|
++ writeIndex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// flush last keyframe (compaction looks ahead)
|
|
|
|
if ( lastIndex > 0 ) {
|
|
|
|
times[ writeIndex ] = times[ lastIndex ];
|
|
|
|
for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )
|
|
|
|
values[ writeOffset + j ] = values[ readOffset + j ];
|
|
|
|
++ writeIndex;
|
|
|
|
}
|
|
|
|
if ( writeIndex !== times.length ) {
|
|
|
|
this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
|
|
this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
function KeyframeTrackConstructor( name, times, values, interpolation ) {
|
|
|
|
if ( name === undefined ) throw new Error( "track name is undefined" );
|
|
|
|
if ( times === undefined || times.length === 0 ) {
|
|
|
|
throw new Error( "no keyframes in track named " + name );
|
|
|
|
}
|
|
|
|
this.name = name;
|
|
|
|
this.times = AnimationUtils.convertArray( times, this.TimeBufferType );
|
|
this.values = AnimationUtils.convertArray( values, this.ValueBufferType );
|
|
|
|
this.setInterpolation( interpolation || this.DefaultInterpolation );
|
|
|
|
this.validate();
|
|
this.optimize();
|
|
|
|
}
|
|
|
|
/**
|
|
*
|
|
* A Track of vectored keyframe values.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function VectorKeyframeTrack( name, times, values, interpolation ) {
|
|
|
|
KeyframeTrackConstructor.call( this, name, times, values, interpolation );
|
|
|
|
}
|
|
|
|
VectorKeyframeTrack.prototype =
|
|
Object.assign( Object.create( KeyframeTrackPrototype ), {
|
|
|
|
constructor: VectorKeyframeTrack,
|
|
|
|
ValueTypeName: 'vector'
|
|
|
|
// ValueBufferType is inherited
|
|
|
|
// DefaultInterpolation is inherited
|
|
|
|
} );
|
|
|
|
/**
|
|
* Spherical linear unit quaternion interpolant.
|
|
*
|
|
* @author tschw
|
|
*/
|
|
|
|
function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
|
|
|
|
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
|
|
|
|
}
|
|
|
|
QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
|
|
|
|
constructor: QuaternionLinearInterpolant,
|
|
|
|
interpolate_: function( i1, t0, t, t1 ) {
|
|
|
|
var result = this.resultBuffer,
|
|
values = this.sampleValues,
|
|
stride = this.valueSize,
|
|
|
|
offset = i1 * stride,
|
|
|
|
alpha = ( t - t0 ) / ( t1 - t0 );
|
|
|
|
for ( var end = offset + stride; offset !== end; offset += 4 ) {
|
|
|
|
Quaternion.slerpFlat( result, 0,
|
|
values, offset - stride, values, offset, alpha );
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A Track of quaternion keyframe values.
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function QuaternionKeyframeTrack( name, times, values, interpolation ) {
|
|
|
|
KeyframeTrackConstructor.call( this, name, times, values, interpolation );
|
|
|
|
}
|
|
|
|
QuaternionKeyframeTrack.prototype =
|
|
Object.assign( Object.create( KeyframeTrackPrototype ), {
|
|
|
|
constructor: QuaternionKeyframeTrack,
|
|
|
|
ValueTypeName: 'quaternion',
|
|
|
|
// ValueBufferType is inherited
|
|
|
|
DefaultInterpolation: InterpolateLinear,
|
|
|
|
InterpolantFactoryMethodLinear: function( result ) {
|
|
|
|
return new QuaternionLinearInterpolant(
|
|
this.times, this.values, this.getValueSize(), result );
|
|
|
|
},
|
|
|
|
InterpolantFactoryMethodSmooth: undefined // not yet implemented
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A Track of numeric keyframe values.
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function NumberKeyframeTrack( name, times, values, interpolation ) {
|
|
|
|
KeyframeTrackConstructor.call( this, name, times, values, interpolation );
|
|
|
|
}
|
|
|
|
NumberKeyframeTrack.prototype =
|
|
Object.assign( Object.create( KeyframeTrackPrototype ), {
|
|
|
|
constructor: NumberKeyframeTrack,
|
|
|
|
ValueTypeName: 'number'
|
|
|
|
// ValueBufferType is inherited
|
|
|
|
// DefaultInterpolation is inherited
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A Track that interpolates Strings
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function StringKeyframeTrack( name, times, values, interpolation ) {
|
|
|
|
KeyframeTrackConstructor.call( this, name, times, values, interpolation );
|
|
|
|
}
|
|
|
|
StringKeyframeTrack.prototype =
|
|
Object.assign( Object.create( KeyframeTrackPrototype ), {
|
|
|
|
constructor: StringKeyframeTrack,
|
|
|
|
ValueTypeName: 'string',
|
|
ValueBufferType: Array,
|
|
|
|
DefaultInterpolation: InterpolateDiscrete,
|
|
|
|
InterpolantFactoryMethodLinear: undefined,
|
|
|
|
InterpolantFactoryMethodSmooth: undefined
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A Track of Boolean keyframe values.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function BooleanKeyframeTrack( name, times, values ) {
|
|
|
|
KeyframeTrackConstructor.call( this, name, times, values );
|
|
|
|
}
|
|
|
|
BooleanKeyframeTrack.prototype =
|
|
Object.assign( Object.create( KeyframeTrackPrototype ), {
|
|
|
|
constructor: BooleanKeyframeTrack,
|
|
|
|
ValueTypeName: 'bool',
|
|
ValueBufferType: Array,
|
|
|
|
DefaultInterpolation: InterpolateDiscrete,
|
|
|
|
InterpolantFactoryMethodLinear: undefined,
|
|
InterpolantFactoryMethodSmooth: undefined
|
|
|
|
// Note: Actually this track could have a optimized / compressed
|
|
// representation of a single value and a custom interpolant that
|
|
// computes "firstValue ^ isOdd( index )".
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A Track of keyframe values that represent color.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function ColorKeyframeTrack( name, times, values, interpolation ) {
|
|
|
|
KeyframeTrackConstructor.call( this, name, times, values, interpolation );
|
|
|
|
}
|
|
|
|
ColorKeyframeTrack.prototype =
|
|
Object.assign( Object.create( KeyframeTrackPrototype ), {
|
|
|
|
constructor: ColorKeyframeTrack,
|
|
|
|
ValueTypeName: 'color'
|
|
|
|
// ValueBufferType is inherited
|
|
|
|
// DefaultInterpolation is inherited
|
|
|
|
|
|
// Note: Very basic implementation and nothing special yet.
|
|
// However, this is the place for color space parameterization.
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A timed sequence of keyframes for a specific property.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function KeyframeTrack( name, times, values, interpolation ) {
|
|
|
|
KeyframeTrackConstructor.apply( this, arguments );
|
|
|
|
}
|
|
|
|
KeyframeTrack.prototype = KeyframeTrackPrototype;
|
|
KeyframeTrackPrototype.constructor = KeyframeTrack;
|
|
|
|
// Static methods:
|
|
|
|
Object.assign( KeyframeTrack, {
|
|
|
|
// Serialization (in static context, because of constructor invocation
|
|
// and automatic invocation of .toJSON):
|
|
|
|
parse: function( json ) {
|
|
|
|
if( json.type === undefined ) {
|
|
|
|
throw new Error( "track type undefined, can not parse" );
|
|
|
|
}
|
|
|
|
var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );
|
|
|
|
if ( json.times === undefined ) {
|
|
|
|
var times = [], values = [];
|
|
|
|
AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
|
|
|
|
json.times = times;
|
|
json.values = values;
|
|
|
|
}
|
|
|
|
// derived classes can define a static parse method
|
|
if ( trackType.parse !== undefined ) {
|
|
|
|
return trackType.parse( json );
|
|
|
|
} else {
|
|
|
|
// by default, we asssume a constructor compatible with the base
|
|
return new trackType(
|
|
json.name, json.times, json.values, json.interpolation );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
toJSON: function( track ) {
|
|
|
|
var trackType = track.constructor;
|
|
|
|
var json;
|
|
|
|
// derived classes can define a static toJSON method
|
|
if ( trackType.toJSON !== undefined ) {
|
|
|
|
json = trackType.toJSON( track );
|
|
|
|
} else {
|
|
|
|
// by default, we assume the data can be serialized as-is
|
|
json = {
|
|
|
|
'name': track.name,
|
|
'times': AnimationUtils.convertArray( track.times, Array ),
|
|
'values': AnimationUtils.convertArray( track.values, Array )
|
|
|
|
};
|
|
|
|
var interpolation = track.getInterpolation();
|
|
|
|
if ( interpolation !== track.DefaultInterpolation ) {
|
|
|
|
json.interpolation = interpolation;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
json.type = track.ValueTypeName; // mandatory
|
|
|
|
return json;
|
|
|
|
},
|
|
|
|
_getTrackTypeForValueTypeName: function( typeName ) {
|
|
|
|
switch( typeName.toLowerCase() ) {
|
|
|
|
case "scalar":
|
|
case "double":
|
|
case "float":
|
|
case "number":
|
|
case "integer":
|
|
|
|
return NumberKeyframeTrack;
|
|
|
|
case "vector":
|
|
case "vector2":
|
|
case "vector3":
|
|
case "vector4":
|
|
|
|
return VectorKeyframeTrack;
|
|
|
|
case "color":
|
|
|
|
return ColorKeyframeTrack;
|
|
|
|
case "quaternion":
|
|
|
|
return QuaternionKeyframeTrack;
|
|
|
|
case "bool":
|
|
case "boolean":
|
|
|
|
return BooleanKeyframeTrack;
|
|
|
|
case "string":
|
|
|
|
return StringKeyframeTrack;
|
|
|
|
}
|
|
|
|
throw new Error( "Unsupported typeName: " + typeName );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* Reusable set of Tracks that represent an animation.
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
*/
|
|
|
|
function AnimationClip( name, duration, tracks ) {
|
|
|
|
this.name = name;
|
|
this.tracks = tracks;
|
|
this.duration = ( duration !== undefined ) ? duration : - 1;
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
// this means it should figure out its duration by scanning the tracks
|
|
if ( this.duration < 0 ) {
|
|
|
|
this.resetDuration();
|
|
|
|
}
|
|
|
|
this.optimize();
|
|
|
|
}
|
|
|
|
Object.assign( AnimationClip, {
|
|
|
|
parse: function ( json ) {
|
|
|
|
var tracks = [],
|
|
jsonTracks = json.tracks,
|
|
frameTime = 1.0 / ( json.fps || 1.0 );
|
|
|
|
for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {
|
|
|
|
tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );
|
|
|
|
}
|
|
|
|
return new AnimationClip( json.name, json.duration, tracks );
|
|
|
|
},
|
|
|
|
toJSON: function ( clip ) {
|
|
|
|
var tracks = [],
|
|
clipTracks = clip.tracks;
|
|
|
|
var json = {
|
|
|
|
'name': clip.name,
|
|
'duration': clip.duration,
|
|
'tracks': tracks
|
|
|
|
};
|
|
|
|
for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {
|
|
|
|
tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
|
|
|
|
}
|
|
|
|
return json;
|
|
|
|
},
|
|
|
|
CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {
|
|
|
|
var numMorphTargets = morphTargetSequence.length;
|
|
var tracks = [];
|
|
|
|
for ( var i = 0; i < numMorphTargets; i ++ ) {
|
|
|
|
var times = [];
|
|
var values = [];
|
|
|
|
times.push(
|
|
( i + numMorphTargets - 1 ) % numMorphTargets,
|
|
i,
|
|
( i + 1 ) % numMorphTargets );
|
|
|
|
values.push( 0, 1, 0 );
|
|
|
|
var order = AnimationUtils.getKeyframeOrder( times );
|
|
times = AnimationUtils.sortedArray( times, 1, order );
|
|
values = AnimationUtils.sortedArray( values, 1, order );
|
|
|
|
// if there is a key at the first frame, duplicate it as the
|
|
// last frame as well for perfect loop.
|
|
if ( ! noLoop && times[ 0 ] === 0 ) {
|
|
|
|
times.push( numMorphTargets );
|
|
values.push( values[ 0 ] );
|
|
|
|
}
|
|
|
|
tracks.push(
|
|
new NumberKeyframeTrack(
|
|
'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
|
|
times, values
|
|
).scale( 1.0 / fps ) );
|
|
|
|
}
|
|
|
|
return new AnimationClip( name, - 1, tracks );
|
|
|
|
},
|
|
|
|
findByName: function ( objectOrClipArray, name ) {
|
|
|
|
var clipArray = objectOrClipArray;
|
|
|
|
if ( ! Array.isArray( objectOrClipArray ) ) {
|
|
|
|
var o = objectOrClipArray;
|
|
clipArray = o.geometry && o.geometry.animations || o.animations;
|
|
|
|
}
|
|
|
|
for ( var i = 0; i < clipArray.length; i ++ ) {
|
|
|
|
if ( clipArray[ i ].name === name ) {
|
|
|
|
return clipArray[ i ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {
|
|
|
|
var animationToMorphTargets = {};
|
|
|
|
// tested with https://regex101.com/ on trick sequences
|
|
// such flamingo_flyA_003, flamingo_run1_003, crdeath0059
|
|
var pattern = /^([\w-]*?)([\d]+)$/;
|
|
|
|
// sort morph target names into animation groups based
|
|
// patterns like Walk_001, Walk_002, Run_001, Run_002
|
|
for ( var i = 0, il = morphTargets.length; i < il; i ++ ) {
|
|
|
|
var morphTarget = morphTargets[ i ];
|
|
var parts = morphTarget.name.match( pattern );
|
|
|
|
if ( parts && parts.length > 1 ) {
|
|
|
|
var name = parts[ 1 ];
|
|
|
|
var animationMorphTargets = animationToMorphTargets[ name ];
|
|
if ( ! animationMorphTargets ) {
|
|
|
|
animationToMorphTargets[ name ] = animationMorphTargets = [];
|
|
|
|
}
|
|
|
|
animationMorphTargets.push( morphTarget );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var clips = [];
|
|
|
|
for ( var name in animationToMorphTargets ) {
|
|
|
|
clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
|
|
|
|
}
|
|
|
|
return clips;
|
|
|
|
},
|
|
|
|
// parse the animation.hierarchy format
|
|
parseAnimation: function ( animation, bones ) {
|
|
|
|
if ( ! animation ) {
|
|
|
|
console.error( " no animation in JSONLoader data" );
|
|
return null;
|
|
|
|
}
|
|
|
|
var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
|
|
|
|
// only return track if there are actually keys.
|
|
if ( animationKeys.length !== 0 ) {
|
|
|
|
var times = [];
|
|
var values = [];
|
|
|
|
AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
|
|
|
|
// empty keys are filtered out, so check again
|
|
if ( times.length !== 0 ) {
|
|
|
|
destTracks.push( new trackType( trackName, times, values ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var tracks = [];
|
|
|
|
var clipName = animation.name || 'default';
|
|
// automatic length determination in AnimationClip.
|
|
var duration = animation.length || - 1;
|
|
var fps = animation.fps || 30;
|
|
|
|
var hierarchyTracks = animation.hierarchy || [];
|
|
|
|
for ( var h = 0; h < hierarchyTracks.length; h ++ ) {
|
|
|
|
var animationKeys = hierarchyTracks[ h ].keys;
|
|
|
|
// skip empty tracks
|
|
if ( ! animationKeys || animationKeys.length === 0 ) continue;
|
|
|
|
// process morph targets in a way exactly compatible
|
|
// with AnimationHandler.init( animation )
|
|
if ( animationKeys[ 0 ].morphTargets ) {
|
|
|
|
// figure out all morph targets used in this track
|
|
var morphTargetNames = {};
|
|
|
|
for ( var k = 0; k < animationKeys.length; k ++ ) {
|
|
|
|
if ( animationKeys[ k ].morphTargets ) {
|
|
|
|
for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
|
|
|
|
morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// create a track for each morph target with all zero
|
|
// morphTargetInfluences except for the keys in which
|
|
// the morphTarget is named.
|
|
for ( var morphTargetName in morphTargetNames ) {
|
|
|
|
var times = [];
|
|
var values = [];
|
|
|
|
for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
|
|
|
|
var animationKey = animationKeys[ k ];
|
|
|
|
times.push( animationKey.time );
|
|
values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
|
|
|
|
}
|
|
|
|
tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
|
|
|
|
}
|
|
|
|
duration = morphTargetNames.length * ( fps || 1.0 );
|
|
|
|
} else {
|
|
|
|
// ...assume skeletal animation
|
|
|
|
var boneName = '.bones[' + bones[ h ].name + ']';
|
|
|
|
addNonemptyTrack(
|
|
VectorKeyframeTrack, boneName + '.position',
|
|
animationKeys, 'pos', tracks );
|
|
|
|
addNonemptyTrack(
|
|
QuaternionKeyframeTrack, boneName + '.quaternion',
|
|
animationKeys, 'rot', tracks );
|
|
|
|
addNonemptyTrack(
|
|
VectorKeyframeTrack, boneName + '.scale',
|
|
animationKeys, 'scl', tracks );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( tracks.length === 0 ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
var clip = new AnimationClip( clipName, duration, tracks );
|
|
|
|
return clip;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( AnimationClip.prototype, {
|
|
|
|
resetDuration: function () {
|
|
|
|
var tracks = this.tracks, duration = 0;
|
|
|
|
for ( var i = 0, n = tracks.length; i !== n; ++ i ) {
|
|
|
|
var track = this.tracks[ i ];
|
|
|
|
duration = Math.max( duration, track.times[ track.times.length - 1 ] );
|
|
|
|
}
|
|
|
|
this.duration = duration;
|
|
|
|
},
|
|
|
|
trim: function () {
|
|
|
|
for ( var i = 0; i < this.tracks.length; i ++ ) {
|
|
|
|
this.tracks[ i ].trim( 0, this.duration );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
optimize: function () {
|
|
|
|
for ( var i = 0; i < this.tracks.length; i ++ ) {
|
|
|
|
this.tracks[ i ].optimize();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function MaterialLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
this.textures = {};
|
|
|
|
}
|
|
|
|
Object.assign( MaterialLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var loader = new FileLoader( scope.manager );
|
|
loader.setResponseType( 'json' );
|
|
loader.load( url, function ( json ) {
|
|
|
|
onLoad( scope.parse( json ) );
|
|
|
|
}, onProgress, onError );
|
|
|
|
},
|
|
|
|
setTextures: function ( value ) {
|
|
|
|
this.textures = value;
|
|
|
|
},
|
|
|
|
parse: function ( json ) {
|
|
|
|
var textures = this.textures;
|
|
|
|
function getTexture( name ) {
|
|
|
|
if ( textures[ name ] === undefined ) {
|
|
|
|
console.warn( 'THREE.MaterialLoader: Undefined texture', name );
|
|
|
|
}
|
|
|
|
return textures[ name ];
|
|
|
|
}
|
|
|
|
var material = new Materials[ json.type ]();
|
|
|
|
if ( json.uuid !== undefined ) material.uuid = json.uuid;
|
|
if ( json.name !== undefined ) material.name = json.name;
|
|
if ( json.color !== undefined ) material.color.setHex( json.color );
|
|
if ( json.roughness !== undefined ) material.roughness = json.roughness;
|
|
if ( json.metalness !== undefined ) material.metalness = json.metalness;
|
|
if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );
|
|
if ( json.specular !== undefined ) material.specular.setHex( json.specular );
|
|
if ( json.shininess !== undefined ) material.shininess = json.shininess;
|
|
if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;
|
|
if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;
|
|
if ( json.uniforms !== undefined ) material.uniforms = json.uniforms;
|
|
if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
|
|
if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
|
|
if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;
|
|
if ( json.fog !== undefined ) material.fog = json.fog;
|
|
if ( json.shading !== undefined ) material.shading = json.shading;
|
|
if ( json.blending !== undefined ) material.blending = json.blending;
|
|
if ( json.side !== undefined ) material.side = json.side;
|
|
if ( json.opacity !== undefined ) material.opacity = json.opacity;
|
|
if ( json.transparent !== undefined ) material.transparent = json.transparent;
|
|
if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
|
|
if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
|
|
if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
|
|
if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
|
|
if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
|
|
if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
|
|
if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;
|
|
if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;
|
|
if ( json.skinning !== undefined ) material.skinning = json.skinning;
|
|
if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;
|
|
|
|
// for PointsMaterial
|
|
|
|
if ( json.size !== undefined ) material.size = json.size;
|
|
if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;
|
|
|
|
// maps
|
|
|
|
if ( json.map !== undefined ) material.map = getTexture( json.map );
|
|
|
|
if ( json.alphaMap !== undefined ) {
|
|
|
|
material.alphaMap = getTexture( json.alphaMap );
|
|
material.transparent = true;
|
|
|
|
}
|
|
|
|
if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );
|
|
if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;
|
|
|
|
if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );
|
|
if ( json.normalScale !== undefined ) {
|
|
|
|
var normalScale = json.normalScale;
|
|
|
|
if ( Array.isArray( normalScale ) === false ) {
|
|
|
|
// Blender exporter used to export a scalar. See #7459
|
|
|
|
normalScale = [ normalScale, normalScale ];
|
|
|
|
}
|
|
|
|
material.normalScale = new Vector2().fromArray( normalScale );
|
|
|
|
}
|
|
|
|
if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );
|
|
if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;
|
|
if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;
|
|
|
|
if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );
|
|
if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );
|
|
|
|
if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );
|
|
if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;
|
|
|
|
if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );
|
|
|
|
if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );
|
|
|
|
if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;
|
|
|
|
if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );
|
|
if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;
|
|
|
|
if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );
|
|
if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;
|
|
|
|
if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );
|
|
|
|
return material;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function BufferGeometryLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( BufferGeometryLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var loader = new FileLoader( scope.manager );
|
|
loader.setResponseType( 'json' );
|
|
loader.load( url, function ( json ) {
|
|
|
|
onLoad( scope.parse( json ) );
|
|
|
|
}, onProgress, onError );
|
|
|
|
},
|
|
|
|
parse: function ( json ) {
|
|
|
|
var geometry = new BufferGeometry();
|
|
|
|
var index = json.data.index;
|
|
|
|
if ( index !== undefined ) {
|
|
|
|
var typedArray = new TYPED_ARRAYS[ index.type ]( index.array );
|
|
geometry.setIndex( new BufferAttribute( typedArray, 1 ) );
|
|
|
|
}
|
|
|
|
var attributes = json.data.attributes;
|
|
|
|
for ( var key in attributes ) {
|
|
|
|
var attribute = attributes[ key ];
|
|
var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );
|
|
|
|
geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );
|
|
|
|
}
|
|
|
|
var groups = json.data.groups || json.data.drawcalls || json.data.offsets;
|
|
|
|
if ( groups !== undefined ) {
|
|
|
|
for ( var i = 0, n = groups.length; i !== n; ++ i ) {
|
|
|
|
var group = groups[ i ];
|
|
|
|
geometry.addGroup( group.start, group.count, group.materialIndex );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var boundingSphere = json.data.boundingSphere;
|
|
|
|
if ( boundingSphere !== undefined ) {
|
|
|
|
var center = new Vector3();
|
|
|
|
if ( boundingSphere.center !== undefined ) {
|
|
|
|
center.fromArray( boundingSphere.center );
|
|
|
|
}
|
|
|
|
geometry.boundingSphere = new Sphere( center, boundingSphere.radius );
|
|
|
|
}
|
|
|
|
return geometry;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
var TYPED_ARRAYS = {
|
|
Int8Array: Int8Array,
|
|
Uint8Array: Uint8Array,
|
|
Uint8ClampedArray: Uint8ClampedArray,
|
|
Int16Array: Int16Array,
|
|
Uint16Array: Uint16Array,
|
|
Int32Array: Int32Array,
|
|
Uint32Array: Uint32Array,
|
|
Float32Array: Float32Array,
|
|
Float64Array: Float64Array
|
|
};
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Loader() {
|
|
|
|
this.onLoadStart = function () {};
|
|
this.onLoadProgress = function () {};
|
|
this.onLoadComplete = function () {};
|
|
|
|
}
|
|
|
|
Loader.Handlers = {
|
|
|
|
handlers: [],
|
|
|
|
add: function ( regex, loader ) {
|
|
|
|
this.handlers.push( regex, loader );
|
|
|
|
},
|
|
|
|
get: function ( file ) {
|
|
|
|
var handlers = this.handlers;
|
|
|
|
for ( var i = 0, l = handlers.length; i < l; i += 2 ) {
|
|
|
|
var regex = handlers[ i ];
|
|
var loader = handlers[ i + 1 ];
|
|
|
|
if ( regex.test( file ) ) {
|
|
|
|
return loader;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Object.assign( Loader.prototype, {
|
|
|
|
crossOrigin: undefined,
|
|
|
|
extractUrlBase: function ( url ) {
|
|
|
|
var parts = url.split( '/' );
|
|
|
|
if ( parts.length === 1 ) return './';
|
|
|
|
parts.pop();
|
|
|
|
return parts.join( '/' ) + '/';
|
|
|
|
},
|
|
|
|
initMaterials: function ( materials, texturePath, crossOrigin ) {
|
|
|
|
var array = [];
|
|
|
|
for ( var i = 0; i < materials.length; ++ i ) {
|
|
|
|
array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );
|
|
|
|
}
|
|
|
|
return array;
|
|
|
|
},
|
|
|
|
createMaterial: ( function () {
|
|
|
|
var BlendingMode = {
|
|
NoBlending: NoBlending,
|
|
NormalBlending: NormalBlending,
|
|
AdditiveBlending: AdditiveBlending,
|
|
SubtractiveBlending: SubtractiveBlending,
|
|
MultiplyBlending: MultiplyBlending,
|
|
CustomBlending: CustomBlending
|
|
};
|
|
|
|
var color = new Color();
|
|
var textureLoader = new TextureLoader();
|
|
var materialLoader = new MaterialLoader();
|
|
|
|
return function createMaterial( m, texturePath, crossOrigin ) {
|
|
|
|
// convert from old material format
|
|
|
|
var textures = {};
|
|
|
|
function loadTexture( path, repeat, offset, wrap, anisotropy ) {
|
|
|
|
var fullPath = texturePath + path;
|
|
var loader = Loader.Handlers.get( fullPath );
|
|
|
|
var texture;
|
|
|
|
if ( loader !== null ) {
|
|
|
|
texture = loader.load( fullPath );
|
|
|
|
} else {
|
|
|
|
textureLoader.setCrossOrigin( crossOrigin );
|
|
texture = textureLoader.load( fullPath );
|
|
|
|
}
|
|
|
|
if ( repeat !== undefined ) {
|
|
|
|
texture.repeat.fromArray( repeat );
|
|
|
|
if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;
|
|
if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;
|
|
|
|
}
|
|
|
|
if ( offset !== undefined ) {
|
|
|
|
texture.offset.fromArray( offset );
|
|
|
|
}
|
|
|
|
if ( wrap !== undefined ) {
|
|
|
|
if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;
|
|
if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;
|
|
|
|
if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;
|
|
if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;
|
|
|
|
}
|
|
|
|
if ( anisotropy !== undefined ) {
|
|
|
|
texture.anisotropy = anisotropy;
|
|
|
|
}
|
|
|
|
var uuid = _Math.generateUUID();
|
|
|
|
textures[ uuid ] = texture;
|
|
|
|
return uuid;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var json = {
|
|
uuid: _Math.generateUUID(),
|
|
type: 'MeshLambertMaterial'
|
|
};
|
|
|
|
for ( var name in m ) {
|
|
|
|
var value = m[ name ];
|
|
|
|
switch ( name ) {
|
|
|
|
case 'DbgColor':
|
|
case 'DbgIndex':
|
|
case 'opticalDensity':
|
|
case 'illumination':
|
|
break;
|
|
case 'DbgName':
|
|
json.name = value;
|
|
break;
|
|
case 'blending':
|
|
json.blending = BlendingMode[ value ];
|
|
break;
|
|
case 'colorAmbient':
|
|
case 'mapAmbient':
|
|
console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );
|
|
break;
|
|
case 'colorDiffuse':
|
|
json.color = color.fromArray( value ).getHex();
|
|
break;
|
|
case 'colorSpecular':
|
|
json.specular = color.fromArray( value ).getHex();
|
|
break;
|
|
case 'colorEmissive':
|
|
json.emissive = color.fromArray( value ).getHex();
|
|
break;
|
|
case 'specularCoef':
|
|
json.shininess = value;
|
|
break;
|
|
case 'shading':
|
|
if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';
|
|
if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';
|
|
if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';
|
|
break;
|
|
case 'mapDiffuse':
|
|
json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
|
|
break;
|
|
case 'mapDiffuseRepeat':
|
|
case 'mapDiffuseOffset':
|
|
case 'mapDiffuseWrap':
|
|
case 'mapDiffuseAnisotropy':
|
|
break;
|
|
case 'mapEmissive':
|
|
json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );
|
|
break;
|
|
case 'mapEmissiveRepeat':
|
|
case 'mapEmissiveOffset':
|
|
case 'mapEmissiveWrap':
|
|
case 'mapEmissiveAnisotropy':
|
|
break;
|
|
case 'mapLight':
|
|
json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
|
|
break;
|
|
case 'mapLightRepeat':
|
|
case 'mapLightOffset':
|
|
case 'mapLightWrap':
|
|
case 'mapLightAnisotropy':
|
|
break;
|
|
case 'mapAO':
|
|
json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
|
|
break;
|
|
case 'mapAORepeat':
|
|
case 'mapAOOffset':
|
|
case 'mapAOWrap':
|
|
case 'mapAOAnisotropy':
|
|
break;
|
|
case 'mapBump':
|
|
json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
|
|
break;
|
|
case 'mapBumpScale':
|
|
json.bumpScale = value;
|
|
break;
|
|
case 'mapBumpRepeat':
|
|
case 'mapBumpOffset':
|
|
case 'mapBumpWrap':
|
|
case 'mapBumpAnisotropy':
|
|
break;
|
|
case 'mapNormal':
|
|
json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
|
|
break;
|
|
case 'mapNormalFactor':
|
|
json.normalScale = [ value, value ];
|
|
break;
|
|
case 'mapNormalRepeat':
|
|
case 'mapNormalOffset':
|
|
case 'mapNormalWrap':
|
|
case 'mapNormalAnisotropy':
|
|
break;
|
|
case 'mapSpecular':
|
|
json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
|
|
break;
|
|
case 'mapSpecularRepeat':
|
|
case 'mapSpecularOffset':
|
|
case 'mapSpecularWrap':
|
|
case 'mapSpecularAnisotropy':
|
|
break;
|
|
case 'mapMetalness':
|
|
json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );
|
|
break;
|
|
case 'mapMetalnessRepeat':
|
|
case 'mapMetalnessOffset':
|
|
case 'mapMetalnessWrap':
|
|
case 'mapMetalnessAnisotropy':
|
|
break;
|
|
case 'mapRoughness':
|
|
json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );
|
|
break;
|
|
case 'mapRoughnessRepeat':
|
|
case 'mapRoughnessOffset':
|
|
case 'mapRoughnessWrap':
|
|
case 'mapRoughnessAnisotropy':
|
|
break;
|
|
case 'mapAlpha':
|
|
json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
|
|
break;
|
|
case 'mapAlphaRepeat':
|
|
case 'mapAlphaOffset':
|
|
case 'mapAlphaWrap':
|
|
case 'mapAlphaAnisotropy':
|
|
break;
|
|
case 'flipSided':
|
|
json.side = BackSide;
|
|
break;
|
|
case 'doubleSided':
|
|
json.side = DoubleSide;
|
|
break;
|
|
case 'transparency':
|
|
console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );
|
|
json.opacity = value;
|
|
break;
|
|
case 'depthTest':
|
|
case 'depthWrite':
|
|
case 'colorWrite':
|
|
case 'opacity':
|
|
case 'reflectivity':
|
|
case 'transparent':
|
|
case 'visible':
|
|
case 'wireframe':
|
|
json[ name ] = value;
|
|
break;
|
|
case 'vertexColors':
|
|
if ( value === true ) json.vertexColors = VertexColors;
|
|
if ( value === 'face' ) json.vertexColors = FaceColors;
|
|
break;
|
|
default:
|
|
console.error( 'THREE.Loader.createMaterial: Unsupported', name, value );
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( json.type === 'MeshBasicMaterial' ) delete json.emissive;
|
|
if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
|
|
|
|
if ( json.opacity < 1 ) json.transparent = true;
|
|
|
|
materialLoader.setTextures( textures );
|
|
|
|
return materialLoader.parse( json );
|
|
|
|
};
|
|
|
|
} )()
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function JSONLoader( manager ) {
|
|
|
|
if ( typeof manager === 'boolean' ) {
|
|
|
|
console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );
|
|
manager = undefined;
|
|
|
|
}
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
this.withCredentials = false;
|
|
|
|
}
|
|
|
|
Object.assign( JSONLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );
|
|
|
|
var loader = new FileLoader( this.manager );
|
|
loader.setResponseType( 'json' );
|
|
loader.setWithCredentials( this.withCredentials );
|
|
loader.load( url, function ( json ) {
|
|
|
|
var metadata = json.metadata;
|
|
|
|
if ( metadata !== undefined ) {
|
|
|
|
var type = metadata.type;
|
|
|
|
if ( type !== undefined ) {
|
|
|
|
if ( type.toLowerCase() === 'object' ) {
|
|
|
|
console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( type.toLowerCase() === 'scene' ) {
|
|
|
|
console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var object = scope.parse( json, texturePath );
|
|
onLoad( object.geometry, object.materials );
|
|
|
|
}, onProgress, onError );
|
|
|
|
},
|
|
|
|
setTexturePath: function ( value ) {
|
|
|
|
this.texturePath = value;
|
|
|
|
},
|
|
|
|
parse: ( function () {
|
|
|
|
function parseModel( json, geometry ) {
|
|
|
|
function isBitSet( value, position ) {
|
|
|
|
return value & ( 1 << position );
|
|
|
|
}
|
|
|
|
var i, j, fi,
|
|
|
|
offset, zLength,
|
|
|
|
colorIndex, normalIndex, uvIndex, materialIndex,
|
|
|
|
type,
|
|
isQuad,
|
|
hasMaterial,
|
|
hasFaceVertexUv,
|
|
hasFaceNormal, hasFaceVertexNormal,
|
|
hasFaceColor, hasFaceVertexColor,
|
|
|
|
vertex, face, faceA, faceB, hex, normal,
|
|
|
|
uvLayer, uv, u, v,
|
|
|
|
faces = json.faces,
|
|
vertices = json.vertices,
|
|
normals = json.normals,
|
|
colors = json.colors,
|
|
|
|
scale = json.scale,
|
|
|
|
nUvLayers = 0;
|
|
|
|
|
|
if ( json.uvs !== undefined ) {
|
|
|
|
// disregard empty arrays
|
|
|
|
for ( i = 0; i < json.uvs.length; i ++ ) {
|
|
|
|
if ( json.uvs[ i ].length ) nUvLayers ++;
|
|
|
|
}
|
|
|
|
for ( i = 0; i < nUvLayers; i ++ ) {
|
|
|
|
geometry.faceVertexUvs[ i ] = [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
offset = 0;
|
|
zLength = vertices.length;
|
|
|
|
while ( offset < zLength ) {
|
|
|
|
vertex = new Vector3();
|
|
|
|
vertex.x = vertices[ offset ++ ] * scale;
|
|
vertex.y = vertices[ offset ++ ] * scale;
|
|
vertex.z = vertices[ offset ++ ] * scale;
|
|
|
|
geometry.vertices.push( vertex );
|
|
|
|
}
|
|
|
|
offset = 0;
|
|
zLength = faces.length;
|
|
|
|
while ( offset < zLength ) {
|
|
|
|
type = faces[ offset ++ ];
|
|
|
|
isQuad = isBitSet( type, 0 );
|
|
hasMaterial = isBitSet( type, 1 );
|
|
hasFaceVertexUv = isBitSet( type, 3 );
|
|
hasFaceNormal = isBitSet( type, 4 );
|
|
hasFaceVertexNormal = isBitSet( type, 5 );
|
|
hasFaceColor = isBitSet( type, 6 );
|
|
hasFaceVertexColor = isBitSet( type, 7 );
|
|
|
|
// console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
|
|
|
|
if ( isQuad ) {
|
|
|
|
faceA = new Face3();
|
|
faceA.a = faces[ offset ];
|
|
faceA.b = faces[ offset + 1 ];
|
|
faceA.c = faces[ offset + 3 ];
|
|
|
|
faceB = new Face3();
|
|
faceB.a = faces[ offset + 1 ];
|
|
faceB.b = faces[ offset + 2 ];
|
|
faceB.c = faces[ offset + 3 ];
|
|
|
|
offset += 4;
|
|
|
|
if ( hasMaterial ) {
|
|
|
|
materialIndex = faces[ offset ++ ];
|
|
faceA.materialIndex = materialIndex;
|
|
faceB.materialIndex = materialIndex;
|
|
|
|
}
|
|
|
|
// to get face <=> uv index correspondence
|
|
|
|
fi = geometry.faces.length;
|
|
|
|
if ( hasFaceVertexUv ) {
|
|
|
|
for ( i = 0; i < nUvLayers; i ++ ) {
|
|
|
|
uvLayer = json.uvs[ i ];
|
|
|
|
geometry.faceVertexUvs[ i ][ fi ] = [];
|
|
geometry.faceVertexUvs[ i ][ fi + 1 ] = [];
|
|
|
|
for ( j = 0; j < 4; j ++ ) {
|
|
|
|
uvIndex = faces[ offset ++ ];
|
|
|
|
u = uvLayer[ uvIndex * 2 ];
|
|
v = uvLayer[ uvIndex * 2 + 1 ];
|
|
|
|
uv = new Vector2( u, v );
|
|
|
|
if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );
|
|
if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( hasFaceNormal ) {
|
|
|
|
normalIndex = faces[ offset ++ ] * 3;
|
|
|
|
faceA.normal.set(
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ]
|
|
);
|
|
|
|
faceB.normal.copy( faceA.normal );
|
|
|
|
}
|
|
|
|
if ( hasFaceVertexNormal ) {
|
|
|
|
for ( i = 0; i < 4; i ++ ) {
|
|
|
|
normalIndex = faces[ offset ++ ] * 3;
|
|
|
|
normal = new Vector3(
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ]
|
|
);
|
|
|
|
|
|
if ( i !== 2 ) faceA.vertexNormals.push( normal );
|
|
if ( i !== 0 ) faceB.vertexNormals.push( normal );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if ( hasFaceColor ) {
|
|
|
|
colorIndex = faces[ offset ++ ];
|
|
hex = colors[ colorIndex ];
|
|
|
|
faceA.color.setHex( hex );
|
|
faceB.color.setHex( hex );
|
|
|
|
}
|
|
|
|
|
|
if ( hasFaceVertexColor ) {
|
|
|
|
for ( i = 0; i < 4; i ++ ) {
|
|
|
|
colorIndex = faces[ offset ++ ];
|
|
hex = colors[ colorIndex ];
|
|
|
|
if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );
|
|
if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
geometry.faces.push( faceA );
|
|
geometry.faces.push( faceB );
|
|
|
|
} else {
|
|
|
|
face = new Face3();
|
|
face.a = faces[ offset ++ ];
|
|
face.b = faces[ offset ++ ];
|
|
face.c = faces[ offset ++ ];
|
|
|
|
if ( hasMaterial ) {
|
|
|
|
materialIndex = faces[ offset ++ ];
|
|
face.materialIndex = materialIndex;
|
|
|
|
}
|
|
|
|
// to get face <=> uv index correspondence
|
|
|
|
fi = geometry.faces.length;
|
|
|
|
if ( hasFaceVertexUv ) {
|
|
|
|
for ( i = 0; i < nUvLayers; i ++ ) {
|
|
|
|
uvLayer = json.uvs[ i ];
|
|
|
|
geometry.faceVertexUvs[ i ][ fi ] = [];
|
|
|
|
for ( j = 0; j < 3; j ++ ) {
|
|
|
|
uvIndex = faces[ offset ++ ];
|
|
|
|
u = uvLayer[ uvIndex * 2 ];
|
|
v = uvLayer[ uvIndex * 2 + 1 ];
|
|
|
|
uv = new Vector2( u, v );
|
|
|
|
geometry.faceVertexUvs[ i ][ fi ].push( uv );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( hasFaceNormal ) {
|
|
|
|
normalIndex = faces[ offset ++ ] * 3;
|
|
|
|
face.normal.set(
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ]
|
|
);
|
|
|
|
}
|
|
|
|
if ( hasFaceVertexNormal ) {
|
|
|
|
for ( i = 0; i < 3; i ++ ) {
|
|
|
|
normalIndex = faces[ offset ++ ] * 3;
|
|
|
|
normal = new Vector3(
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ++ ],
|
|
normals[ normalIndex ]
|
|
);
|
|
|
|
face.vertexNormals.push( normal );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if ( hasFaceColor ) {
|
|
|
|
colorIndex = faces[ offset ++ ];
|
|
face.color.setHex( colors[ colorIndex ] );
|
|
|
|
}
|
|
|
|
|
|
if ( hasFaceVertexColor ) {
|
|
|
|
for ( i = 0; i < 3; i ++ ) {
|
|
|
|
colorIndex = faces[ offset ++ ];
|
|
face.vertexColors.push( new Color( colors[ colorIndex ] ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
geometry.faces.push( face );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function parseSkin( json, geometry ) {
|
|
|
|
var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;
|
|
|
|
if ( json.skinWeights ) {
|
|
|
|
for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {
|
|
|
|
var x = json.skinWeights[ i ];
|
|
var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;
|
|
var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;
|
|
var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;
|
|
|
|
geometry.skinWeights.push( new Vector4( x, y, z, w ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( json.skinIndices ) {
|
|
|
|
for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {
|
|
|
|
var a = json.skinIndices[ i ];
|
|
var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;
|
|
var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;
|
|
var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;
|
|
|
|
geometry.skinIndices.push( new Vector4( a, b, c, d ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
geometry.bones = json.bones;
|
|
|
|
if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {
|
|
|
|
console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +
|
|
geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function parseMorphing( json, geometry ) {
|
|
|
|
var scale = json.scale;
|
|
|
|
if ( json.morphTargets !== undefined ) {
|
|
|
|
for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {
|
|
|
|
geometry.morphTargets[ i ] = {};
|
|
geometry.morphTargets[ i ].name = json.morphTargets[ i ].name;
|
|
geometry.morphTargets[ i ].vertices = [];
|
|
|
|
var dstVertices = geometry.morphTargets[ i ].vertices;
|
|
var srcVertices = json.morphTargets[ i ].vertices;
|
|
|
|
for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {
|
|
|
|
var vertex = new Vector3();
|
|
vertex.x = srcVertices[ v ] * scale;
|
|
vertex.y = srcVertices[ v + 1 ] * scale;
|
|
vertex.z = srcVertices[ v + 2 ] * scale;
|
|
|
|
dstVertices.push( vertex );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( json.morphColors !== undefined && json.morphColors.length > 0 ) {
|
|
|
|
console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' );
|
|
|
|
var faces = geometry.faces;
|
|
var morphColors = json.morphColors[ 0 ].colors;
|
|
|
|
for ( var i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
|
faces[ i ].color.fromArray( morphColors, i * 3 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function parseAnimations( json, geometry ) {
|
|
|
|
var outputAnimations = [];
|
|
|
|
// parse old style Bone/Hierarchy animations
|
|
var animations = [];
|
|
|
|
if ( json.animation !== undefined ) {
|
|
|
|
animations.push( json.animation );
|
|
|
|
}
|
|
|
|
if ( json.animations !== undefined ) {
|
|
|
|
if ( json.animations.length ) {
|
|
|
|
animations = animations.concat( json.animations );
|
|
|
|
} else {
|
|
|
|
animations.push( json.animations );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( var i = 0; i < animations.length; i ++ ) {
|
|
|
|
var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );
|
|
if ( clip ) outputAnimations.push( clip );
|
|
|
|
}
|
|
|
|
// parse implicit morph animations
|
|
if ( geometry.morphTargets ) {
|
|
|
|
// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.
|
|
var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );
|
|
outputAnimations = outputAnimations.concat( morphAnimationClips );
|
|
|
|
}
|
|
|
|
if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;
|
|
|
|
}
|
|
|
|
return function ( json, texturePath ) {
|
|
|
|
if ( json.data !== undefined ) {
|
|
|
|
// Geometry 4.0 spec
|
|
json = json.data;
|
|
|
|
}
|
|
|
|
if ( json.scale !== undefined ) {
|
|
|
|
json.scale = 1.0 / json.scale;
|
|
|
|
} else {
|
|
|
|
json.scale = 1.0;
|
|
|
|
}
|
|
|
|
var geometry = new Geometry();
|
|
|
|
parseModel( json, geometry );
|
|
parseSkin( json, geometry );
|
|
parseMorphing( json, geometry );
|
|
parseAnimations( json, geometry );
|
|
|
|
geometry.computeFaceNormals();
|
|
geometry.computeBoundingSphere();
|
|
|
|
if ( json.materials === undefined || json.materials.length === 0 ) {
|
|
|
|
return { geometry: geometry };
|
|
|
|
} else {
|
|
|
|
var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );
|
|
|
|
return { geometry: geometry, materials: materials };
|
|
|
|
}
|
|
|
|
};
|
|
|
|
} )()
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function ObjectLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
this.texturePath = '';
|
|
|
|
}
|
|
|
|
Object.assign( ObjectLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
if ( this.texturePath === '' ) {
|
|
|
|
this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );
|
|
|
|
}
|
|
|
|
var scope = this;
|
|
|
|
var loader = new FileLoader( scope.manager );
|
|
loader.load( url, function ( text ) {
|
|
|
|
var json = null;
|
|
|
|
try {
|
|
|
|
json = JSON.parse( text );
|
|
|
|
} catch ( error ) {
|
|
|
|
if ( onError !== undefined ) onError( error );
|
|
|
|
console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var metadata = json.metadata;
|
|
|
|
if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
|
|
|
|
console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' );
|
|
return;
|
|
|
|
}
|
|
|
|
scope.parse( json, onLoad );
|
|
|
|
}, onProgress, onError );
|
|
|
|
},
|
|
|
|
setTexturePath: function ( value ) {
|
|
|
|
this.texturePath = value;
|
|
|
|
},
|
|
|
|
setCrossOrigin: function ( value ) {
|
|
|
|
this.crossOrigin = value;
|
|
|
|
},
|
|
|
|
parse: function ( json, onLoad ) {
|
|
|
|
var geometries = this.parseGeometries( json.geometries );
|
|
|
|
var images = this.parseImages( json.images, function () {
|
|
|
|
if ( onLoad !== undefined ) onLoad( object );
|
|
|
|
} );
|
|
|
|
var textures = this.parseTextures( json.textures, images );
|
|
var materials = this.parseMaterials( json.materials, textures );
|
|
|
|
var object = this.parseObject( json.object, geometries, materials );
|
|
|
|
if ( json.animations ) {
|
|
|
|
object.animations = this.parseAnimations( json.animations );
|
|
|
|
}
|
|
|
|
if ( json.images === undefined || json.images.length === 0 ) {
|
|
|
|
if ( onLoad !== undefined ) onLoad( object );
|
|
|
|
}
|
|
|
|
return object;
|
|
|
|
},
|
|
|
|
parseGeometries: function ( json ) {
|
|
|
|
var geometries = {};
|
|
|
|
if ( json !== undefined ) {
|
|
|
|
var geometryLoader = new JSONLoader();
|
|
var bufferGeometryLoader = new BufferGeometryLoader();
|
|
|
|
for ( var i = 0, l = json.length; i < l; i ++ ) {
|
|
|
|
var geometry;
|
|
var data = json[ i ];
|
|
|
|
switch ( data.type ) {
|
|
|
|
case 'PlaneGeometry':
|
|
case 'PlaneBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.width,
|
|
data.height,
|
|
data.widthSegments,
|
|
data.heightSegments
|
|
);
|
|
|
|
break;
|
|
|
|
case 'BoxGeometry':
|
|
case 'BoxBufferGeometry':
|
|
case 'CubeGeometry': // backwards compatible
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.width,
|
|
data.height,
|
|
data.depth,
|
|
data.widthSegments,
|
|
data.heightSegments,
|
|
data.depthSegments
|
|
);
|
|
|
|
break;
|
|
|
|
case 'CircleGeometry':
|
|
case 'CircleBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radius,
|
|
data.segments,
|
|
data.thetaStart,
|
|
data.thetaLength
|
|
);
|
|
|
|
break;
|
|
|
|
case 'CylinderGeometry':
|
|
case 'CylinderBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radiusTop,
|
|
data.radiusBottom,
|
|
data.height,
|
|
data.radialSegments,
|
|
data.heightSegments,
|
|
data.openEnded,
|
|
data.thetaStart,
|
|
data.thetaLength
|
|
);
|
|
|
|
break;
|
|
|
|
case 'ConeGeometry':
|
|
case 'ConeBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radius,
|
|
data.height,
|
|
data.radialSegments,
|
|
data.heightSegments,
|
|
data.openEnded,
|
|
data.thetaStart,
|
|
data.thetaLength
|
|
);
|
|
|
|
break;
|
|
|
|
case 'SphereGeometry':
|
|
case 'SphereBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radius,
|
|
data.widthSegments,
|
|
data.heightSegments,
|
|
data.phiStart,
|
|
data.phiLength,
|
|
data.thetaStart,
|
|
data.thetaLength
|
|
);
|
|
|
|
break;
|
|
|
|
case 'DodecahedronGeometry':
|
|
case 'IcosahedronGeometry':
|
|
case 'OctahedronGeometry':
|
|
case 'TetrahedronGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radius,
|
|
data.detail
|
|
);
|
|
|
|
break;
|
|
|
|
case 'RingGeometry':
|
|
case 'RingBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.innerRadius,
|
|
data.outerRadius,
|
|
data.thetaSegments,
|
|
data.phiSegments,
|
|
data.thetaStart,
|
|
data.thetaLength
|
|
);
|
|
|
|
break;
|
|
|
|
case 'TorusGeometry':
|
|
case 'TorusBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radius,
|
|
data.tube,
|
|
data.radialSegments,
|
|
data.tubularSegments,
|
|
data.arc
|
|
);
|
|
|
|
break;
|
|
|
|
case 'TorusKnotGeometry':
|
|
case 'TorusKnotBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.radius,
|
|
data.tube,
|
|
data.tubularSegments,
|
|
data.radialSegments,
|
|
data.p,
|
|
data.q
|
|
);
|
|
|
|
break;
|
|
|
|
case 'LatheGeometry':
|
|
case 'LatheBufferGeometry':
|
|
|
|
geometry = new Geometries[ data.type ](
|
|
data.points,
|
|
data.segments,
|
|
data.phiStart,
|
|
data.phiLength
|
|
);
|
|
|
|
break;
|
|
|
|
case 'BufferGeometry':
|
|
|
|
geometry = bufferGeometryLoader.parse( data );
|
|
|
|
break;
|
|
|
|
case 'Geometry':
|
|
|
|
geometry = geometryLoader.parse( data, this.texturePath ).geometry;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' );
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
geometry.uuid = data.uuid;
|
|
|
|
if ( data.name !== undefined ) geometry.name = data.name;
|
|
|
|
geometries[ data.uuid ] = geometry;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return geometries;
|
|
|
|
},
|
|
|
|
parseMaterials: function ( json, textures ) {
|
|
|
|
var materials = {};
|
|
|
|
if ( json !== undefined ) {
|
|
|
|
var loader = new MaterialLoader();
|
|
loader.setTextures( textures );
|
|
|
|
for ( var i = 0, l = json.length; i < l; i ++ ) {
|
|
|
|
var data = json[ i ];
|
|
|
|
if ( data.type === 'MultiMaterial' ) {
|
|
|
|
// Deprecated
|
|
|
|
var array = [];
|
|
|
|
for ( var j = 0; j < data.materials.length; j ++ ) {
|
|
|
|
array.push( loader.parse( data.materials[ j ] ) );
|
|
|
|
}
|
|
|
|
materials[ data.uuid ] = array;
|
|
|
|
} else {
|
|
|
|
materials[ data.uuid ] = loader.parse( data );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return materials;
|
|
|
|
},
|
|
|
|
parseAnimations: function ( json ) {
|
|
|
|
var animations = [];
|
|
|
|
for ( var i = 0; i < json.length; i ++ ) {
|
|
|
|
var clip = AnimationClip.parse( json[ i ] );
|
|
|
|
animations.push( clip );
|
|
|
|
}
|
|
|
|
return animations;
|
|
|
|
},
|
|
|
|
parseImages: function ( json, onLoad ) {
|
|
|
|
var scope = this;
|
|
var images = {};
|
|
|
|
function loadImage( url ) {
|
|
|
|
scope.manager.itemStart( url );
|
|
|
|
return loader.load( url, function () {
|
|
|
|
scope.manager.itemEnd( url );
|
|
|
|
}, undefined, function () {
|
|
|
|
scope.manager.itemEnd( url );
|
|
scope.manager.itemError( url );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
if ( json !== undefined && json.length > 0 ) {
|
|
|
|
var manager = new LoadingManager( onLoad );
|
|
|
|
var loader = new ImageLoader( manager );
|
|
loader.setCrossOrigin( this.crossOrigin );
|
|
|
|
for ( var i = 0, l = json.length; i < l; i ++ ) {
|
|
|
|
var image = json[ i ];
|
|
var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;
|
|
|
|
images[ image.uuid ] = loadImage( path );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return images;
|
|
|
|
},
|
|
|
|
parseTextures: function ( json, images ) {
|
|
|
|
function parseConstant( value, type ) {
|
|
|
|
if ( typeof( value ) === 'number' ) return value;
|
|
|
|
console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );
|
|
|
|
return type[ value ];
|
|
|
|
}
|
|
|
|
var textures = {};
|
|
|
|
if ( json !== undefined ) {
|
|
|
|
for ( var i = 0, l = json.length; i < l; i ++ ) {
|
|
|
|
var data = json[ i ];
|
|
|
|
if ( data.image === undefined ) {
|
|
|
|
console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid );
|
|
|
|
}
|
|
|
|
if ( images[ data.image ] === undefined ) {
|
|
|
|
console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
|
|
|
|
}
|
|
|
|
var texture = new Texture( images[ data.image ] );
|
|
texture.needsUpdate = true;
|
|
|
|
texture.uuid = data.uuid;
|
|
|
|
if ( data.name !== undefined ) texture.name = data.name;
|
|
|
|
if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
|
|
|
|
if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
|
|
if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );
|
|
if ( data.wrap !== undefined ) {
|
|
|
|
texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );
|
|
texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );
|
|
|
|
}
|
|
|
|
if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );
|
|
if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );
|
|
if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
|
|
|
|
if ( data.flipY !== undefined ) texture.flipY = data.flipY;
|
|
|
|
textures[ data.uuid ] = texture;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return textures;
|
|
|
|
},
|
|
|
|
parseObject: function () {
|
|
|
|
var matrix = new Matrix4();
|
|
|
|
return function parseObject( data, geometries, materials ) {
|
|
|
|
var object;
|
|
|
|
function getGeometry( name ) {
|
|
|
|
if ( geometries[ name ] === undefined ) {
|
|
|
|
console.warn( 'THREE.ObjectLoader: Undefined geometry', name );
|
|
|
|
}
|
|
|
|
return geometries[ name ];
|
|
|
|
}
|
|
|
|
function getMaterial( name ) {
|
|
|
|
if ( name === undefined ) return undefined;
|
|
|
|
if ( Array.isArray( name ) ) {
|
|
|
|
var array = [];
|
|
|
|
for ( var i = 0, l = name.length; i < l; i ++ ) {
|
|
|
|
var uuid = name[ i ];
|
|
|
|
if ( materials[ uuid ] === undefined ) {
|
|
|
|
console.warn( 'THREE.ObjectLoader: Undefined material', uuid );
|
|
|
|
}
|
|
|
|
array.push( materials[ uuid ] );
|
|
|
|
}
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
if ( materials[ name ] === undefined ) {
|
|
|
|
console.warn( 'THREE.ObjectLoader: Undefined material', name );
|
|
|
|
}
|
|
|
|
return materials[ name ];
|
|
|
|
}
|
|
|
|
switch ( data.type ) {
|
|
|
|
case 'Scene':
|
|
|
|
object = new Scene();
|
|
|
|
if ( data.background !== undefined ) {
|
|
|
|
if ( Number.isInteger( data.background ) ) {
|
|
|
|
object.background = new Color( data.background );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( data.fog !== undefined ) {
|
|
|
|
if ( data.fog.type === 'Fog' ) {
|
|
|
|
object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );
|
|
|
|
} else if ( data.fog.type === 'FogExp2' ) {
|
|
|
|
object.fog = new FogExp2( data.fog.color, data.fog.density );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'PerspectiveCamera':
|
|
|
|
object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
|
|
|
|
if ( data.focus !== undefined ) object.focus = data.focus;
|
|
if ( data.zoom !== undefined ) object.zoom = data.zoom;
|
|
if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;
|
|
if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;
|
|
if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
|
|
|
|
break;
|
|
|
|
case 'OrthographicCamera':
|
|
|
|
object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
|
|
|
|
break;
|
|
|
|
case 'AmbientLight':
|
|
|
|
object = new AmbientLight( data.color, data.intensity );
|
|
|
|
break;
|
|
|
|
case 'DirectionalLight':
|
|
|
|
object = new DirectionalLight( data.color, data.intensity );
|
|
|
|
break;
|
|
|
|
case 'PointLight':
|
|
|
|
object = new PointLight( data.color, data.intensity, data.distance, data.decay );
|
|
|
|
break;
|
|
|
|
case 'RectAreaLight':
|
|
|
|
object = new RectAreaLight( data.color, data.intensity, data.width, data.height );
|
|
|
|
break;
|
|
|
|
case 'SpotLight':
|
|
|
|
object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
|
|
|
|
break;
|
|
|
|
case 'HemisphereLight':
|
|
|
|
object = new HemisphereLight( data.color, data.groundColor, data.intensity );
|
|
|
|
break;
|
|
|
|
case 'SkinnedMesh':
|
|
|
|
console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );
|
|
|
|
case 'Mesh':
|
|
|
|
var geometry = getGeometry( data.geometry );
|
|
var material = getMaterial( data.material );
|
|
|
|
if ( geometry.bones && geometry.bones.length > 0 ) {
|
|
|
|
object = new SkinnedMesh( geometry, material );
|
|
|
|
} else {
|
|
|
|
object = new Mesh( geometry, material );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'LOD':
|
|
|
|
object = new LOD();
|
|
|
|
break;
|
|
|
|
case 'Line':
|
|
|
|
object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );
|
|
|
|
break;
|
|
|
|
case 'LineLoop':
|
|
|
|
object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );
|
|
|
|
break;
|
|
|
|
case 'LineSegments':
|
|
|
|
object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );
|
|
|
|
break;
|
|
|
|
case 'PointCloud':
|
|
case 'Points':
|
|
|
|
object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );
|
|
|
|
break;
|
|
|
|
case 'Sprite':
|
|
|
|
object = new Sprite( getMaterial( data.material ) );
|
|
|
|
break;
|
|
|
|
case 'Group':
|
|
|
|
object = new Group();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
object = new Object3D();
|
|
|
|
}
|
|
|
|
object.uuid = data.uuid;
|
|
|
|
if ( data.name !== undefined ) object.name = data.name;
|
|
if ( data.matrix !== undefined ) {
|
|
|
|
matrix.fromArray( data.matrix );
|
|
matrix.decompose( object.position, object.quaternion, object.scale );
|
|
|
|
} else {
|
|
|
|
if ( data.position !== undefined ) object.position.fromArray( data.position );
|
|
if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
|
|
if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );
|
|
if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
|
|
|
|
}
|
|
|
|
if ( data.castShadow !== undefined ) object.castShadow = data.castShadow;
|
|
if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;
|
|
|
|
if ( data.shadow ) {
|
|
|
|
if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;
|
|
if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;
|
|
if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );
|
|
if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );
|
|
|
|
}
|
|
|
|
if ( data.visible !== undefined ) object.visible = data.visible;
|
|
if ( data.userData !== undefined ) object.userData = data.userData;
|
|
|
|
if ( data.children !== undefined ) {
|
|
|
|
for ( var child in data.children ) {
|
|
|
|
object.add( this.parseObject( data.children[ child ], geometries, materials ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( data.type === 'LOD' ) {
|
|
|
|
var levels = data.levels;
|
|
|
|
for ( var l = 0; l < levels.length; l ++ ) {
|
|
|
|
var level = levels[ l ];
|
|
var child = object.getObjectByProperty( 'uuid', level.object );
|
|
|
|
if ( child !== undefined ) {
|
|
|
|
object.addLevel( child, level.distance );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return object;
|
|
|
|
};
|
|
|
|
}()
|
|
|
|
} );
|
|
|
|
var TEXTURE_MAPPING = {
|
|
UVMapping: UVMapping,
|
|
CubeReflectionMapping: CubeReflectionMapping,
|
|
CubeRefractionMapping: CubeRefractionMapping,
|
|
EquirectangularReflectionMapping: EquirectangularReflectionMapping,
|
|
EquirectangularRefractionMapping: EquirectangularRefractionMapping,
|
|
SphericalReflectionMapping: SphericalReflectionMapping,
|
|
CubeUVReflectionMapping: CubeUVReflectionMapping,
|
|
CubeUVRefractionMapping: CubeUVRefractionMapping
|
|
};
|
|
|
|
var TEXTURE_WRAPPING = {
|
|
RepeatWrapping: RepeatWrapping,
|
|
ClampToEdgeWrapping: ClampToEdgeWrapping,
|
|
MirroredRepeatWrapping: MirroredRepeatWrapping
|
|
};
|
|
|
|
var TEXTURE_FILTER = {
|
|
NearestFilter: NearestFilter,
|
|
NearestMipMapNearestFilter: NearestMipMapNearestFilter,
|
|
NearestMipMapLinearFilter: NearestMipMapLinearFilter,
|
|
LinearFilter: LinearFilter,
|
|
LinearMipMapNearestFilter: LinearMipMapNearestFilter,
|
|
LinearMipMapLinearFilter: LinearMipMapLinearFilter
|
|
};
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
*
|
|
* Bezier Curves formulas obtained from
|
|
* http://en.wikipedia.org/wiki/Bézier_curve
|
|
*/
|
|
|
|
function CatmullRom( t, p0, p1, p2, p3 ) {
|
|
|
|
var v0 = ( p2 - p0 ) * 0.5;
|
|
var v1 = ( p3 - p1 ) * 0.5;
|
|
var t2 = t * t;
|
|
var t3 = t * t2;
|
|
return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function QuadraticBezierP0( t, p ) {
|
|
|
|
var k = 1 - t;
|
|
return k * k * p;
|
|
|
|
}
|
|
|
|
function QuadraticBezierP1( t, p ) {
|
|
|
|
return 2 * ( 1 - t ) * t * p;
|
|
|
|
}
|
|
|
|
function QuadraticBezierP2( t, p ) {
|
|
|
|
return t * t * p;
|
|
|
|
}
|
|
|
|
function QuadraticBezier( t, p0, p1, p2 ) {
|
|
|
|
return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +
|
|
QuadraticBezierP2( t, p2 );
|
|
|
|
}
|
|
|
|
//
|
|
|
|
function CubicBezierP0( t, p ) {
|
|
|
|
var k = 1 - t;
|
|
return k * k * k * p;
|
|
|
|
}
|
|
|
|
function CubicBezierP1( t, p ) {
|
|
|
|
var k = 1 - t;
|
|
return 3 * k * k * t * p;
|
|
|
|
}
|
|
|
|
function CubicBezierP2( t, p ) {
|
|
|
|
return 3 * ( 1 - t ) * t * t * p;
|
|
|
|
}
|
|
|
|
function CubicBezierP3( t, p ) {
|
|
|
|
return t * t * t * p;
|
|
|
|
}
|
|
|
|
function CubicBezier( t, p0, p1, p2, p3 ) {
|
|
|
|
return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +
|
|
CubicBezierP3( t, p3 );
|
|
|
|
}
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* Extensible curve object
|
|
*
|
|
* Some common of curve methods:
|
|
* .getPoint(t), getTangent(t)
|
|
* .getPointAt(u), getTangentAt(u)
|
|
* .getPoints(), .getSpacedPoints()
|
|
* .getLength()
|
|
* .updateArcLengths()
|
|
*
|
|
* This following curves inherit from THREE.Curve:
|
|
*
|
|
* -- 2D curves --
|
|
* THREE.ArcCurve
|
|
* THREE.CubicBezierCurve
|
|
* THREE.EllipseCurve
|
|
* THREE.LineCurve
|
|
* THREE.QuadraticBezierCurve
|
|
* THREE.SplineCurve
|
|
*
|
|
* -- 3D curves --
|
|
* THREE.CatmullRomCurve3
|
|
* THREE.CubicBezierCurve3
|
|
* THREE.LineCurve3
|
|
* THREE.QuadraticBezierCurve3
|
|
*
|
|
* A series of curves can be represented as a THREE.CurvePath.
|
|
*
|
|
**/
|
|
|
|
/**************************************************************
|
|
* Abstract Curve base class
|
|
**************************************************************/
|
|
|
|
function Curve() {
|
|
|
|
this.arcLengthDivisions = 200;
|
|
|
|
}
|
|
|
|
Object.assign( Curve.prototype, {
|
|
|
|
// Virtual base class method to overwrite and implement in subclasses
|
|
// - t [0 .. 1]
|
|
|
|
getPoint: function () {
|
|
|
|
console.warn( 'THREE.Curve: .getPoint() not implemented.' );
|
|
return null;
|
|
|
|
},
|
|
|
|
// Get point at relative position in curve according to arc length
|
|
// - u [0 .. 1]
|
|
|
|
getPointAt: function ( u ) {
|
|
|
|
var t = this.getUtoTmapping( u );
|
|
return this.getPoint( t );
|
|
|
|
},
|
|
|
|
// Get sequence of points using getPoint( t )
|
|
|
|
getPoints: function ( divisions ) {
|
|
|
|
if ( divisions === undefined ) divisions = 5;
|
|
|
|
var points = [];
|
|
|
|
for ( var d = 0; d <= divisions; d ++ ) {
|
|
|
|
points.push( this.getPoint( d / divisions ) );
|
|
|
|
}
|
|
|
|
return points;
|
|
|
|
},
|
|
|
|
// Get sequence of points using getPointAt( u )
|
|
|
|
getSpacedPoints: function ( divisions ) {
|
|
|
|
if ( divisions === undefined ) divisions = 5;
|
|
|
|
var points = [];
|
|
|
|
for ( var d = 0; d <= divisions; d ++ ) {
|
|
|
|
points.push( this.getPointAt( d / divisions ) );
|
|
|
|
}
|
|
|
|
return points;
|
|
|
|
},
|
|
|
|
// Get total curve arc length
|
|
|
|
getLength: function () {
|
|
|
|
var lengths = this.getLengths();
|
|
return lengths[ lengths.length - 1 ];
|
|
|
|
},
|
|
|
|
// Get list of cumulative segment lengths
|
|
|
|
getLengths: function ( divisions ) {
|
|
|
|
if ( divisions === undefined ) divisions = this.arcLengthDivisions;
|
|
|
|
if ( this.cacheArcLengths &&
|
|
( this.cacheArcLengths.length === divisions + 1 ) &&
|
|
! this.needsUpdate ) {
|
|
|
|
return this.cacheArcLengths;
|
|
|
|
}
|
|
|
|
this.needsUpdate = false;
|
|
|
|
var cache = [];
|
|
var current, last = this.getPoint( 0 );
|
|
var p, sum = 0;
|
|
|
|
cache.push( 0 );
|
|
|
|
for ( p = 1; p <= divisions; p ++ ) {
|
|
|
|
current = this.getPoint( p / divisions );
|
|
sum += current.distanceTo( last );
|
|
cache.push( sum );
|
|
last = current;
|
|
|
|
}
|
|
|
|
this.cacheArcLengths = cache;
|
|
|
|
return cache; // { sums: cache, sum: sum }; Sum is in the last element.
|
|
|
|
},
|
|
|
|
updateArcLengths: function () {
|
|
|
|
this.needsUpdate = true;
|
|
this.getLengths();
|
|
|
|
},
|
|
|
|
// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant
|
|
|
|
getUtoTmapping: function ( u, distance ) {
|
|
|
|
var arcLengths = this.getLengths();
|
|
|
|
var i = 0, il = arcLengths.length;
|
|
|
|
var targetArcLength; // The targeted u distance value to get
|
|
|
|
if ( distance ) {
|
|
|
|
targetArcLength = distance;
|
|
|
|
} else {
|
|
|
|
targetArcLength = u * arcLengths[ il - 1 ];
|
|
|
|
}
|
|
|
|
// binary search for the index with largest value smaller than target u distance
|
|
|
|
var low = 0, high = il - 1, comparison;
|
|
|
|
while ( low <= high ) {
|
|
|
|
i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
|
|
|
|
comparison = arcLengths[ i ] - targetArcLength;
|
|
|
|
if ( comparison < 0 ) {
|
|
|
|
low = i + 1;
|
|
|
|
} else if ( comparison > 0 ) {
|
|
|
|
high = i - 1;
|
|
|
|
} else {
|
|
|
|
high = i;
|
|
break;
|
|
|
|
// DONE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
i = high;
|
|
|
|
if ( arcLengths[ i ] === targetArcLength ) {
|
|
|
|
return i / ( il - 1 );
|
|
|
|
}
|
|
|
|
// we could get finer grain at lengths, or use simple interpolation between two points
|
|
|
|
var lengthBefore = arcLengths[ i ];
|
|
var lengthAfter = arcLengths[ i + 1 ];
|
|
|
|
var segmentLength = lengthAfter - lengthBefore;
|
|
|
|
// determine where we are between the 'before' and 'after' points
|
|
|
|
var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;
|
|
|
|
// add that fractional amount to t
|
|
|
|
var t = ( i + segmentFraction ) / ( il - 1 );
|
|
|
|
return t;
|
|
|
|
},
|
|
|
|
// Returns a unit vector tangent at t
|
|
// In case any sub curve does not implement its tangent derivation,
|
|
// 2 points a small delta apart will be used to find its gradient
|
|
// which seems to give a reasonable approximation
|
|
|
|
getTangent: function ( t ) {
|
|
|
|
var delta = 0.0001;
|
|
var t1 = t - delta;
|
|
var t2 = t + delta;
|
|
|
|
// Capping in case of danger
|
|
|
|
if ( t1 < 0 ) t1 = 0;
|
|
if ( t2 > 1 ) t2 = 1;
|
|
|
|
var pt1 = this.getPoint( t1 );
|
|
var pt2 = this.getPoint( t2 );
|
|
|
|
var vec = pt2.clone().sub( pt1 );
|
|
return vec.normalize();
|
|
|
|
},
|
|
|
|
getTangentAt: function ( u ) {
|
|
|
|
var t = this.getUtoTmapping( u );
|
|
return this.getTangent( t );
|
|
|
|
},
|
|
|
|
computeFrenetFrames: function ( segments, closed ) {
|
|
|
|
// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf
|
|
|
|
var normal = new Vector3();
|
|
|
|
var tangents = [];
|
|
var normals = [];
|
|
var binormals = [];
|
|
|
|
var vec = new Vector3();
|
|
var mat = new Matrix4();
|
|
|
|
var i, u, theta;
|
|
|
|
// compute the tangent vectors for each segment on the curve
|
|
|
|
for ( i = 0; i <= segments; i ++ ) {
|
|
|
|
u = i / segments;
|
|
|
|
tangents[ i ] = this.getTangentAt( u );
|
|
tangents[ i ].normalize();
|
|
|
|
}
|
|
|
|
// select an initial normal vector perpendicular to the first tangent vector,
|
|
// and in the direction of the minimum tangent xyz component
|
|
|
|
normals[ 0 ] = new Vector3();
|
|
binormals[ 0 ] = new Vector3();
|
|
var min = Number.MAX_VALUE;
|
|
var tx = Math.abs( tangents[ 0 ].x );
|
|
var ty = Math.abs( tangents[ 0 ].y );
|
|
var tz = Math.abs( tangents[ 0 ].z );
|
|
|
|
if ( tx <= min ) {
|
|
|
|
min = tx;
|
|
normal.set( 1, 0, 0 );
|
|
|
|
}
|
|
|
|
if ( ty <= min ) {
|
|
|
|
min = ty;
|
|
normal.set( 0, 1, 0 );
|
|
|
|
}
|
|
|
|
if ( tz <= min ) {
|
|
|
|
normal.set( 0, 0, 1 );
|
|
|
|
}
|
|
|
|
vec.crossVectors( tangents[ 0 ], normal ).normalize();
|
|
|
|
normals[ 0 ].crossVectors( tangents[ 0 ], vec );
|
|
binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );
|
|
|
|
|
|
// compute the slowly-varying normal and binormal vectors for each segment on the curve
|
|
|
|
for ( i = 1; i <= segments; i ++ ) {
|
|
|
|
normals[ i ] = normals[ i - 1 ].clone();
|
|
|
|
binormals[ i ] = binormals[ i - 1 ].clone();
|
|
|
|
vec.crossVectors( tangents[ i - 1 ], tangents[ i ] );
|
|
|
|
if ( vec.length() > Number.EPSILON ) {
|
|
|
|
vec.normalize();
|
|
|
|
theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors
|
|
|
|
normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );
|
|
|
|
}
|
|
|
|
binormals[ i ].crossVectors( tangents[ i ], normals[ i ] );
|
|
|
|
}
|
|
|
|
// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same
|
|
|
|
if ( closed === true ) {
|
|
|
|
theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );
|
|
theta /= segments;
|
|
|
|
if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {
|
|
|
|
theta = - theta;
|
|
|
|
}
|
|
|
|
for ( i = 1; i <= segments; i ++ ) {
|
|
|
|
// twist a little...
|
|
normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );
|
|
binormals[ i ].crossVectors( tangents[ i ], normals[ i ] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
tangents: tangents,
|
|
normals: normals,
|
|
binormals: binormals
|
|
};
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
function LineCurve( v1, v2 ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.v1 = v1;
|
|
this.v2 = v2;
|
|
|
|
}
|
|
|
|
LineCurve.prototype = Object.create( Curve.prototype );
|
|
LineCurve.prototype.constructor = LineCurve;
|
|
|
|
LineCurve.prototype.isLineCurve = true;
|
|
|
|
LineCurve.prototype.getPoint = function ( t ) {
|
|
|
|
if ( t === 1 ) {
|
|
|
|
return this.v2.clone();
|
|
|
|
}
|
|
|
|
var point = this.v2.clone().sub( this.v1 );
|
|
point.multiplyScalar( t ).add( this.v1 );
|
|
|
|
return point;
|
|
|
|
};
|
|
|
|
// Line curve is linear, so we can overwrite default getPointAt
|
|
|
|
LineCurve.prototype.getPointAt = function ( u ) {
|
|
|
|
return this.getPoint( u );
|
|
|
|
};
|
|
|
|
LineCurve.prototype.getTangent = function ( t ) {
|
|
|
|
var tangent = this.v2.clone().sub( this.v1 );
|
|
|
|
return tangent.normalize();
|
|
|
|
};
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
*
|
|
**/
|
|
|
|
/**************************************************************
|
|
* Curved Path - a curve path is simply a array of connected
|
|
* curves, but retains the api of a curve
|
|
**************************************************************/
|
|
|
|
function CurvePath() {
|
|
|
|
Curve.call( this );
|
|
|
|
this.curves = [];
|
|
|
|
this.autoClose = false; // Automatically closes the path
|
|
|
|
}
|
|
|
|
CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {
|
|
|
|
constructor: CurvePath,
|
|
|
|
add: function ( curve ) {
|
|
|
|
this.curves.push( curve );
|
|
|
|
},
|
|
|
|
closePath: function () {
|
|
|
|
// Add a line curve if start and end of lines are not connected
|
|
var startPoint = this.curves[ 0 ].getPoint( 0 );
|
|
var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );
|
|
|
|
if ( ! startPoint.equals( endPoint ) ) {
|
|
|
|
this.curves.push( new LineCurve( endPoint, startPoint ) );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// To get accurate point with reference to
|
|
// entire path distance at time t,
|
|
// following has to be done:
|
|
|
|
// 1. Length of each sub path have to be known
|
|
// 2. Locate and identify type of curve
|
|
// 3. Get t for the curve
|
|
// 4. Return curve.getPointAt(t')
|
|
|
|
getPoint: function ( t ) {
|
|
|
|
var d = t * this.getLength();
|
|
var curveLengths = this.getCurveLengths();
|
|
var i = 0;
|
|
|
|
// To think about boundaries points.
|
|
|
|
while ( i < curveLengths.length ) {
|
|
|
|
if ( curveLengths[ i ] >= d ) {
|
|
|
|
var diff = curveLengths[ i ] - d;
|
|
var curve = this.curves[ i ];
|
|
|
|
var segmentLength = curve.getLength();
|
|
var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;
|
|
|
|
return curve.getPointAt( u );
|
|
|
|
}
|
|
|
|
i ++;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
// loop where sum != 0, sum > d , sum+1 <d
|
|
|
|
},
|
|
|
|
// We cannot use the default THREE.Curve getPoint() with getLength() because in
|
|
// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
|
|
// getPoint() depends on getLength
|
|
|
|
getLength: function () {
|
|
|
|
var lens = this.getCurveLengths();
|
|
return lens[ lens.length - 1 ];
|
|
|
|
},
|
|
|
|
// cacheLengths must be recalculated.
|
|
updateArcLengths: function () {
|
|
|
|
this.needsUpdate = true;
|
|
this.cacheLengths = null;
|
|
this.getCurveLengths();
|
|
|
|
},
|
|
|
|
// Compute lengths and cache them
|
|
// We cannot overwrite getLengths() because UtoT mapping uses it.
|
|
|
|
getCurveLengths: function () {
|
|
|
|
// We use cache values if curves and cache array are same length
|
|
|
|
if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {
|
|
|
|
return this.cacheLengths;
|
|
|
|
}
|
|
|
|
// Get length of sub-curve
|
|
// Push sums into cached array
|
|
|
|
var lengths = [], sums = 0;
|
|
|
|
for ( var i = 0, l = this.curves.length; i < l; i ++ ) {
|
|
|
|
sums += this.curves[ i ].getLength();
|
|
lengths.push( sums );
|
|
|
|
}
|
|
|
|
this.cacheLengths = lengths;
|
|
|
|
return lengths;
|
|
|
|
},
|
|
|
|
getSpacedPoints: function ( divisions ) {
|
|
|
|
if ( divisions === undefined ) divisions = 40;
|
|
|
|
var points = [];
|
|
|
|
for ( var i = 0; i <= divisions; i ++ ) {
|
|
|
|
points.push( this.getPoint( i / divisions ) );
|
|
|
|
}
|
|
|
|
if ( this.autoClose ) {
|
|
|
|
points.push( points[ 0 ] );
|
|
|
|
}
|
|
|
|
return points;
|
|
|
|
},
|
|
|
|
getPoints: function ( divisions ) {
|
|
|
|
divisions = divisions || 12;
|
|
|
|
var points = [], last;
|
|
|
|
for ( var i = 0, curves = this.curves; i < curves.length; i ++ ) {
|
|
|
|
var curve = curves[ i ];
|
|
var resolution = (curve && curve.isEllipseCurve) ? divisions * 2
|
|
: (curve && curve.isLineCurve) ? 1
|
|
: (curve && curve.isSplineCurve) ? divisions * curve.points.length
|
|
: divisions;
|
|
|
|
var pts = curve.getPoints( resolution );
|
|
|
|
for ( var j = 0; j < pts.length; j++ ) {
|
|
|
|
var point = pts[ j ];
|
|
|
|
if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates
|
|
|
|
points.push( point );
|
|
last = point;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( this.autoClose && points.length > 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {
|
|
|
|
points.push( points[ 0 ] );
|
|
|
|
}
|
|
|
|
return points;
|
|
|
|
},
|
|
|
|
/**************************************************************
|
|
* Create Geometries Helpers
|
|
**************************************************************/
|
|
|
|
/// Generate geometry from path points (for Line or Points objects)
|
|
|
|
createPointsGeometry: function ( divisions ) {
|
|
|
|
var pts = this.getPoints( divisions );
|
|
return this.createGeometry( pts );
|
|
|
|
},
|
|
|
|
// Generate geometry from equidistant sampling along the path
|
|
|
|
createSpacedPointsGeometry: function ( divisions ) {
|
|
|
|
var pts = this.getSpacedPoints( divisions );
|
|
return this.createGeometry( pts );
|
|
|
|
},
|
|
|
|
createGeometry: function ( points ) {
|
|
|
|
var geometry = new Geometry();
|
|
|
|
for ( var i = 0, l = points.length; i < l; i ++ ) {
|
|
|
|
var point = points[ i ];
|
|
geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );
|
|
|
|
}
|
|
|
|
return geometry;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.aX = aX;
|
|
this.aY = aY;
|
|
|
|
this.xRadius = xRadius;
|
|
this.yRadius = yRadius;
|
|
|
|
this.aStartAngle = aStartAngle;
|
|
this.aEndAngle = aEndAngle;
|
|
|
|
this.aClockwise = aClockwise;
|
|
|
|
this.aRotation = aRotation || 0;
|
|
|
|
}
|
|
|
|
EllipseCurve.prototype = Object.create( Curve.prototype );
|
|
EllipseCurve.prototype.constructor = EllipseCurve;
|
|
|
|
EllipseCurve.prototype.isEllipseCurve = true;
|
|
|
|
EllipseCurve.prototype.getPoint = function ( t ) {
|
|
|
|
var twoPi = Math.PI * 2;
|
|
var deltaAngle = this.aEndAngle - this.aStartAngle;
|
|
var samePoints = Math.abs( deltaAngle ) < Number.EPSILON;
|
|
|
|
// ensures that deltaAngle is 0 .. 2 PI
|
|
while ( deltaAngle < 0 ) deltaAngle += twoPi;
|
|
while ( deltaAngle > twoPi ) deltaAngle -= twoPi;
|
|
|
|
if ( deltaAngle < Number.EPSILON ) {
|
|
|
|
if ( samePoints ) {
|
|
|
|
deltaAngle = 0;
|
|
|
|
} else {
|
|
|
|
deltaAngle = twoPi;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( this.aClockwise === true && ! samePoints ) {
|
|
|
|
if ( deltaAngle === twoPi ) {
|
|
|
|
deltaAngle = - twoPi;
|
|
|
|
} else {
|
|
|
|
deltaAngle = deltaAngle - twoPi;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var angle = this.aStartAngle + t * deltaAngle;
|
|
var x = this.aX + this.xRadius * Math.cos( angle );
|
|
var y = this.aY + this.yRadius * Math.sin( angle );
|
|
|
|
if ( this.aRotation !== 0 ) {
|
|
|
|
var cos = Math.cos( this.aRotation );
|
|
var sin = Math.sin( this.aRotation );
|
|
|
|
var tx = x - this.aX;
|
|
var ty = y - this.aY;
|
|
|
|
// Rotate the point about the center of the ellipse.
|
|
x = tx * cos - ty * sin + this.aX;
|
|
y = tx * sin + ty * cos + this.aY;
|
|
|
|
}
|
|
|
|
return new Vector2( x, y );
|
|
|
|
};
|
|
|
|
function SplineCurve( points /* array of Vector2 */ ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.points = ( points === undefined ) ? [] : points;
|
|
|
|
}
|
|
|
|
SplineCurve.prototype = Object.create( Curve.prototype );
|
|
SplineCurve.prototype.constructor = SplineCurve;
|
|
|
|
SplineCurve.prototype.isSplineCurve = true;
|
|
|
|
SplineCurve.prototype.getPoint = function ( t ) {
|
|
|
|
var points = this.points;
|
|
var point = ( points.length - 1 ) * t;
|
|
|
|
var intPoint = Math.floor( point );
|
|
var weight = point - intPoint;
|
|
|
|
var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];
|
|
var point1 = points[ intPoint ];
|
|
var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];
|
|
var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];
|
|
|
|
return new Vector2(
|
|
CatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),
|
|
CatmullRom( weight, point0.y, point1.y, point2.y, point3.y )
|
|
);
|
|
|
|
};
|
|
|
|
function CubicBezierCurve( v0, v1, v2, v3 ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.v0 = v0;
|
|
this.v1 = v1;
|
|
this.v2 = v2;
|
|
this.v3 = v3;
|
|
|
|
}
|
|
|
|
CubicBezierCurve.prototype = Object.create( Curve.prototype );
|
|
CubicBezierCurve.prototype.constructor = CubicBezierCurve;
|
|
|
|
CubicBezierCurve.prototype.getPoint = function ( t ) {
|
|
|
|
var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;
|
|
|
|
return new Vector2(
|
|
CubicBezier( t, v0.x, v1.x, v2.x, v3.x ),
|
|
CubicBezier( t, v0.y, v1.y, v2.y, v3.y )
|
|
);
|
|
|
|
};
|
|
|
|
function QuadraticBezierCurve( v0, v1, v2 ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.v0 = v0;
|
|
this.v1 = v1;
|
|
this.v2 = v2;
|
|
|
|
}
|
|
|
|
QuadraticBezierCurve.prototype = Object.create( Curve.prototype );
|
|
QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;
|
|
|
|
QuadraticBezierCurve.prototype.getPoint = function ( t ) {
|
|
|
|
var v0 = this.v0, v1 = this.v1, v2 = this.v2;
|
|
|
|
return new Vector2(
|
|
QuadraticBezier( t, v0.x, v1.x, v2.x ),
|
|
QuadraticBezier( t, v0.y, v1.y, v2.y )
|
|
);
|
|
|
|
};
|
|
|
|
var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {
|
|
|
|
fromPoints: function ( vectors ) {
|
|
|
|
this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );
|
|
|
|
for ( var i = 1, l = vectors.length; i < l; i ++ ) {
|
|
|
|
this.lineTo( vectors[ i ].x, vectors[ i ].y );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
moveTo: function ( x, y ) {
|
|
|
|
this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?
|
|
|
|
},
|
|
|
|
lineTo: function ( x, y ) {
|
|
|
|
var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );
|
|
this.curves.push( curve );
|
|
|
|
this.currentPoint.set( x, y );
|
|
|
|
},
|
|
|
|
quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {
|
|
|
|
var curve = new QuadraticBezierCurve(
|
|
this.currentPoint.clone(),
|
|
new Vector2( aCPx, aCPy ),
|
|
new Vector2( aX, aY )
|
|
);
|
|
|
|
this.curves.push( curve );
|
|
|
|
this.currentPoint.set( aX, aY );
|
|
|
|
},
|
|
|
|
bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
|
|
|
|
var curve = new CubicBezierCurve(
|
|
this.currentPoint.clone(),
|
|
new Vector2( aCP1x, aCP1y ),
|
|
new Vector2( aCP2x, aCP2y ),
|
|
new Vector2( aX, aY )
|
|
);
|
|
|
|
this.curves.push( curve );
|
|
|
|
this.currentPoint.set( aX, aY );
|
|
|
|
},
|
|
|
|
splineThru: function ( pts /*Array of Vector*/ ) {
|
|
|
|
var npts = [ this.currentPoint.clone() ].concat( pts );
|
|
|
|
var curve = new SplineCurve( npts );
|
|
this.curves.push( curve );
|
|
|
|
this.currentPoint.copy( pts[ pts.length - 1 ] );
|
|
|
|
},
|
|
|
|
arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
|
|
|
|
var x0 = this.currentPoint.x;
|
|
var y0 = this.currentPoint.y;
|
|
|
|
this.absarc( aX + x0, aY + y0, aRadius,
|
|
aStartAngle, aEndAngle, aClockwise );
|
|
|
|
},
|
|
|
|
absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
|
|
|
|
this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
|
|
|
|
},
|
|
|
|
ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
|
|
|
|
var x0 = this.currentPoint.x;
|
|
var y0 = this.currentPoint.y;
|
|
|
|
this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
|
|
|
|
},
|
|
|
|
absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
|
|
|
|
var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
|
|
|
|
if ( this.curves.length > 0 ) {
|
|
|
|
// if a previous curve is present, attempt to join
|
|
var firstPoint = curve.getPoint( 0 );
|
|
|
|
if ( ! firstPoint.equals( this.currentPoint ) ) {
|
|
|
|
this.lineTo( firstPoint.x, firstPoint.y );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.curves.push( curve );
|
|
|
|
var lastPoint = curve.getPoint( 1 );
|
|
this.currentPoint.copy( lastPoint );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* Creates free form 2d path using series of points, lines or curves.
|
|
**/
|
|
|
|
function Path( points ) {
|
|
|
|
CurvePath.call( this );
|
|
this.currentPoint = new Vector2();
|
|
|
|
if ( points ) {
|
|
|
|
this.fromPoints( points );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Path.prototype = PathPrototype;
|
|
PathPrototype.constructor = Path;
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* Defines a 2d shape plane using paths.
|
|
**/
|
|
|
|
// STEP 1 Create a path.
|
|
// STEP 2 Turn path into shape.
|
|
// STEP 3 ExtrudeGeometry takes in Shape/Shapes
|
|
// STEP 3a - Extract points from each shape, turn to vertices
|
|
// STEP 3b - Triangulate each shape, add faces.
|
|
|
|
function Shape() {
|
|
|
|
Path.apply( this, arguments );
|
|
|
|
this.holes = [];
|
|
|
|
}
|
|
|
|
Shape.prototype = Object.assign( Object.create( PathPrototype ), {
|
|
|
|
constructor: Shape,
|
|
|
|
getPointsHoles: function ( divisions ) {
|
|
|
|
var holesPts = [];
|
|
|
|
for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
|
|
|
|
holesPts[ i ] = this.holes[ i ].getPoints( divisions );
|
|
|
|
}
|
|
|
|
return holesPts;
|
|
|
|
},
|
|
|
|
// Get points of shape and holes (keypoints based on segments parameter)
|
|
|
|
extractAllPoints: function ( divisions ) {
|
|
|
|
return {
|
|
|
|
shape: this.getPoints( divisions ),
|
|
holes: this.getPointsHoles( divisions )
|
|
|
|
};
|
|
|
|
},
|
|
|
|
extractPoints: function ( divisions ) {
|
|
|
|
return this.extractAllPoints( divisions );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* minimal class for proxing functions to Path. Replaces old "extractSubpaths()"
|
|
**/
|
|
|
|
function ShapePath() {
|
|
|
|
this.subPaths = [];
|
|
this.currentPath = null;
|
|
|
|
}
|
|
|
|
Object.assign( ShapePath.prototype, {
|
|
|
|
moveTo: function ( x, y ) {
|
|
|
|
this.currentPath = new Path();
|
|
this.subPaths.push( this.currentPath );
|
|
this.currentPath.moveTo( x, y );
|
|
|
|
},
|
|
|
|
lineTo: function ( x, y ) {
|
|
|
|
this.currentPath.lineTo( x, y );
|
|
|
|
},
|
|
|
|
quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {
|
|
|
|
this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );
|
|
|
|
},
|
|
|
|
bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
|
|
|
|
this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );
|
|
|
|
},
|
|
|
|
splineThru: function ( pts ) {
|
|
|
|
this.currentPath.splineThru( pts );
|
|
|
|
},
|
|
|
|
toShapes: function ( isCCW, noHoles ) {
|
|
|
|
function toShapesNoHoles( inSubpaths ) {
|
|
|
|
var shapes = [];
|
|
|
|
for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {
|
|
|
|
var tmpPath = inSubpaths[ i ];
|
|
|
|
var tmpShape = new Shape();
|
|
tmpShape.curves = tmpPath.curves;
|
|
|
|
shapes.push( tmpShape );
|
|
|
|
}
|
|
|
|
return shapes;
|
|
|
|
}
|
|
|
|
function isPointInsidePolygon( inPt, inPolygon ) {
|
|
|
|
var polyLen = inPolygon.length;
|
|
|
|
// inPt on polygon contour => immediate success or
|
|
// toggling of inside/outside at every single! intersection point of an edge
|
|
// with the horizontal line through inPt, left of inPt
|
|
// not counting lowerY endpoints of edges and whole edges on that line
|
|
var inside = false;
|
|
for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {
|
|
|
|
var edgeLowPt = inPolygon[ p ];
|
|
var edgeHighPt = inPolygon[ q ];
|
|
|
|
var edgeDx = edgeHighPt.x - edgeLowPt.x;
|
|
var edgeDy = edgeHighPt.y - edgeLowPt.y;
|
|
|
|
if ( Math.abs( edgeDy ) > Number.EPSILON ) {
|
|
|
|
// not parallel
|
|
if ( edgeDy < 0 ) {
|
|
|
|
edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;
|
|
edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;
|
|
|
|
}
|
|
if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue;
|
|
|
|
if ( inPt.y === edgeLowPt.y ) {
|
|
|
|
if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ?
|
|
// continue; // no intersection or edgeLowPt => doesn't count !!!
|
|
|
|
} else {
|
|
|
|
var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );
|
|
if ( perpEdge === 0 ) return true; // inPt is on contour ?
|
|
if ( perpEdge < 0 ) continue;
|
|
inside = ! inside; // true intersection left of inPt
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// parallel or collinear
|
|
if ( inPt.y !== edgeLowPt.y ) continue; // parallel
|
|
// edge lies on the same horizontal line as inPt
|
|
if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||
|
|
( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour !
|
|
// continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return inside;
|
|
|
|
}
|
|
|
|
var isClockWise = ShapeUtils.isClockWise;
|
|
|
|
var subPaths = this.subPaths;
|
|
if ( subPaths.length === 0 ) return [];
|
|
|
|
if ( noHoles === true ) return toShapesNoHoles( subPaths );
|
|
|
|
|
|
var solid, tmpPath, tmpShape, shapes = [];
|
|
|
|
if ( subPaths.length === 1 ) {
|
|
|
|
tmpPath = subPaths[ 0 ];
|
|
tmpShape = new Shape();
|
|
tmpShape.curves = tmpPath.curves;
|
|
shapes.push( tmpShape );
|
|
return shapes;
|
|
|
|
}
|
|
|
|
var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
|
|
holesFirst = isCCW ? ! holesFirst : holesFirst;
|
|
|
|
// console.log("Holes first", holesFirst);
|
|
|
|
var betterShapeHoles = [];
|
|
var newShapes = [];
|
|
var newShapeHoles = [];
|
|
var mainIdx = 0;
|
|
var tmpPoints;
|
|
|
|
newShapes[ mainIdx ] = undefined;
|
|
newShapeHoles[ mainIdx ] = [];
|
|
|
|
for ( var i = 0, l = subPaths.length; i < l; i ++ ) {
|
|
|
|
tmpPath = subPaths[ i ];
|
|
tmpPoints = tmpPath.getPoints();
|
|
solid = isClockWise( tmpPoints );
|
|
solid = isCCW ? ! solid : solid;
|
|
|
|
if ( solid ) {
|
|
|
|
if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++;
|
|
|
|
newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };
|
|
newShapes[ mainIdx ].s.curves = tmpPath.curves;
|
|
|
|
if ( holesFirst ) mainIdx ++;
|
|
newShapeHoles[ mainIdx ] = [];
|
|
|
|
//console.log('cw', i);
|
|
|
|
} else {
|
|
|
|
newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
|
|
|
|
//console.log('ccw', i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// only Holes? -> probably all Shapes with wrong orientation
|
|
if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths );
|
|
|
|
|
|
if ( newShapes.length > 1 ) {
|
|
|
|
var ambiguous = false;
|
|
var toChange = [];
|
|
|
|
for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
|
|
|
|
betterShapeHoles[ sIdx ] = [];
|
|
|
|
}
|
|
|
|
for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
|
|
|
|
var sho = newShapeHoles[ sIdx ];
|
|
|
|
for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {
|
|
|
|
var ho = sho[ hIdx ];
|
|
var hole_unassigned = true;
|
|
|
|
for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {
|
|
|
|
if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {
|
|
|
|
if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );
|
|
if ( hole_unassigned ) {
|
|
|
|
hole_unassigned = false;
|
|
betterShapeHoles[ s2Idx ].push( ho );
|
|
|
|
} else {
|
|
|
|
ambiguous = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
if ( hole_unassigned ) {
|
|
|
|
betterShapeHoles[ sIdx ].push( ho );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
// console.log("ambiguous: ", ambiguous);
|
|
if ( toChange.length > 0 ) {
|
|
|
|
// console.log("to change: ", toChange);
|
|
if ( ! ambiguous ) newShapeHoles = betterShapeHoles;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var tmpHoles;
|
|
|
|
for ( var i = 0, il = newShapes.length; i < il; i ++ ) {
|
|
|
|
tmpShape = newShapes[ i ].s;
|
|
shapes.push( tmpShape );
|
|
tmpHoles = newShapeHoles[ i ];
|
|
|
|
for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {
|
|
|
|
tmpShape.holes.push( tmpHoles[ j ].h );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//console.log("shape", shapes);
|
|
|
|
return shapes;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Font( data ) {
|
|
|
|
this.data = data;
|
|
|
|
}
|
|
|
|
Object.assign( Font.prototype, {
|
|
|
|
isFont: true,
|
|
|
|
generateShapes: function ( text, size, divisions ) {
|
|
|
|
function createPaths( text ) {
|
|
|
|
var chars = String( text ).split( '' );
|
|
var scale = size / data.resolution;
|
|
var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;
|
|
|
|
var offsetX = 0, offsetY = 0;
|
|
|
|
var paths = [];
|
|
|
|
for ( var i = 0; i < chars.length; i ++ ) {
|
|
|
|
var char = chars[ i ];
|
|
|
|
if ( char === '\n' ) {
|
|
|
|
offsetX = 0;
|
|
offsetY -= line_height;
|
|
|
|
} else {
|
|
|
|
var ret = createPath( char, scale, offsetX, offsetY );
|
|
offsetX += ret.offsetX;
|
|
paths.push( ret.path );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return paths;
|
|
|
|
}
|
|
|
|
function createPath( c, scale, offsetX, offsetY ) {
|
|
|
|
var glyph = data.glyphs[ c ] || data.glyphs[ '?' ];
|
|
|
|
if ( ! glyph ) return;
|
|
|
|
var path = new ShapePath();
|
|
|
|
var pts = [];
|
|
var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;
|
|
|
|
if ( glyph.o ) {
|
|
|
|
var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );
|
|
|
|
for ( var i = 0, l = outline.length; i < l; ) {
|
|
|
|
var action = outline[ i ++ ];
|
|
|
|
switch ( action ) {
|
|
|
|
case 'm': // moveTo
|
|
|
|
x = outline[ i ++ ] * scale + offsetX;
|
|
y = outline[ i ++ ] * scale + offsetY;
|
|
|
|
path.moveTo( x, y );
|
|
|
|
break;
|
|
|
|
case 'l': // lineTo
|
|
|
|
x = outline[ i ++ ] * scale + offsetX;
|
|
y = outline[ i ++ ] * scale + offsetY;
|
|
|
|
path.lineTo( x, y );
|
|
|
|
break;
|
|
|
|
case 'q': // quadraticCurveTo
|
|
|
|
cpx = outline[ i ++ ] * scale + offsetX;
|
|
cpy = outline[ i ++ ] * scale + offsetY;
|
|
cpx1 = outline[ i ++ ] * scale + offsetX;
|
|
cpy1 = outline[ i ++ ] * scale + offsetY;
|
|
|
|
path.quadraticCurveTo( cpx1, cpy1, cpx, cpy );
|
|
|
|
laste = pts[ pts.length - 1 ];
|
|
|
|
if ( laste ) {
|
|
|
|
cpx0 = laste.x;
|
|
cpy0 = laste.y;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'b': // bezierCurveTo
|
|
|
|
cpx = outline[ i ++ ] * scale + offsetX;
|
|
cpy = outline[ i ++ ] * scale + offsetY;
|
|
cpx1 = outline[ i ++ ] * scale + offsetX;
|
|
cpy1 = outline[ i ++ ] * scale + offsetY;
|
|
cpx2 = outline[ i ++ ] * scale + offsetX;
|
|
cpy2 = outline[ i ++ ] * scale + offsetY;
|
|
|
|
path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );
|
|
|
|
laste = pts[ pts.length - 1 ];
|
|
|
|
if ( laste ) {
|
|
|
|
cpx0 = laste.x;
|
|
cpy0 = laste.y;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return { offsetX: glyph.ha * scale, path: path };
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if ( size === undefined ) size = 100;
|
|
if ( divisions === undefined ) divisions = 4;
|
|
|
|
var data = this.data;
|
|
|
|
var paths = createPaths( text );
|
|
var shapes = [];
|
|
|
|
for ( var p = 0, pl = paths.length; p < pl; p ++ ) {
|
|
|
|
Array.prototype.push.apply( shapes, paths[ p ].toShapes() );
|
|
|
|
}
|
|
|
|
return shapes;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function FontLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( FontLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var scope = this;
|
|
|
|
var loader = new FileLoader( this.manager );
|
|
loader.load( url, function ( text ) {
|
|
|
|
var json;
|
|
|
|
try {
|
|
|
|
json = JSON.parse( text );
|
|
|
|
} catch ( e ) {
|
|
|
|
console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );
|
|
json = JSON.parse( text.substring( 65, text.length - 2 ) );
|
|
|
|
}
|
|
|
|
var font = scope.parse( json );
|
|
|
|
if ( onLoad ) onLoad( font );
|
|
|
|
}, onProgress, onError );
|
|
|
|
},
|
|
|
|
parse: function ( json ) {
|
|
|
|
return new Font( json );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
var context;
|
|
|
|
var AudioContext = {
|
|
|
|
getContext: function () {
|
|
|
|
if ( context === undefined ) {
|
|
|
|
context = new ( window.AudioContext || window.webkitAudioContext )();
|
|
|
|
}
|
|
|
|
return context;
|
|
|
|
},
|
|
|
|
setContext: function ( value ) {
|
|
|
|
context = value;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* @author Reece Aaron Lecrivain / http://reecenotes.com/
|
|
*/
|
|
|
|
function AudioLoader( manager ) {
|
|
|
|
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
|
|
|
|
}
|
|
|
|
Object.assign( AudioLoader.prototype, {
|
|
|
|
load: function ( url, onLoad, onProgress, onError ) {
|
|
|
|
var loader = new FileLoader( this.manager );
|
|
loader.setResponseType( 'arraybuffer' );
|
|
loader.load( url, function ( buffer ) {
|
|
|
|
var context = AudioContext.getContext();
|
|
|
|
context.decodeAudioData( buffer, function ( audioBuffer ) {
|
|
|
|
onLoad( audioBuffer );
|
|
|
|
} );
|
|
|
|
}, onProgress, onError );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function StereoCamera() {
|
|
|
|
this.type = 'StereoCamera';
|
|
|
|
this.aspect = 1;
|
|
|
|
this.eyeSep = 0.064;
|
|
|
|
this.cameraL = new PerspectiveCamera();
|
|
this.cameraL.layers.enable( 1 );
|
|
this.cameraL.matrixAutoUpdate = false;
|
|
|
|
this.cameraR = new PerspectiveCamera();
|
|
this.cameraR.layers.enable( 2 );
|
|
this.cameraR.matrixAutoUpdate = false;
|
|
|
|
}
|
|
|
|
Object.assign( StereoCamera.prototype, {
|
|
|
|
update: ( function () {
|
|
|
|
var instance, focus, fov, aspect, near, far, zoom, eyeSep;
|
|
|
|
var eyeRight = new Matrix4();
|
|
var eyeLeft = new Matrix4();
|
|
|
|
return function update( camera ) {
|
|
|
|
var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||
|
|
aspect !== camera.aspect * this.aspect || near !== camera.near ||
|
|
far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;
|
|
|
|
if ( needsUpdate ) {
|
|
|
|
instance = this;
|
|
focus = camera.focus;
|
|
fov = camera.fov;
|
|
aspect = camera.aspect * this.aspect;
|
|
near = camera.near;
|
|
far = camera.far;
|
|
zoom = camera.zoom;
|
|
|
|
// Off-axis stereoscopic effect based on
|
|
// http://paulbourke.net/stereographics/stereorender/
|
|
|
|
var projectionMatrix = camera.projectionMatrix.clone();
|
|
eyeSep = this.eyeSep / 2;
|
|
var eyeSepOnProjection = eyeSep * near / focus;
|
|
var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;
|
|
var xmin, xmax;
|
|
|
|
// translate xOffset
|
|
|
|
eyeLeft.elements[ 12 ] = - eyeSep;
|
|
eyeRight.elements[ 12 ] = eyeSep;
|
|
|
|
// for left eye
|
|
|
|
xmin = - ymax * aspect + eyeSepOnProjection;
|
|
xmax = ymax * aspect + eyeSepOnProjection;
|
|
|
|
projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
|
|
projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
|
|
|
|
this.cameraL.projectionMatrix.copy( projectionMatrix );
|
|
|
|
// for right eye
|
|
|
|
xmin = - ymax * aspect - eyeSepOnProjection;
|
|
xmax = ymax * aspect - eyeSepOnProjection;
|
|
|
|
projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
|
|
projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
|
|
|
|
this.cameraR.projectionMatrix.copy( projectionMatrix );
|
|
|
|
}
|
|
|
|
this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );
|
|
this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );
|
|
|
|
};
|
|
|
|
} )()
|
|
|
|
} );
|
|
|
|
/**
|
|
* Camera for rendering cube maps
|
|
* - renders scene into axis-aligned cube
|
|
*
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function CubeCamera( near, far, cubeResolution ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'CubeCamera';
|
|
|
|
var fov = 90, aspect = 1;
|
|
|
|
var cameraPX = new PerspectiveCamera( fov, aspect, near, far );
|
|
cameraPX.up.set( 0, - 1, 0 );
|
|
cameraPX.lookAt( new Vector3( 1, 0, 0 ) );
|
|
this.add( cameraPX );
|
|
|
|
var cameraNX = new PerspectiveCamera( fov, aspect, near, far );
|
|
cameraNX.up.set( 0, - 1, 0 );
|
|
cameraNX.lookAt( new Vector3( - 1, 0, 0 ) );
|
|
this.add( cameraNX );
|
|
|
|
var cameraPY = new PerspectiveCamera( fov, aspect, near, far );
|
|
cameraPY.up.set( 0, 0, 1 );
|
|
cameraPY.lookAt( new Vector3( 0, 1, 0 ) );
|
|
this.add( cameraPY );
|
|
|
|
var cameraNY = new PerspectiveCamera( fov, aspect, near, far );
|
|
cameraNY.up.set( 0, 0, - 1 );
|
|
cameraNY.lookAt( new Vector3( 0, - 1, 0 ) );
|
|
this.add( cameraNY );
|
|
|
|
var cameraPZ = new PerspectiveCamera( fov, aspect, near, far );
|
|
cameraPZ.up.set( 0, - 1, 0 );
|
|
cameraPZ.lookAt( new Vector3( 0, 0, 1 ) );
|
|
this.add( cameraPZ );
|
|
|
|
var cameraNZ = new PerspectiveCamera( fov, aspect, near, far );
|
|
cameraNZ.up.set( 0, - 1, 0 );
|
|
cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );
|
|
this.add( cameraNZ );
|
|
|
|
var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };
|
|
|
|
this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );
|
|
this.renderTarget.texture.name = "CubeCamera";
|
|
|
|
this.updateCubeMap = function ( renderer, scene ) {
|
|
|
|
if ( this.parent === null ) this.updateMatrixWorld();
|
|
|
|
var renderTarget = this.renderTarget;
|
|
var generateMipmaps = renderTarget.texture.generateMipmaps;
|
|
|
|
renderTarget.texture.generateMipmaps = false;
|
|
|
|
renderTarget.activeCubeFace = 0;
|
|
renderer.render( scene, cameraPX, renderTarget );
|
|
|
|
renderTarget.activeCubeFace = 1;
|
|
renderer.render( scene, cameraNX, renderTarget );
|
|
|
|
renderTarget.activeCubeFace = 2;
|
|
renderer.render( scene, cameraPY, renderTarget );
|
|
|
|
renderTarget.activeCubeFace = 3;
|
|
renderer.render( scene, cameraNY, renderTarget );
|
|
|
|
renderTarget.activeCubeFace = 4;
|
|
renderer.render( scene, cameraPZ, renderTarget );
|
|
|
|
renderTarget.texture.generateMipmaps = generateMipmaps;
|
|
|
|
renderTarget.activeCubeFace = 5;
|
|
renderer.render( scene, cameraNZ, renderTarget );
|
|
|
|
renderer.setRenderTarget( null );
|
|
|
|
};
|
|
|
|
}
|
|
|
|
CubeCamera.prototype = Object.create( Object3D.prototype );
|
|
CubeCamera.prototype.constructor = CubeCamera;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function ArrayCamera( array ) {
|
|
|
|
PerspectiveCamera.call( this );
|
|
|
|
this.enabled = false;
|
|
this.cameras = array || [];
|
|
|
|
}
|
|
|
|
ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {
|
|
|
|
constructor: ArrayCamera,
|
|
|
|
isArrayCamera: true
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function AudioListener() {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'AudioListener';
|
|
|
|
this.context = AudioContext.getContext();
|
|
|
|
this.gain = this.context.createGain();
|
|
this.gain.connect( this.context.destination );
|
|
|
|
this.filter = null;
|
|
|
|
}
|
|
|
|
AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: AudioListener,
|
|
|
|
getInput: function () {
|
|
|
|
return this.gain;
|
|
|
|
},
|
|
|
|
removeFilter: function ( ) {
|
|
|
|
if ( this.filter !== null ) {
|
|
|
|
this.gain.disconnect( this.filter );
|
|
this.filter.disconnect( this.context.destination );
|
|
this.gain.connect( this.context.destination );
|
|
this.filter = null;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
getFilter: function () {
|
|
|
|
return this.filter;
|
|
|
|
},
|
|
|
|
setFilter: function ( value ) {
|
|
|
|
if ( this.filter !== null ) {
|
|
|
|
this.gain.disconnect( this.filter );
|
|
this.filter.disconnect( this.context.destination );
|
|
|
|
} else {
|
|
|
|
this.gain.disconnect( this.context.destination );
|
|
|
|
}
|
|
|
|
this.filter = value;
|
|
this.gain.connect( this.filter );
|
|
this.filter.connect( this.context.destination );
|
|
|
|
},
|
|
|
|
getMasterVolume: function () {
|
|
|
|
return this.gain.gain.value;
|
|
|
|
},
|
|
|
|
setMasterVolume: function ( value ) {
|
|
|
|
this.gain.gain.value = value;
|
|
|
|
},
|
|
|
|
updateMatrixWorld: ( function () {
|
|
|
|
var position = new Vector3();
|
|
var quaternion = new Quaternion();
|
|
var scale = new Vector3();
|
|
|
|
var orientation = new Vector3();
|
|
|
|
return function updateMatrixWorld( force ) {
|
|
|
|
Object3D.prototype.updateMatrixWorld.call( this, force );
|
|
|
|
var listener = this.context.listener;
|
|
var up = this.up;
|
|
|
|
this.matrixWorld.decompose( position, quaternion, scale );
|
|
|
|
orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
|
|
|
|
if ( listener.positionX ) {
|
|
|
|
listener.positionX.setValueAtTime( position.x, this.context.currentTime );
|
|
listener.positionY.setValueAtTime( position.y, this.context.currentTime );
|
|
listener.positionZ.setValueAtTime( position.z, this.context.currentTime );
|
|
listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );
|
|
listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );
|
|
listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );
|
|
listener.upX.setValueAtTime( up.x, this.context.currentTime );
|
|
listener.upY.setValueAtTime( up.y, this.context.currentTime );
|
|
listener.upZ.setValueAtTime( up.z, this.context.currentTime );
|
|
|
|
} else {
|
|
|
|
listener.setPosition( position.x, position.y, position.z );
|
|
listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
} )()
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Reece Aaron Lecrivain / http://reecenotes.com/
|
|
*/
|
|
|
|
function Audio( listener ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.type = 'Audio';
|
|
|
|
this.context = listener.context;
|
|
|
|
this.gain = this.context.createGain();
|
|
this.gain.connect( listener.getInput() );
|
|
|
|
this.autoplay = false;
|
|
|
|
this.buffer = null;
|
|
this.loop = false;
|
|
this.startTime = 0;
|
|
this.playbackRate = 1;
|
|
this.isPlaying = false;
|
|
this.hasPlaybackControl = true;
|
|
this.sourceType = 'empty';
|
|
|
|
this.filters = [];
|
|
|
|
}
|
|
|
|
Audio.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
|
constructor: Audio,
|
|
|
|
getOutput: function () {
|
|
|
|
return this.gain;
|
|
|
|
},
|
|
|
|
setNodeSource: function ( audioNode ) {
|
|
|
|
this.hasPlaybackControl = false;
|
|
this.sourceType = 'audioNode';
|
|
this.source = audioNode;
|
|
this.connect();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setBuffer: function ( audioBuffer ) {
|
|
|
|
this.buffer = audioBuffer;
|
|
this.sourceType = 'buffer';
|
|
|
|
if ( this.autoplay ) this.play();
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
play: function () {
|
|
|
|
if ( this.isPlaying === true ) {
|
|
|
|
console.warn( 'THREE.Audio: Audio is already playing.' );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( this.hasPlaybackControl === false ) {
|
|
|
|
console.warn( 'THREE.Audio: this Audio has no playback control.' );
|
|
return;
|
|
|
|
}
|
|
|
|
var source = this.context.createBufferSource();
|
|
|
|
source.buffer = this.buffer;
|
|
source.loop = this.loop;
|
|
source.onended = this.onEnded.bind( this );
|
|
source.playbackRate.setValueAtTime( this.playbackRate, this.startTime );
|
|
source.start( 0, this.startTime );
|
|
|
|
this.isPlaying = true;
|
|
|
|
this.source = source;
|
|
|
|
return this.connect();
|
|
|
|
},
|
|
|
|
pause: function () {
|
|
|
|
if ( this.hasPlaybackControl === false ) {
|
|
|
|
console.warn( 'THREE.Audio: this Audio has no playback control.' );
|
|
return;
|
|
|
|
}
|
|
|
|
this.source.stop();
|
|
this.startTime = this.context.currentTime;
|
|
this.isPlaying = false;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
stop: function () {
|
|
|
|
if ( this.hasPlaybackControl === false ) {
|
|
|
|
console.warn( 'THREE.Audio: this Audio has no playback control.' );
|
|
return;
|
|
|
|
}
|
|
|
|
this.source.stop();
|
|
this.startTime = 0;
|
|
this.isPlaying = false;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
connect: function () {
|
|
|
|
if ( this.filters.length > 0 ) {
|
|
|
|
this.source.connect( this.filters[ 0 ] );
|
|
|
|
for ( var i = 1, l = this.filters.length; i < l; i ++ ) {
|
|
|
|
this.filters[ i - 1 ].connect( this.filters[ i ] );
|
|
|
|
}
|
|
|
|
this.filters[ this.filters.length - 1 ].connect( this.getOutput() );
|
|
|
|
} else {
|
|
|
|
this.source.connect( this.getOutput() );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
disconnect: function () {
|
|
|
|
if ( this.filters.length > 0 ) {
|
|
|
|
this.source.disconnect( this.filters[ 0 ] );
|
|
|
|
for ( var i = 1, l = this.filters.length; i < l; i ++ ) {
|
|
|
|
this.filters[ i - 1 ].disconnect( this.filters[ i ] );
|
|
|
|
}
|
|
|
|
this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );
|
|
|
|
} else {
|
|
|
|
this.source.disconnect( this.getOutput() );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getFilters: function () {
|
|
|
|
return this.filters;
|
|
|
|
},
|
|
|
|
setFilters: function ( value ) {
|
|
|
|
if ( ! value ) value = [];
|
|
|
|
if ( this.isPlaying === true ) {
|
|
|
|
this.disconnect();
|
|
this.filters = value;
|
|
this.connect();
|
|
|
|
} else {
|
|
|
|
this.filters = value;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getFilter: function () {
|
|
|
|
return this.getFilters()[ 0 ];
|
|
|
|
},
|
|
|
|
setFilter: function ( filter ) {
|
|
|
|
return this.setFilters( filter ? [ filter ] : [] );
|
|
|
|
},
|
|
|
|
setPlaybackRate: function ( value ) {
|
|
|
|
if ( this.hasPlaybackControl === false ) {
|
|
|
|
console.warn( 'THREE.Audio: this Audio has no playback control.' );
|
|
return;
|
|
|
|
}
|
|
|
|
this.playbackRate = value;
|
|
|
|
if ( this.isPlaying === true ) {
|
|
|
|
this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getPlaybackRate: function () {
|
|
|
|
return this.playbackRate;
|
|
|
|
},
|
|
|
|
onEnded: function () {
|
|
|
|
this.isPlaying = false;
|
|
|
|
},
|
|
|
|
getLoop: function () {
|
|
|
|
if ( this.hasPlaybackControl === false ) {
|
|
|
|
console.warn( 'THREE.Audio: this Audio has no playback control.' );
|
|
return false;
|
|
|
|
}
|
|
|
|
return this.loop;
|
|
|
|
},
|
|
|
|
setLoop: function ( value ) {
|
|
|
|
if ( this.hasPlaybackControl === false ) {
|
|
|
|
console.warn( 'THREE.Audio: this Audio has no playback control.' );
|
|
return;
|
|
|
|
}
|
|
|
|
this.loop = value;
|
|
|
|
if ( this.isPlaying === true ) {
|
|
|
|
this.source.loop = this.loop;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getVolume: function () {
|
|
|
|
return this.gain.gain.value;
|
|
|
|
},
|
|
|
|
setVolume: function ( value ) {
|
|
|
|
this.gain.gain.value = value;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function PositionalAudio( listener ) {
|
|
|
|
Audio.call( this, listener );
|
|
|
|
this.panner = this.context.createPanner();
|
|
this.panner.connect( this.gain );
|
|
|
|
}
|
|
|
|
PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {
|
|
|
|
constructor: PositionalAudio,
|
|
|
|
getOutput: function () {
|
|
|
|
return this.panner;
|
|
|
|
},
|
|
|
|
getRefDistance: function () {
|
|
|
|
return this.panner.refDistance;
|
|
|
|
},
|
|
|
|
setRefDistance: function ( value ) {
|
|
|
|
this.panner.refDistance = value;
|
|
|
|
},
|
|
|
|
getRolloffFactor: function () {
|
|
|
|
return this.panner.rolloffFactor;
|
|
|
|
},
|
|
|
|
setRolloffFactor: function ( value ) {
|
|
|
|
this.panner.rolloffFactor = value;
|
|
|
|
},
|
|
|
|
getDistanceModel: function () {
|
|
|
|
return this.panner.distanceModel;
|
|
|
|
},
|
|
|
|
setDistanceModel: function ( value ) {
|
|
|
|
this.panner.distanceModel = value;
|
|
|
|
},
|
|
|
|
getMaxDistance: function () {
|
|
|
|
return this.panner.maxDistance;
|
|
|
|
},
|
|
|
|
setMaxDistance: function ( value ) {
|
|
|
|
this.panner.maxDistance = value;
|
|
|
|
},
|
|
|
|
updateMatrixWorld: ( function () {
|
|
|
|
var position = new Vector3();
|
|
|
|
return function updateMatrixWorld( force ) {
|
|
|
|
Object3D.prototype.updateMatrixWorld.call( this, force );
|
|
|
|
position.setFromMatrixPosition( this.matrixWorld );
|
|
|
|
this.panner.setPosition( position.x, position.y, position.z );
|
|
|
|
};
|
|
|
|
} )()
|
|
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function AudioAnalyser( audio, fftSize ) {
|
|
|
|
this.analyser = audio.context.createAnalyser();
|
|
this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;
|
|
|
|
this.data = new Uint8Array( this.analyser.frequencyBinCount );
|
|
|
|
audio.getOutput().connect( this.analyser );
|
|
|
|
}
|
|
|
|
Object.assign( AudioAnalyser.prototype, {
|
|
|
|
getFrequencyData: function () {
|
|
|
|
this.analyser.getByteFrequencyData( this.data );
|
|
|
|
return this.data;
|
|
|
|
},
|
|
|
|
getAverageFrequency: function () {
|
|
|
|
var value = 0, data = this.getFrequencyData();
|
|
|
|
for ( var i = 0; i < data.length; i ++ ) {
|
|
|
|
value += data[ i ];
|
|
|
|
}
|
|
|
|
return value / data.length;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* Buffered scene graph property that allows weighted accumulation.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function PropertyMixer( binding, typeName, valueSize ) {
|
|
|
|
this.binding = binding;
|
|
this.valueSize = valueSize;
|
|
|
|
var bufferType = Float64Array,
|
|
mixFunction;
|
|
|
|
switch ( typeName ) {
|
|
|
|
case 'quaternion':
|
|
mixFunction = this._slerp;
|
|
break;
|
|
|
|
case 'string':
|
|
case 'bool':
|
|
bufferType = Array;
|
|
mixFunction = this._select;
|
|
break;
|
|
|
|
default:
|
|
mixFunction = this._lerp;
|
|
|
|
}
|
|
|
|
this.buffer = new bufferType( valueSize * 4 );
|
|
// layout: [ incoming | accu0 | accu1 | orig ]
|
|
//
|
|
// interpolators can use .buffer as their .result
|
|
// the data then goes to 'incoming'
|
|
//
|
|
// 'accu0' and 'accu1' are used frame-interleaved for
|
|
// the cumulative result and are compared to detect
|
|
// changes
|
|
//
|
|
// 'orig' stores the original state of the property
|
|
|
|
this._mixBufferRegion = mixFunction;
|
|
|
|
this.cumulativeWeight = 0;
|
|
|
|
this.useCount = 0;
|
|
this.referenceCount = 0;
|
|
|
|
}
|
|
|
|
Object.assign( PropertyMixer.prototype, {
|
|
|
|
// accumulate data in the 'incoming' region into 'accu<i>'
|
|
accumulate: function ( accuIndex, weight ) {
|
|
|
|
// note: happily accumulating nothing when weight = 0, the caller knows
|
|
// the weight and shouldn't have made the call in the first place
|
|
|
|
var buffer = this.buffer,
|
|
stride = this.valueSize,
|
|
offset = accuIndex * stride + stride,
|
|
|
|
currentWeight = this.cumulativeWeight;
|
|
|
|
if ( currentWeight === 0 ) {
|
|
|
|
// accuN := incoming * weight
|
|
|
|
for ( var i = 0; i !== stride; ++ i ) {
|
|
|
|
buffer[ offset + i ] = buffer[ i ];
|
|
|
|
}
|
|
|
|
currentWeight = weight;
|
|
|
|
} else {
|
|
|
|
// accuN := accuN + incoming * weight
|
|
|
|
currentWeight += weight;
|
|
var mix = weight / currentWeight;
|
|
this._mixBufferRegion( buffer, offset, 0, mix, stride );
|
|
|
|
}
|
|
|
|
this.cumulativeWeight = currentWeight;
|
|
|
|
},
|
|
|
|
// apply the state of 'accu<i>' to the binding when accus differ
|
|
apply: function ( accuIndex ) {
|
|
|
|
var stride = this.valueSize,
|
|
buffer = this.buffer,
|
|
offset = accuIndex * stride + stride,
|
|
|
|
weight = this.cumulativeWeight,
|
|
|
|
binding = this.binding;
|
|
|
|
this.cumulativeWeight = 0;
|
|
|
|
if ( weight < 1 ) {
|
|
|
|
// accuN := accuN + original * ( 1 - cumulativeWeight )
|
|
|
|
var originalValueOffset = stride * 3;
|
|
|
|
this._mixBufferRegion(
|
|
buffer, offset, originalValueOffset, 1 - weight, stride );
|
|
|
|
}
|
|
|
|
for ( var i = stride, e = stride + stride; i !== e; ++ i ) {
|
|
|
|
if ( buffer[ i ] !== buffer[ i + stride ] ) {
|
|
|
|
// value has changed -> update scene graph
|
|
|
|
binding.setValue( buffer, offset );
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// remember the state of the bound property and copy it to both accus
|
|
saveOriginalState: function () {
|
|
|
|
var binding = this.binding;
|
|
|
|
var buffer = this.buffer,
|
|
stride = this.valueSize,
|
|
|
|
originalValueOffset = stride * 3;
|
|
|
|
binding.getValue( buffer, originalValueOffset );
|
|
|
|
// accu[0..1] := orig -- initially detect changes against the original
|
|
for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {
|
|
|
|
buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];
|
|
|
|
}
|
|
|
|
this.cumulativeWeight = 0;
|
|
|
|
},
|
|
|
|
// apply the state previously taken via 'saveOriginalState' to the binding
|
|
restoreOriginalState: function () {
|
|
|
|
var originalValueOffset = this.valueSize * 3;
|
|
this.binding.setValue( this.buffer, originalValueOffset );
|
|
|
|
},
|
|
|
|
|
|
// mix functions
|
|
|
|
_select: function ( buffer, dstOffset, srcOffset, t, stride ) {
|
|
|
|
if ( t >= 0.5 ) {
|
|
|
|
for ( var i = 0; i !== stride; ++ i ) {
|
|
|
|
buffer[ dstOffset + i ] = buffer[ srcOffset + i ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_slerp: function ( buffer, dstOffset, srcOffset, t ) {
|
|
|
|
Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );
|
|
|
|
},
|
|
|
|
_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {
|
|
|
|
var s = 1 - t;
|
|
|
|
for ( var i = 0; i !== stride; ++ i ) {
|
|
|
|
var j = dstOffset + i;
|
|
|
|
buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A reference to a real property in the scene graph.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function Composite( targetGroup, path, optionalParsedPath ) {
|
|
|
|
var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );
|
|
|
|
this._targetGroup = targetGroup;
|
|
this._bindings = targetGroup.subscribe_( path, parsedPath );
|
|
|
|
}
|
|
|
|
Object.assign( Composite.prototype, {
|
|
|
|
getValue: function ( array, offset ) {
|
|
|
|
this.bind(); // bind all binding
|
|
|
|
var firstValidIndex = this._targetGroup.nCachedObjects_,
|
|
binding = this._bindings[ firstValidIndex ];
|
|
|
|
// and only call .getValue on the first
|
|
if ( binding !== undefined ) binding.getValue( array, offset );
|
|
|
|
},
|
|
|
|
setValue: function ( array, offset ) {
|
|
|
|
var bindings = this._bindings;
|
|
|
|
for ( var i = this._targetGroup.nCachedObjects_,
|
|
n = bindings.length; i !== n; ++ i ) {
|
|
|
|
bindings[ i ].setValue( array, offset );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
bind: function () {
|
|
|
|
var bindings = this._bindings;
|
|
|
|
for ( var i = this._targetGroup.nCachedObjects_,
|
|
n = bindings.length; i !== n; ++ i ) {
|
|
|
|
bindings[ i ].bind();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
unbind: function () {
|
|
|
|
var bindings = this._bindings;
|
|
|
|
for ( var i = this._targetGroup.nCachedObjects_,
|
|
n = bindings.length; i !== n; ++ i ) {
|
|
|
|
bindings[ i ].unbind();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
function PropertyBinding( rootNode, path, parsedPath ) {
|
|
|
|
this.path = path;
|
|
this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );
|
|
|
|
this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;
|
|
|
|
this.rootNode = rootNode;
|
|
|
|
}
|
|
|
|
Object.assign( PropertyBinding, {
|
|
|
|
Composite: Composite,
|
|
|
|
create: function ( root, path, parsedPath ) {
|
|
|
|
if ( ! ( root && root.isAnimationObjectGroup ) ) {
|
|
|
|
return new PropertyBinding( root, path, parsedPath );
|
|
|
|
} else {
|
|
|
|
return new PropertyBinding.Composite( root, path, parsedPath );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
parseTrackName: function () {
|
|
|
|
// Parent directories, delimited by '/' or ':'. Currently unused, but must
|
|
// be matched to parse the rest of the track name.
|
|
var directoryRe = /((?:[\w-]+[\/:])*)/;
|
|
|
|
// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
|
|
var nodeRe = /([\w-\.]+)?/;
|
|
|
|
// Object on target node, and accessor. Name may contain only word
|
|
// characters. Accessor may contain any character except closing bracket.
|
|
var objectRe = /(?:\.([\w-]+)(?:\[(.+)\])?)?/;
|
|
|
|
// Property and accessor. May contain only word characters. Accessor may
|
|
// contain any non-bracket characters.
|
|
var propertyRe = /\.([\w-]+)(?:\[(.+)\])?/;
|
|
|
|
var trackRe = new RegExp(''
|
|
+ '^'
|
|
+ directoryRe.source
|
|
+ nodeRe.source
|
|
+ objectRe.source
|
|
+ propertyRe.source
|
|
+ '$'
|
|
);
|
|
|
|
var supportedObjectNames = [ 'material', 'materials', 'bones' ];
|
|
|
|
return function ( trackName ) {
|
|
|
|
var matches = trackRe.exec( trackName );
|
|
|
|
if ( ! matches ) {
|
|
|
|
throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );
|
|
|
|
}
|
|
|
|
var results = {
|
|
// directoryName: matches[ 1 ], // (tschw) currently unused
|
|
nodeName: matches[ 2 ],
|
|
objectName: matches[ 3 ],
|
|
objectIndex: matches[ 4 ],
|
|
propertyName: matches[ 5 ], // required
|
|
propertyIndex: matches[ 6 ]
|
|
};
|
|
|
|
var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );
|
|
|
|
if ( lastDot !== undefined && lastDot !== -1 ) {
|
|
|
|
var objectName = results.nodeName.substring( lastDot + 1 );
|
|
|
|
// Object names must be checked against a whitelist. Otherwise, there
|
|
// is no way to parse 'foo.bar.baz': 'baz' must be a property, but
|
|
// 'bar' could be the objectName, or part of a nodeName (which can
|
|
// include '.' characters).
|
|
if ( supportedObjectNames.indexOf( objectName ) !== -1 ) {
|
|
|
|
results.nodeName = results.nodeName.substring( 0, lastDot );
|
|
results.objectName = objectName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( results.propertyName === null || results.propertyName.length === 0 ) {
|
|
|
|
throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );
|
|
|
|
}
|
|
|
|
return results;
|
|
|
|
};
|
|
|
|
}(),
|
|
|
|
findNode: function ( root, nodeName ) {
|
|
|
|
if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {
|
|
|
|
return root;
|
|
|
|
}
|
|
|
|
// search into skeleton bones.
|
|
if ( root.skeleton ) {
|
|
|
|
var searchSkeleton = function ( skeleton ) {
|
|
|
|
for ( var i = 0; i < skeleton.bones.length; i ++ ) {
|
|
|
|
var bone = skeleton.bones[ i ];
|
|
|
|
if ( bone.name === nodeName ) {
|
|
|
|
return bone;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
|
|
|
var bone = searchSkeleton( root.skeleton );
|
|
|
|
if ( bone ) {
|
|
|
|
return bone;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// search into node subtree.
|
|
if ( root.children ) {
|
|
|
|
var searchNodeSubtree = function ( children ) {
|
|
|
|
for ( var i = 0; i < children.length; i ++ ) {
|
|
|
|
var childNode = children[ i ];
|
|
|
|
if ( childNode.name === nodeName || childNode.uuid === nodeName ) {
|
|
|
|
return childNode;
|
|
|
|
}
|
|
|
|
var result = searchNodeSubtree( childNode.children );
|
|
|
|
if ( result ) return result;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
|
|
|
var subTreeNode = searchNodeSubtree( root.children );
|
|
|
|
if ( subTreeNode ) {
|
|
|
|
return subTreeNode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( PropertyBinding.prototype, { // prototype, continued
|
|
|
|
// these are used to "bind" a nonexistent property
|
|
_getValue_unavailable: function () {},
|
|
_setValue_unavailable: function () {},
|
|
|
|
BindingType: {
|
|
Direct: 0,
|
|
EntireArray: 1,
|
|
ArrayElement: 2,
|
|
HasFromToArray: 3
|
|
},
|
|
|
|
Versioning: {
|
|
None: 0,
|
|
NeedsUpdate: 1,
|
|
MatrixWorldNeedsUpdate: 2
|
|
},
|
|
|
|
GetterByBindingType: [
|
|
|
|
function getValue_direct( buffer, offset ) {
|
|
|
|
buffer[ offset ] = this.node[ this.propertyName ];
|
|
|
|
},
|
|
|
|
function getValue_array( buffer, offset ) {
|
|
|
|
var source = this.resolvedProperty;
|
|
|
|
for ( var i = 0, n = source.length; i !== n; ++ i ) {
|
|
|
|
buffer[ offset ++ ] = source[ i ];
|
|
|
|
}
|
|
|
|
},
|
|
|
|
function getValue_arrayElement( buffer, offset ) {
|
|
|
|
buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];
|
|
|
|
},
|
|
|
|
function getValue_toArray( buffer, offset ) {
|
|
|
|
this.resolvedProperty.toArray( buffer, offset );
|
|
|
|
}
|
|
|
|
],
|
|
|
|
SetterByBindingTypeAndVersioning: [
|
|
|
|
[
|
|
// Direct
|
|
|
|
function setValue_direct( buffer, offset ) {
|
|
|
|
this.node[ this.propertyName ] = buffer[ offset ];
|
|
|
|
},
|
|
|
|
function setValue_direct_setNeedsUpdate( buffer, offset ) {
|
|
|
|
this.node[ this.propertyName ] = buffer[ offset ];
|
|
this.targetObject.needsUpdate = true;
|
|
|
|
},
|
|
|
|
function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {
|
|
|
|
this.node[ this.propertyName ] = buffer[ offset ];
|
|
this.targetObject.matrixWorldNeedsUpdate = true;
|
|
|
|
}
|
|
|
|
], [
|
|
|
|
// EntireArray
|
|
|
|
function setValue_array( buffer, offset ) {
|
|
|
|
var dest = this.resolvedProperty;
|
|
|
|
for ( var i = 0, n = dest.length; i !== n; ++ i ) {
|
|
|
|
dest[ i ] = buffer[ offset ++ ];
|
|
|
|
}
|
|
|
|
},
|
|
|
|
function setValue_array_setNeedsUpdate( buffer, offset ) {
|
|
|
|
var dest = this.resolvedProperty;
|
|
|
|
for ( var i = 0, n = dest.length; i !== n; ++ i ) {
|
|
|
|
dest[ i ] = buffer[ offset ++ ];
|
|
|
|
}
|
|
|
|
this.targetObject.needsUpdate = true;
|
|
|
|
},
|
|
|
|
function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {
|
|
|
|
var dest = this.resolvedProperty;
|
|
|
|
for ( var i = 0, n = dest.length; i !== n; ++ i ) {
|
|
|
|
dest[ i ] = buffer[ offset ++ ];
|
|
|
|
}
|
|
|
|
this.targetObject.matrixWorldNeedsUpdate = true;
|
|
|
|
}
|
|
|
|
], [
|
|
|
|
// ArrayElement
|
|
|
|
function setValue_arrayElement( buffer, offset ) {
|
|
|
|
this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
|
|
|
|
},
|
|
|
|
function setValue_arrayElement_setNeedsUpdate( buffer, offset ) {
|
|
|
|
this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
|
|
this.targetObject.needsUpdate = true;
|
|
|
|
},
|
|
|
|
function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {
|
|
|
|
this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
|
|
this.targetObject.matrixWorldNeedsUpdate = true;
|
|
|
|
}
|
|
|
|
], [
|
|
|
|
// HasToFromArray
|
|
|
|
function setValue_fromArray( buffer, offset ) {
|
|
|
|
this.resolvedProperty.fromArray( buffer, offset );
|
|
|
|
},
|
|
|
|
function setValue_fromArray_setNeedsUpdate( buffer, offset ) {
|
|
|
|
this.resolvedProperty.fromArray( buffer, offset );
|
|
this.targetObject.needsUpdate = true;
|
|
|
|
},
|
|
|
|
function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {
|
|
|
|
this.resolvedProperty.fromArray( buffer, offset );
|
|
this.targetObject.matrixWorldNeedsUpdate = true;
|
|
|
|
}
|
|
|
|
]
|
|
|
|
],
|
|
|
|
getValue: function getValue_unbound( targetArray, offset ) {
|
|
|
|
this.bind();
|
|
this.getValue( targetArray, offset );
|
|
|
|
// Note: This class uses a State pattern on a per-method basis:
|
|
// 'bind' sets 'this.getValue' / 'setValue' and shadows the
|
|
// prototype version of these methods with one that represents
|
|
// the bound state. When the property is not found, the methods
|
|
// become no-ops.
|
|
|
|
},
|
|
|
|
setValue: function getValue_unbound( sourceArray, offset ) {
|
|
|
|
this.bind();
|
|
this.setValue( sourceArray, offset );
|
|
|
|
},
|
|
|
|
// create getter / setter pair for a property in the scene graph
|
|
bind: function () {
|
|
|
|
var targetObject = this.node,
|
|
parsedPath = this.parsedPath,
|
|
|
|
objectName = parsedPath.objectName,
|
|
propertyName = parsedPath.propertyName,
|
|
propertyIndex = parsedPath.propertyIndex;
|
|
|
|
if ( ! targetObject ) {
|
|
|
|
targetObject = PropertyBinding.findNode(
|
|
this.rootNode, parsedPath.nodeName ) || this.rootNode;
|
|
|
|
this.node = targetObject;
|
|
|
|
}
|
|
|
|
// set fail state so we can just 'return' on error
|
|
this.getValue = this._getValue_unavailable;
|
|
this.setValue = this._setValue_unavailable;
|
|
|
|
// ensure there is a value node
|
|
if ( ! targetObject ) {
|
|
|
|
console.error( " trying to update node for track: " + this.path + " but it wasn't found." );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( objectName ) {
|
|
|
|
var objectIndex = parsedPath.objectIndex;
|
|
|
|
// special cases were we need to reach deeper into the hierarchy to get the face materials....
|
|
switch ( objectName ) {
|
|
|
|
case 'materials':
|
|
|
|
if ( ! targetObject.material ) {
|
|
|
|
console.error( ' can not bind to material as node does not have a material', this );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( ! targetObject.material.materials ) {
|
|
|
|
console.error( ' can not bind to material.materials as node.material does not have a materials array', this );
|
|
return;
|
|
|
|
}
|
|
|
|
targetObject = targetObject.material.materials;
|
|
|
|
break;
|
|
|
|
case 'bones':
|
|
|
|
if ( ! targetObject.skeleton ) {
|
|
|
|
console.error( ' can not bind to bones as node does not have a skeleton', this );
|
|
return;
|
|
|
|
}
|
|
|
|
// potential future optimization: skip this if propertyIndex is already an integer
|
|
// and convert the integer string to a true integer.
|
|
|
|
targetObject = targetObject.skeleton.bones;
|
|
|
|
// support resolving morphTarget names into indices.
|
|
for ( var i = 0; i < targetObject.length; i ++ ) {
|
|
|
|
if ( targetObject[ i ].name === objectIndex ) {
|
|
|
|
objectIndex = i;
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if ( targetObject[ objectName ] === undefined ) {
|
|
|
|
console.error( ' can not bind to objectName of node, undefined', this );
|
|
return;
|
|
|
|
}
|
|
|
|
targetObject = targetObject[ objectName ];
|
|
|
|
}
|
|
|
|
|
|
if ( objectIndex !== undefined ) {
|
|
|
|
if ( targetObject[ objectIndex ] === undefined ) {
|
|
|
|
console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject );
|
|
return;
|
|
|
|
}
|
|
|
|
targetObject = targetObject[ objectIndex ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// resolve property
|
|
var nodeProperty = targetObject[ propertyName ];
|
|
|
|
if ( nodeProperty === undefined ) {
|
|
|
|
var nodeName = parsedPath.nodeName;
|
|
|
|
console.error( " trying to update property for track: " + nodeName +
|
|
'.' + propertyName + " but it wasn't found.", targetObject );
|
|
return;
|
|
|
|
}
|
|
|
|
// determine versioning scheme
|
|
var versioning = this.Versioning.None;
|
|
|
|
if ( targetObject.needsUpdate !== undefined ) { // material
|
|
|
|
versioning = this.Versioning.NeedsUpdate;
|
|
this.targetObject = targetObject;
|
|
|
|
} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform
|
|
|
|
versioning = this.Versioning.MatrixWorldNeedsUpdate;
|
|
this.targetObject = targetObject;
|
|
|
|
}
|
|
|
|
// determine how the property gets bound
|
|
var bindingType = this.BindingType.Direct;
|
|
|
|
if ( propertyIndex !== undefined ) {
|
|
|
|
// access a sub element of the property array (only primitives are supported right now)
|
|
|
|
if ( propertyName === "morphTargetInfluences" ) {
|
|
|
|
// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
|
|
|
|
// support resolving morphTarget names into indices.
|
|
if ( ! targetObject.geometry ) {
|
|
|
|
console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );
|
|
return;
|
|
|
|
}
|
|
|
|
if ( ! targetObject.geometry.morphTargets ) {
|
|
|
|
console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );
|
|
return;
|
|
|
|
}
|
|
|
|
for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {
|
|
|
|
if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {
|
|
|
|
propertyIndex = i;
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bindingType = this.BindingType.ArrayElement;
|
|
|
|
this.resolvedProperty = nodeProperty;
|
|
this.propertyIndex = propertyIndex;
|
|
|
|
} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {
|
|
|
|
// must use copy for Object3D.Euler/Quaternion
|
|
|
|
bindingType = this.BindingType.HasFromToArray;
|
|
|
|
this.resolvedProperty = nodeProperty;
|
|
|
|
} else if ( Array.isArray( nodeProperty ) ) {
|
|
|
|
bindingType = this.BindingType.EntireArray;
|
|
|
|
this.resolvedProperty = nodeProperty;
|
|
|
|
} else {
|
|
|
|
this.propertyName = propertyName;
|
|
|
|
}
|
|
|
|
// select getter / setter
|
|
this.getValue = this.GetterByBindingType[ bindingType ];
|
|
this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
|
|
|
|
},
|
|
|
|
unbind: function () {
|
|
|
|
this.node = null;
|
|
|
|
// back to the prototype version of getValue / setValue
|
|
// note: avoiding to mutate the shape of 'this' via 'delete'
|
|
this.getValue = this._getValue_unbound;
|
|
this.setValue = this._setValue_unbound;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
//!\ DECLARE ALIAS AFTER assign prototype !
|
|
Object.assign( PropertyBinding.prototype, {
|
|
|
|
// initial state of these methods that calls 'bind'
|
|
_getValue_unbound: PropertyBinding.prototype.getValue,
|
|
_setValue_unbound: PropertyBinding.prototype.setValue,
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* A group of objects that receives a shared animation state.
|
|
*
|
|
* Usage:
|
|
*
|
|
* - Add objects you would otherwise pass as 'root' to the
|
|
* constructor or the .clipAction method of AnimationMixer.
|
|
*
|
|
* - Instead pass this object as 'root'.
|
|
*
|
|
* - You can also add and remove objects later when the mixer
|
|
* is running.
|
|
*
|
|
* Note:
|
|
*
|
|
* Objects of this class appear as one object to the mixer,
|
|
* so cache control of the individual objects must be done
|
|
* on the group.
|
|
*
|
|
* Limitation:
|
|
*
|
|
* - The animated properties must be compatible among the
|
|
* all objects in the group.
|
|
*
|
|
* - A single property can either be controlled through a
|
|
* target group or directly, but not both.
|
|
*
|
|
* @author tschw
|
|
*/
|
|
|
|
function AnimationObjectGroup( var_args ) {
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
// cached objects followed by the active ones
|
|
this._objects = Array.prototype.slice.call( arguments );
|
|
|
|
this.nCachedObjects_ = 0; // threshold
|
|
// note: read by PropertyBinding.Composite
|
|
|
|
var indices = {};
|
|
this._indicesByUUID = indices; // for bookkeeping
|
|
|
|
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
|
|
|
|
indices[ arguments[ i ].uuid ] = i;
|
|
|
|
}
|
|
|
|
this._paths = []; // inside: string
|
|
this._parsedPaths = []; // inside: { we don't care, here }
|
|
this._bindings = []; // inside: Array< PropertyBinding >
|
|
this._bindingsIndicesByPath = {}; // inside: indices in these arrays
|
|
|
|
var scope = this;
|
|
|
|
this.stats = {
|
|
|
|
objects: {
|
|
get total() { return scope._objects.length; },
|
|
get inUse() { return this.total - scope.nCachedObjects_; }
|
|
},
|
|
|
|
get bindingsPerObject() { return scope._bindings.length; }
|
|
|
|
};
|
|
|
|
}
|
|
|
|
Object.assign( AnimationObjectGroup.prototype, {
|
|
|
|
isAnimationObjectGroup: true,
|
|
|
|
add: function( var_args ) {
|
|
|
|
var objects = this._objects,
|
|
nObjects = objects.length,
|
|
nCachedObjects = this.nCachedObjects_,
|
|
indicesByUUID = this._indicesByUUID,
|
|
paths = this._paths,
|
|
parsedPaths = this._parsedPaths,
|
|
bindings = this._bindings,
|
|
nBindings = bindings.length;
|
|
|
|
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
|
|
|
|
var object = arguments[ i ],
|
|
uuid = object.uuid,
|
|
index = indicesByUUID[ uuid ],
|
|
knownObject = undefined;
|
|
|
|
if ( index === undefined ) {
|
|
|
|
// unknown object -> add it to the ACTIVE region
|
|
|
|
index = nObjects ++;
|
|
indicesByUUID[ uuid ] = index;
|
|
objects.push( object );
|
|
|
|
// accounting is done, now do the same for all bindings
|
|
|
|
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
|
|
|
|
bindings[ j ].push(
|
|
new PropertyBinding(
|
|
object, paths[ j ], parsedPaths[ j ] ) );
|
|
|
|
}
|
|
|
|
} else if ( index < nCachedObjects ) {
|
|
|
|
knownObject = objects[ index ];
|
|
|
|
// move existing object to the ACTIVE region
|
|
|
|
var firstActiveIndex = -- nCachedObjects,
|
|
lastCachedObject = objects[ firstActiveIndex ];
|
|
|
|
indicesByUUID[ lastCachedObject.uuid ] = index;
|
|
objects[ index ] = lastCachedObject;
|
|
|
|
indicesByUUID[ uuid ] = firstActiveIndex;
|
|
objects[ firstActiveIndex ] = object;
|
|
|
|
// accounting is done, now do the same for all bindings
|
|
|
|
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
|
|
|
|
var bindingsForPath = bindings[ j ],
|
|
lastCached = bindingsForPath[ firstActiveIndex ],
|
|
binding = bindingsForPath[ index ];
|
|
|
|
bindingsForPath[ index ] = lastCached;
|
|
|
|
if ( binding === undefined ) {
|
|
|
|
// since we do not bother to create new bindings
|
|
// for objects that are cached, the binding may
|
|
// or may not exist
|
|
|
|
binding = new PropertyBinding(
|
|
object, paths[ j ], parsedPaths[ j ] );
|
|
|
|
}
|
|
|
|
bindingsForPath[ firstActiveIndex ] = binding;
|
|
|
|
}
|
|
|
|
} else if ( objects[ index ] !== knownObject ) {
|
|
|
|
console.error( "Different objects with the same UUID " +
|
|
"detected. Clean the caches or recreate your " +
|
|
"infrastructure when reloading scenes..." );
|
|
|
|
} // else the object is already where we want it to be
|
|
|
|
} // for arguments
|
|
|
|
this.nCachedObjects_ = nCachedObjects;
|
|
|
|
},
|
|
|
|
remove: function( var_args ) {
|
|
|
|
var objects = this._objects,
|
|
nCachedObjects = this.nCachedObjects_,
|
|
indicesByUUID = this._indicesByUUID,
|
|
bindings = this._bindings,
|
|
nBindings = bindings.length;
|
|
|
|
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
|
|
|
|
var object = arguments[ i ],
|
|
uuid = object.uuid,
|
|
index = indicesByUUID[ uuid ];
|
|
|
|
if ( index !== undefined && index >= nCachedObjects ) {
|
|
|
|
// move existing object into the CACHED region
|
|
|
|
var lastCachedIndex = nCachedObjects ++,
|
|
firstActiveObject = objects[ lastCachedIndex ];
|
|
|
|
indicesByUUID[ firstActiveObject.uuid ] = index;
|
|
objects[ index ] = firstActiveObject;
|
|
|
|
indicesByUUID[ uuid ] = lastCachedIndex;
|
|
objects[ lastCachedIndex ] = object;
|
|
|
|
// accounting is done, now do the same for all bindings
|
|
|
|
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
|
|
|
|
var bindingsForPath = bindings[ j ],
|
|
firstActive = bindingsForPath[ lastCachedIndex ],
|
|
binding = bindingsForPath[ index ];
|
|
|
|
bindingsForPath[ index ] = firstActive;
|
|
bindingsForPath[ lastCachedIndex ] = binding;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // for arguments
|
|
|
|
this.nCachedObjects_ = nCachedObjects;
|
|
|
|
},
|
|
|
|
// remove & forget
|
|
uncache: function( var_args ) {
|
|
|
|
var objects = this._objects,
|
|
nObjects = objects.length,
|
|
nCachedObjects = this.nCachedObjects_,
|
|
indicesByUUID = this._indicesByUUID,
|
|
bindings = this._bindings,
|
|
nBindings = bindings.length;
|
|
|
|
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
|
|
|
|
var object = arguments[ i ],
|
|
uuid = object.uuid,
|
|
index = indicesByUUID[ uuid ];
|
|
|
|
if ( index !== undefined ) {
|
|
|
|
delete indicesByUUID[ uuid ];
|
|
|
|
if ( index < nCachedObjects ) {
|
|
|
|
// object is cached, shrink the CACHED region
|
|
|
|
var firstActiveIndex = -- nCachedObjects,
|
|
lastCachedObject = objects[ firstActiveIndex ],
|
|
lastIndex = -- nObjects,
|
|
lastObject = objects[ lastIndex ];
|
|
|
|
// last cached object takes this object's place
|
|
indicesByUUID[ lastCachedObject.uuid ] = index;
|
|
objects[ index ] = lastCachedObject;
|
|
|
|
// last object goes to the activated slot and pop
|
|
indicesByUUID[ lastObject.uuid ] = firstActiveIndex;
|
|
objects[ firstActiveIndex ] = lastObject;
|
|
objects.pop();
|
|
|
|
// accounting is done, now do the same for all bindings
|
|
|
|
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
|
|
|
|
var bindingsForPath = bindings[ j ],
|
|
lastCached = bindingsForPath[ firstActiveIndex ],
|
|
last = bindingsForPath[ lastIndex ];
|
|
|
|
bindingsForPath[ index ] = lastCached;
|
|
bindingsForPath[ firstActiveIndex ] = last;
|
|
bindingsForPath.pop();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// object is active, just swap with the last and pop
|
|
|
|
var lastIndex = -- nObjects,
|
|
lastObject = objects[ lastIndex ];
|
|
|
|
indicesByUUID[ lastObject.uuid ] = index;
|
|
objects[ index ] = lastObject;
|
|
objects.pop();
|
|
|
|
// accounting is done, now do the same for all bindings
|
|
|
|
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
|
|
|
|
var bindingsForPath = bindings[ j ];
|
|
|
|
bindingsForPath[ index ] = bindingsForPath[ lastIndex ];
|
|
bindingsForPath.pop();
|
|
|
|
}
|
|
|
|
} // cached or active
|
|
|
|
} // if object is known
|
|
|
|
} // for arguments
|
|
|
|
this.nCachedObjects_ = nCachedObjects;
|
|
|
|
},
|
|
|
|
// Internal interface used by befriended PropertyBinding.Composite:
|
|
|
|
subscribe_: function ( path, parsedPath ) {
|
|
|
|
// returns an array of bindings for the given path that is changed
|
|
// according to the contained objects in the group
|
|
|
|
var indicesByPath = this._bindingsIndicesByPath,
|
|
index = indicesByPath[ path ],
|
|
bindings = this._bindings;
|
|
|
|
if ( index !== undefined ) return bindings[ index ];
|
|
|
|
var paths = this._paths,
|
|
parsedPaths = this._parsedPaths,
|
|
objects = this._objects,
|
|
nObjects = objects.length,
|
|
nCachedObjects = this.nCachedObjects_,
|
|
bindingsForPath = new Array( nObjects );
|
|
|
|
index = bindings.length;
|
|
|
|
indicesByPath[ path ] = index;
|
|
|
|
paths.push( path );
|
|
parsedPaths.push( parsedPath );
|
|
bindings.push( bindingsForPath );
|
|
|
|
for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {
|
|
|
|
var object = objects[ i ];
|
|
bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );
|
|
|
|
}
|
|
|
|
return bindingsForPath;
|
|
|
|
},
|
|
|
|
unsubscribe_: function ( path ) {
|
|
|
|
// tells the group to forget about a property path and no longer
|
|
// update the array previously obtained with 'subscribe_'
|
|
|
|
var indicesByPath = this._bindingsIndicesByPath,
|
|
index = indicesByPath[ path ];
|
|
|
|
if ( index !== undefined ) {
|
|
|
|
var paths = this._paths,
|
|
parsedPaths = this._parsedPaths,
|
|
bindings = this._bindings,
|
|
lastBindingsIndex = bindings.length - 1,
|
|
lastBindings = bindings[ lastBindingsIndex ],
|
|
lastBindingsPath = path[ lastBindingsIndex ];
|
|
|
|
indicesByPath[ lastBindingsPath ] = index;
|
|
|
|
bindings[ index ] = lastBindings;
|
|
bindings.pop();
|
|
|
|
parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];
|
|
parsedPaths.pop();
|
|
|
|
paths[ index ] = paths[ lastBindingsIndex ];
|
|
paths.pop();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* Action provided by AnimationMixer for scheduling clip playback on specific
|
|
* objects.
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*
|
|
*/
|
|
|
|
function AnimationAction( mixer, clip, localRoot ) {
|
|
|
|
this._mixer = mixer;
|
|
this._clip = clip;
|
|
this._localRoot = localRoot || null;
|
|
|
|
var tracks = clip.tracks,
|
|
nTracks = tracks.length,
|
|
interpolants = new Array( nTracks );
|
|
|
|
var interpolantSettings = {
|
|
endingStart: ZeroCurvatureEnding,
|
|
endingEnd: ZeroCurvatureEnding
|
|
};
|
|
|
|
for ( var i = 0; i !== nTracks; ++ i ) {
|
|
|
|
var interpolant = tracks[ i ].createInterpolant( null );
|
|
interpolants[ i ] = interpolant;
|
|
interpolant.settings = interpolantSettings;
|
|
|
|
}
|
|
|
|
this._interpolantSettings = interpolantSettings;
|
|
|
|
this._interpolants = interpolants; // bound by the mixer
|
|
|
|
// inside: PropertyMixer (managed by the mixer)
|
|
this._propertyBindings = new Array( nTracks );
|
|
|
|
this._cacheIndex = null; // for the memory manager
|
|
this._byClipCacheIndex = null; // for the memory manager
|
|
|
|
this._timeScaleInterpolant = null;
|
|
this._weightInterpolant = null;
|
|
|
|
this.loop = LoopRepeat;
|
|
this._loopCount = -1;
|
|
|
|
// global mixer time when the action is to be started
|
|
// it's set back to 'null' upon start of the action
|
|
this._startTime = null;
|
|
|
|
// scaled local time of the action
|
|
// gets clamped or wrapped to 0..clip.duration according to loop
|
|
this.time = 0;
|
|
|
|
this.timeScale = 1;
|
|
this._effectiveTimeScale = 1;
|
|
|
|
this.weight = 1;
|
|
this._effectiveWeight = 1;
|
|
|
|
this.repetitions = Infinity; // no. of repetitions when looping
|
|
|
|
this.paused = false; // true -> zero effective time scale
|
|
this.enabled = true; // false -> zero effective weight
|
|
|
|
this.clampWhenFinished = false; // keep feeding the last frame?
|
|
|
|
this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate
|
|
this.zeroSlopeAtEnd = true; // clips for start, loop and end
|
|
|
|
}
|
|
|
|
Object.assign( AnimationAction.prototype, {
|
|
|
|
// State & Scheduling
|
|
|
|
play: function() {
|
|
|
|
this._mixer._activateAction( this );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
stop: function() {
|
|
|
|
this._mixer._deactivateAction( this );
|
|
|
|
return this.reset();
|
|
|
|
},
|
|
|
|
reset: function() {
|
|
|
|
this.paused = false;
|
|
this.enabled = true;
|
|
|
|
this.time = 0; // restart clip
|
|
this._loopCount = -1; // forget previous loops
|
|
this._startTime = null; // forget scheduling
|
|
|
|
return this.stopFading().stopWarping();
|
|
|
|
},
|
|
|
|
isRunning: function() {
|
|
|
|
return this.enabled && ! this.paused && this.timeScale !== 0 &&
|
|
this._startTime === null && this._mixer._isActiveAction( this );
|
|
|
|
},
|
|
|
|
// return true when play has been called
|
|
isScheduled: function() {
|
|
|
|
return this._mixer._isActiveAction( this );
|
|
|
|
},
|
|
|
|
startAt: function( time ) {
|
|
|
|
this._startTime = time;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setLoop: function( mode, repetitions ) {
|
|
|
|
this.loop = mode;
|
|
this.repetitions = repetitions;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// Weight
|
|
|
|
// set the weight stopping any scheduled fading
|
|
// although .enabled = false yields an effective weight of zero, this
|
|
// method does *not* change .enabled, because it would be confusing
|
|
setEffectiveWeight: function( weight ) {
|
|
|
|
this.weight = weight;
|
|
|
|
// note: same logic as when updated at runtime
|
|
this._effectiveWeight = this.enabled ? weight : 0;
|
|
|
|
return this.stopFading();
|
|
|
|
},
|
|
|
|
// return the weight considering fading and .enabled
|
|
getEffectiveWeight: function() {
|
|
|
|
return this._effectiveWeight;
|
|
|
|
},
|
|
|
|
fadeIn: function( duration ) {
|
|
|
|
return this._scheduleFading( duration, 0, 1 );
|
|
|
|
},
|
|
|
|
fadeOut: function( duration ) {
|
|
|
|
return this._scheduleFading( duration, 1, 0 );
|
|
|
|
},
|
|
|
|
crossFadeFrom: function( fadeOutAction, duration, warp ) {
|
|
|
|
fadeOutAction.fadeOut( duration );
|
|
this.fadeIn( duration );
|
|
|
|
if( warp ) {
|
|
|
|
var fadeInDuration = this._clip.duration,
|
|
fadeOutDuration = fadeOutAction._clip.duration,
|
|
|
|
startEndRatio = fadeOutDuration / fadeInDuration,
|
|
endStartRatio = fadeInDuration / fadeOutDuration;
|
|
|
|
fadeOutAction.warp( 1.0, startEndRatio, duration );
|
|
this.warp( endStartRatio, 1.0, duration );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
crossFadeTo: function( fadeInAction, duration, warp ) {
|
|
|
|
return fadeInAction.crossFadeFrom( this, duration, warp );
|
|
|
|
},
|
|
|
|
stopFading: function() {
|
|
|
|
var weightInterpolant = this._weightInterpolant;
|
|
|
|
if ( weightInterpolant !== null ) {
|
|
|
|
this._weightInterpolant = null;
|
|
this._mixer._takeBackControlInterpolant( weightInterpolant );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// Time Scale Control
|
|
|
|
// set the time scale stopping any scheduled warping
|
|
// although .paused = true yields an effective time scale of zero, this
|
|
// method does *not* change .paused, because it would be confusing
|
|
setEffectiveTimeScale: function( timeScale ) {
|
|
|
|
this.timeScale = timeScale;
|
|
this._effectiveTimeScale = this.paused ? 0 :timeScale;
|
|
|
|
return this.stopWarping();
|
|
|
|
},
|
|
|
|
// return the time scale considering warping and .paused
|
|
getEffectiveTimeScale: function() {
|
|
|
|
return this._effectiveTimeScale;
|
|
|
|
},
|
|
|
|
setDuration: function( duration ) {
|
|
|
|
this.timeScale = this._clip.duration / duration;
|
|
|
|
return this.stopWarping();
|
|
|
|
},
|
|
|
|
syncWith: function( action ) {
|
|
|
|
this.time = action.time;
|
|
this.timeScale = action.timeScale;
|
|
|
|
return this.stopWarping();
|
|
|
|
},
|
|
|
|
halt: function( duration ) {
|
|
|
|
return this.warp( this._effectiveTimeScale, 0, duration );
|
|
|
|
},
|
|
|
|
warp: function( startTimeScale, endTimeScale, duration ) {
|
|
|
|
var mixer = this._mixer, now = mixer.time,
|
|
interpolant = this._timeScaleInterpolant,
|
|
|
|
timeScale = this.timeScale;
|
|
|
|
if ( interpolant === null ) {
|
|
|
|
interpolant = mixer._lendControlInterpolant();
|
|
this._timeScaleInterpolant = interpolant;
|
|
|
|
}
|
|
|
|
var times = interpolant.parameterPositions,
|
|
values = interpolant.sampleValues;
|
|
|
|
times[ 0 ] = now;
|
|
times[ 1 ] = now + duration;
|
|
|
|
values[ 0 ] = startTimeScale / timeScale;
|
|
values[ 1 ] = endTimeScale / timeScale;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
stopWarping: function() {
|
|
|
|
var timeScaleInterpolant = this._timeScaleInterpolant;
|
|
|
|
if ( timeScaleInterpolant !== null ) {
|
|
|
|
this._timeScaleInterpolant = null;
|
|
this._mixer._takeBackControlInterpolant( timeScaleInterpolant );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// Object Accessors
|
|
|
|
getMixer: function() {
|
|
|
|
return this._mixer;
|
|
|
|
},
|
|
|
|
getClip: function() {
|
|
|
|
return this._clip;
|
|
|
|
},
|
|
|
|
getRoot: function() {
|
|
|
|
return this._localRoot || this._mixer._root;
|
|
|
|
},
|
|
|
|
// Interna
|
|
|
|
_update: function( time, deltaTime, timeDirection, accuIndex ) {
|
|
|
|
// called by the mixer
|
|
|
|
if ( ! this.enabled ) {
|
|
|
|
// call ._updateWeight() to update ._effectiveWeight
|
|
|
|
this._updateWeight( time );
|
|
return;
|
|
|
|
}
|
|
|
|
var startTime = this._startTime;
|
|
|
|
if ( startTime !== null ) {
|
|
|
|
// check for scheduled start of action
|
|
|
|
var timeRunning = ( time - startTime ) * timeDirection;
|
|
if ( timeRunning < 0 || timeDirection === 0 ) {
|
|
|
|
return; // yet to come / don't decide when delta = 0
|
|
|
|
}
|
|
|
|
// start
|
|
|
|
this._startTime = null; // unschedule
|
|
deltaTime = timeDirection * timeRunning;
|
|
|
|
}
|
|
|
|
// apply time scale and advance time
|
|
|
|
deltaTime *= this._updateTimeScale( time );
|
|
var clipTime = this._updateTime( deltaTime );
|
|
|
|
// note: _updateTime may disable the action resulting in
|
|
// an effective weight of 0
|
|
|
|
var weight = this._updateWeight( time );
|
|
|
|
if ( weight > 0 ) {
|
|
|
|
var interpolants = this._interpolants;
|
|
var propertyMixers = this._propertyBindings;
|
|
|
|
for ( var j = 0, m = interpolants.length; j !== m; ++ j ) {
|
|
|
|
interpolants[ j ].evaluate( clipTime );
|
|
propertyMixers[ j ].accumulate( accuIndex, weight );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_updateWeight: function( time ) {
|
|
|
|
var weight = 0;
|
|
|
|
if ( this.enabled ) {
|
|
|
|
weight = this.weight;
|
|
var interpolant = this._weightInterpolant;
|
|
|
|
if ( interpolant !== null ) {
|
|
|
|
var interpolantValue = interpolant.evaluate( time )[ 0 ];
|
|
|
|
weight *= interpolantValue;
|
|
|
|
if ( time > interpolant.parameterPositions[ 1 ] ) {
|
|
|
|
this.stopFading();
|
|
|
|
if ( interpolantValue === 0 ) {
|
|
|
|
// faded out, disable
|
|
this.enabled = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this._effectiveWeight = weight;
|
|
return weight;
|
|
|
|
},
|
|
|
|
_updateTimeScale: function( time ) {
|
|
|
|
var timeScale = 0;
|
|
|
|
if ( ! this.paused ) {
|
|
|
|
timeScale = this.timeScale;
|
|
|
|
var interpolant = this._timeScaleInterpolant;
|
|
|
|
if ( interpolant !== null ) {
|
|
|
|
var interpolantValue = interpolant.evaluate( time )[ 0 ];
|
|
|
|
timeScale *= interpolantValue;
|
|
|
|
if ( time > interpolant.parameterPositions[ 1 ] ) {
|
|
|
|
this.stopWarping();
|
|
|
|
if ( timeScale === 0 ) {
|
|
|
|
// motion has halted, pause
|
|
this.paused = true;
|
|
|
|
} else {
|
|
|
|
// warp done - apply final time scale
|
|
this.timeScale = timeScale;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this._effectiveTimeScale = timeScale;
|
|
return timeScale;
|
|
|
|
},
|
|
|
|
_updateTime: function( deltaTime ) {
|
|
|
|
var time = this.time + deltaTime;
|
|
|
|
if ( deltaTime === 0 ) return time;
|
|
|
|
var duration = this._clip.duration,
|
|
|
|
loop = this.loop,
|
|
loopCount = this._loopCount;
|
|
|
|
if ( loop === LoopOnce ) {
|
|
|
|
if ( loopCount === -1 ) {
|
|
// just started
|
|
|
|
this._loopCount = 0;
|
|
this._setEndings( true, true, false );
|
|
|
|
}
|
|
|
|
handle_stop: {
|
|
|
|
if ( time >= duration ) {
|
|
|
|
time = duration;
|
|
|
|
} else if ( time < 0 ) {
|
|
|
|
time = 0;
|
|
|
|
} else break handle_stop;
|
|
|
|
if ( this.clampWhenFinished ) this.paused = true;
|
|
else this.enabled = false;
|
|
|
|
this._mixer.dispatchEvent( {
|
|
type: 'finished', action: this,
|
|
direction: deltaTime < 0 ? -1 : 1
|
|
} );
|
|
|
|
}
|
|
|
|
} else { // repetitive Repeat or PingPong
|
|
|
|
var pingPong = ( loop === LoopPingPong );
|
|
|
|
if ( loopCount === -1 ) {
|
|
// just started
|
|
|
|
if ( deltaTime >= 0 ) {
|
|
|
|
loopCount = 0;
|
|
|
|
this._setEndings(
|
|
true, this.repetitions === 0, pingPong );
|
|
|
|
} else {
|
|
|
|
// when looping in reverse direction, the initial
|
|
// transition through zero counts as a repetition,
|
|
// so leave loopCount at -1
|
|
|
|
this._setEndings(
|
|
this.repetitions === 0, true, pingPong );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( time >= duration || time < 0 ) {
|
|
// wrap around
|
|
|
|
var loopDelta = Math.floor( time / duration ); // signed
|
|
time -= duration * loopDelta;
|
|
|
|
loopCount += Math.abs( loopDelta );
|
|
|
|
var pending = this.repetitions - loopCount;
|
|
|
|
if ( pending < 0 ) {
|
|
// have to stop (switch state, clamp time, fire event)
|
|
|
|
if ( this.clampWhenFinished ) this.paused = true;
|
|
else this.enabled = false;
|
|
|
|
time = deltaTime > 0 ? duration : 0;
|
|
|
|
this._mixer.dispatchEvent( {
|
|
type: 'finished', action: this,
|
|
direction: deltaTime > 0 ? 1 : -1
|
|
} );
|
|
|
|
} else {
|
|
// keep running
|
|
|
|
if ( pending === 0 ) {
|
|
// entering the last round
|
|
|
|
var atStart = deltaTime < 0;
|
|
this._setEndings( atStart, ! atStart, pingPong );
|
|
|
|
} else {
|
|
|
|
this._setEndings( false, false, pingPong );
|
|
|
|
}
|
|
|
|
this._loopCount = loopCount;
|
|
|
|
this._mixer.dispatchEvent( {
|
|
type: 'loop', action: this, loopDelta: loopDelta
|
|
} );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( pingPong && ( loopCount & 1 ) === 1 ) {
|
|
// invert time for the "pong round"
|
|
|
|
this.time = time;
|
|
return duration - time;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.time = time;
|
|
return time;
|
|
|
|
},
|
|
|
|
_setEndings: function( atStart, atEnd, pingPong ) {
|
|
|
|
var settings = this._interpolantSettings;
|
|
|
|
if ( pingPong ) {
|
|
|
|
settings.endingStart = ZeroSlopeEnding;
|
|
settings.endingEnd = ZeroSlopeEnding;
|
|
|
|
} else {
|
|
|
|
// assuming for LoopOnce atStart == atEnd == true
|
|
|
|
if ( atStart ) {
|
|
|
|
settings.endingStart = this.zeroSlopeAtStart ?
|
|
ZeroSlopeEnding : ZeroCurvatureEnding;
|
|
|
|
} else {
|
|
|
|
settings.endingStart = WrapAroundEnding;
|
|
|
|
}
|
|
|
|
if ( atEnd ) {
|
|
|
|
settings.endingEnd = this.zeroSlopeAtEnd ?
|
|
ZeroSlopeEnding : ZeroCurvatureEnding;
|
|
|
|
} else {
|
|
|
|
settings.endingEnd = WrapAroundEnding;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_scheduleFading: function( duration, weightNow, weightThen ) {
|
|
|
|
var mixer = this._mixer, now = mixer.time,
|
|
interpolant = this._weightInterpolant;
|
|
|
|
if ( interpolant === null ) {
|
|
|
|
interpolant = mixer._lendControlInterpolant();
|
|
this._weightInterpolant = interpolant;
|
|
|
|
}
|
|
|
|
var times = interpolant.parameterPositions,
|
|
values = interpolant.sampleValues;
|
|
|
|
times[ 0 ] = now; values[ 0 ] = weightNow;
|
|
times[ 1 ] = now + duration; values[ 1 ] = weightThen;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
*
|
|
* Player for AnimationClips.
|
|
*
|
|
*
|
|
* @author Ben Houston / http://clara.io/
|
|
* @author David Sarno / http://lighthaus.us/
|
|
* @author tschw
|
|
*/
|
|
|
|
function AnimationMixer( root ) {
|
|
|
|
this._root = root;
|
|
this._initMemoryManager();
|
|
this._accuIndex = 0;
|
|
|
|
this.time = 0;
|
|
|
|
this.timeScale = 1.0;
|
|
|
|
}
|
|
|
|
Object.assign( AnimationMixer.prototype, EventDispatcher.prototype, {
|
|
|
|
_bindAction: function ( action, prototypeAction ) {
|
|
|
|
var root = action._localRoot || this._root,
|
|
tracks = action._clip.tracks,
|
|
nTracks = tracks.length,
|
|
bindings = action._propertyBindings,
|
|
interpolants = action._interpolants,
|
|
rootUuid = root.uuid,
|
|
bindingsByRoot = this._bindingsByRootAndName,
|
|
bindingsByName = bindingsByRoot[ rootUuid ];
|
|
|
|
if ( bindingsByName === undefined ) {
|
|
|
|
bindingsByName = {};
|
|
bindingsByRoot[ rootUuid ] = bindingsByName;
|
|
|
|
}
|
|
|
|
for ( var i = 0; i !== nTracks; ++ i ) {
|
|
|
|
var track = tracks[ i ],
|
|
trackName = track.name,
|
|
binding = bindingsByName[ trackName ];
|
|
|
|
if ( binding !== undefined ) {
|
|
|
|
bindings[ i ] = binding;
|
|
|
|
} else {
|
|
|
|
binding = bindings[ i ];
|
|
|
|
if ( binding !== undefined ) {
|
|
|
|
// existing binding, make sure the cache knows
|
|
|
|
if ( binding._cacheIndex === null ) {
|
|
|
|
++ binding.referenceCount;
|
|
this._addInactiveBinding( binding, rootUuid, trackName );
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
var path = prototypeAction && prototypeAction.
|
|
_propertyBindings[ i ].binding.parsedPath;
|
|
|
|
binding = new PropertyMixer(
|
|
PropertyBinding.create( root, trackName, path ),
|
|
track.ValueTypeName, track.getValueSize() );
|
|
|
|
++ binding.referenceCount;
|
|
this._addInactiveBinding( binding, rootUuid, trackName );
|
|
|
|
bindings[ i ] = binding;
|
|
|
|
}
|
|
|
|
interpolants[ i ].resultBuffer = binding.buffer;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_activateAction: function ( action ) {
|
|
|
|
if ( ! this._isActiveAction( action ) ) {
|
|
|
|
if ( action._cacheIndex === null ) {
|
|
|
|
// this action has been forgotten by the cache, but the user
|
|
// appears to be still using it -> rebind
|
|
|
|
var rootUuid = ( action._localRoot || this._root ).uuid,
|
|
clipUuid = action._clip.uuid,
|
|
actionsForClip = this._actionsByClip[ clipUuid ];
|
|
|
|
this._bindAction( action,
|
|
actionsForClip && actionsForClip.knownActions[ 0 ] );
|
|
|
|
this._addInactiveAction( action, clipUuid, rootUuid );
|
|
|
|
}
|
|
|
|
var bindings = action._propertyBindings;
|
|
|
|
// increment reference counts / sort out state
|
|
for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
|
|
|
|
var binding = bindings[ i ];
|
|
|
|
if ( binding.useCount ++ === 0 ) {
|
|
|
|
this._lendBinding( binding );
|
|
binding.saveOriginalState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this._lendAction( action );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_deactivateAction: function ( action ) {
|
|
|
|
if ( this._isActiveAction( action ) ) {
|
|
|
|
var bindings = action._propertyBindings;
|
|
|
|
// decrement reference counts / sort out state
|
|
for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
|
|
|
|
var binding = bindings[ i ];
|
|
|
|
if ( -- binding.useCount === 0 ) {
|
|
|
|
binding.restoreOriginalState();
|
|
this._takeBackBinding( binding );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this._takeBackAction( action );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// Memory manager
|
|
|
|
_initMemoryManager: function () {
|
|
|
|
this._actions = []; // 'nActiveActions' followed by inactive ones
|
|
this._nActiveActions = 0;
|
|
|
|
this._actionsByClip = {};
|
|
// inside:
|
|
// {
|
|
// knownActions: Array< AnimationAction > - used as prototypes
|
|
// actionByRoot: AnimationAction - lookup
|
|
// }
|
|
|
|
|
|
this._bindings = []; // 'nActiveBindings' followed by inactive ones
|
|
this._nActiveBindings = 0;
|
|
|
|
this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >
|
|
|
|
|
|
this._controlInterpolants = []; // same game as above
|
|
this._nActiveControlInterpolants = 0;
|
|
|
|
var scope = this;
|
|
|
|
this.stats = {
|
|
|
|
actions: {
|
|
get total() { return scope._actions.length; },
|
|
get inUse() { return scope._nActiveActions; }
|
|
},
|
|
bindings: {
|
|
get total() { return scope._bindings.length; },
|
|
get inUse() { return scope._nActiveBindings; }
|
|
},
|
|
controlInterpolants: {
|
|
get total() { return scope._controlInterpolants.length; },
|
|
get inUse() { return scope._nActiveControlInterpolants; }
|
|
}
|
|
|
|
};
|
|
|
|
},
|
|
|
|
// Memory management for AnimationAction objects
|
|
|
|
_isActiveAction: function ( action ) {
|
|
|
|
var index = action._cacheIndex;
|
|
return index !== null && index < this._nActiveActions;
|
|
|
|
},
|
|
|
|
_addInactiveAction: function ( action, clipUuid, rootUuid ) {
|
|
|
|
var actions = this._actions,
|
|
actionsByClip = this._actionsByClip,
|
|
actionsForClip = actionsByClip[ clipUuid ];
|
|
|
|
if ( actionsForClip === undefined ) {
|
|
|
|
actionsForClip = {
|
|
|
|
knownActions: [ action ],
|
|
actionByRoot: {}
|
|
|
|
};
|
|
|
|
action._byClipCacheIndex = 0;
|
|
|
|
actionsByClip[ clipUuid ] = actionsForClip;
|
|
|
|
} else {
|
|
|
|
var knownActions = actionsForClip.knownActions;
|
|
|
|
action._byClipCacheIndex = knownActions.length;
|
|
knownActions.push( action );
|
|
|
|
}
|
|
|
|
action._cacheIndex = actions.length;
|
|
actions.push( action );
|
|
|
|
actionsForClip.actionByRoot[ rootUuid ] = action;
|
|
|
|
},
|
|
|
|
_removeInactiveAction: function ( action ) {
|
|
|
|
var actions = this._actions,
|
|
lastInactiveAction = actions[ actions.length - 1 ],
|
|
cacheIndex = action._cacheIndex;
|
|
|
|
lastInactiveAction._cacheIndex = cacheIndex;
|
|
actions[ cacheIndex ] = lastInactiveAction;
|
|
actions.pop();
|
|
|
|
action._cacheIndex = null;
|
|
|
|
|
|
var clipUuid = action._clip.uuid,
|
|
actionsByClip = this._actionsByClip,
|
|
actionsForClip = actionsByClip[ clipUuid ],
|
|
knownActionsForClip = actionsForClip.knownActions,
|
|
|
|
lastKnownAction =
|
|
knownActionsForClip[ knownActionsForClip.length - 1 ],
|
|
|
|
byClipCacheIndex = action._byClipCacheIndex;
|
|
|
|
lastKnownAction._byClipCacheIndex = byClipCacheIndex;
|
|
knownActionsForClip[ byClipCacheIndex ] = lastKnownAction;
|
|
knownActionsForClip.pop();
|
|
|
|
action._byClipCacheIndex = null;
|
|
|
|
|
|
var actionByRoot = actionsForClip.actionByRoot,
|
|
rootUuid = ( action._localRoot || this._root ).uuid;
|
|
|
|
delete actionByRoot[ rootUuid ];
|
|
|
|
if ( knownActionsForClip.length === 0 ) {
|
|
|
|
delete actionsByClip[ clipUuid ];
|
|
|
|
}
|
|
|
|
this._removeInactiveBindingsForAction( action );
|
|
|
|
},
|
|
|
|
_removeInactiveBindingsForAction: function ( action ) {
|
|
|
|
var bindings = action._propertyBindings;
|
|
for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
|
|
|
|
var binding = bindings[ i ];
|
|
|
|
if ( -- binding.referenceCount === 0 ) {
|
|
|
|
this._removeInactiveBinding( binding );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_lendAction: function ( action ) {
|
|
|
|
// [ active actions | inactive actions ]
|
|
// [ active actions >| inactive actions ]
|
|
// s a
|
|
// <-swap->
|
|
// a s
|
|
|
|
var actions = this._actions,
|
|
prevIndex = action._cacheIndex,
|
|
|
|
lastActiveIndex = this._nActiveActions ++,
|
|
|
|
firstInactiveAction = actions[ lastActiveIndex ];
|
|
|
|
action._cacheIndex = lastActiveIndex;
|
|
actions[ lastActiveIndex ] = action;
|
|
|
|
firstInactiveAction._cacheIndex = prevIndex;
|
|
actions[ prevIndex ] = firstInactiveAction;
|
|
|
|
},
|
|
|
|
_takeBackAction: function ( action ) {
|
|
|
|
// [ active actions | inactive actions ]
|
|
// [ active actions |< inactive actions ]
|
|
// a s
|
|
// <-swap->
|
|
// s a
|
|
|
|
var actions = this._actions,
|
|
prevIndex = action._cacheIndex,
|
|
|
|
firstInactiveIndex = -- this._nActiveActions,
|
|
|
|
lastActiveAction = actions[ firstInactiveIndex ];
|
|
|
|
action._cacheIndex = firstInactiveIndex;
|
|
actions[ firstInactiveIndex ] = action;
|
|
|
|
lastActiveAction._cacheIndex = prevIndex;
|
|
actions[ prevIndex ] = lastActiveAction;
|
|
|
|
},
|
|
|
|
// Memory management for PropertyMixer objects
|
|
|
|
_addInactiveBinding: function ( binding, rootUuid, trackName ) {
|
|
|
|
var bindingsByRoot = this._bindingsByRootAndName,
|
|
bindingByName = bindingsByRoot[ rootUuid ],
|
|
|
|
bindings = this._bindings;
|
|
|
|
if ( bindingByName === undefined ) {
|
|
|
|
bindingByName = {};
|
|
bindingsByRoot[ rootUuid ] = bindingByName;
|
|
|
|
}
|
|
|
|
bindingByName[ trackName ] = binding;
|
|
|
|
binding._cacheIndex = bindings.length;
|
|
bindings.push( binding );
|
|
|
|
},
|
|
|
|
_removeInactiveBinding: function ( binding ) {
|
|
|
|
var bindings = this._bindings,
|
|
propBinding = binding.binding,
|
|
rootUuid = propBinding.rootNode.uuid,
|
|
trackName = propBinding.path,
|
|
bindingsByRoot = this._bindingsByRootAndName,
|
|
bindingByName = bindingsByRoot[ rootUuid ],
|
|
|
|
lastInactiveBinding = bindings[ bindings.length - 1 ],
|
|
cacheIndex = binding._cacheIndex;
|
|
|
|
lastInactiveBinding._cacheIndex = cacheIndex;
|
|
bindings[ cacheIndex ] = lastInactiveBinding;
|
|
bindings.pop();
|
|
|
|
delete bindingByName[ trackName ];
|
|
|
|
remove_empty_map: {
|
|
|
|
for ( var _ in bindingByName ) break remove_empty_map;
|
|
|
|
delete bindingsByRoot[ rootUuid ];
|
|
|
|
}
|
|
|
|
},
|
|
|
|
_lendBinding: function ( binding ) {
|
|
|
|
var bindings = this._bindings,
|
|
prevIndex = binding._cacheIndex,
|
|
|
|
lastActiveIndex = this._nActiveBindings ++,
|
|
|
|
firstInactiveBinding = bindings[ lastActiveIndex ];
|
|
|
|
binding._cacheIndex = lastActiveIndex;
|
|
bindings[ lastActiveIndex ] = binding;
|
|
|
|
firstInactiveBinding._cacheIndex = prevIndex;
|
|
bindings[ prevIndex ] = firstInactiveBinding;
|
|
|
|
},
|
|
|
|
_takeBackBinding: function ( binding ) {
|
|
|
|
var bindings = this._bindings,
|
|
prevIndex = binding._cacheIndex,
|
|
|
|
firstInactiveIndex = -- this._nActiveBindings,
|
|
|
|
lastActiveBinding = bindings[ firstInactiveIndex ];
|
|
|
|
binding._cacheIndex = firstInactiveIndex;
|
|
bindings[ firstInactiveIndex ] = binding;
|
|
|
|
lastActiveBinding._cacheIndex = prevIndex;
|
|
bindings[ prevIndex ] = lastActiveBinding;
|
|
|
|
},
|
|
|
|
|
|
// Memory management of Interpolants for weight and time scale
|
|
|
|
_lendControlInterpolant: function () {
|
|
|
|
var interpolants = this._controlInterpolants,
|
|
lastActiveIndex = this._nActiveControlInterpolants ++,
|
|
interpolant = interpolants[ lastActiveIndex ];
|
|
|
|
if ( interpolant === undefined ) {
|
|
|
|
interpolant = new LinearInterpolant(
|
|
new Float32Array( 2 ), new Float32Array( 2 ),
|
|
1, this._controlInterpolantsResultBuffer );
|
|
|
|
interpolant.__cacheIndex = lastActiveIndex;
|
|
interpolants[ lastActiveIndex ] = interpolant;
|
|
|
|
}
|
|
|
|
return interpolant;
|
|
|
|
},
|
|
|
|
_takeBackControlInterpolant: function ( interpolant ) {
|
|
|
|
var interpolants = this._controlInterpolants,
|
|
prevIndex = interpolant.__cacheIndex,
|
|
|
|
firstInactiveIndex = -- this._nActiveControlInterpolants,
|
|
|
|
lastActiveInterpolant = interpolants[ firstInactiveIndex ];
|
|
|
|
interpolant.__cacheIndex = firstInactiveIndex;
|
|
interpolants[ firstInactiveIndex ] = interpolant;
|
|
|
|
lastActiveInterpolant.__cacheIndex = prevIndex;
|
|
interpolants[ prevIndex ] = lastActiveInterpolant;
|
|
|
|
},
|
|
|
|
_controlInterpolantsResultBuffer: new Float32Array( 1 ),
|
|
|
|
// return an action for a clip optionally using a custom root target
|
|
// object (this method allocates a lot of dynamic memory in case a
|
|
// previously unknown clip/root combination is specified)
|
|
clipAction: function ( clip, optionalRoot ) {
|
|
|
|
var root = optionalRoot || this._root,
|
|
rootUuid = root.uuid,
|
|
|
|
clipObject = typeof clip === 'string' ?
|
|
AnimationClip.findByName( root, clip ) : clip,
|
|
|
|
clipUuid = clipObject !== null ? clipObject.uuid : clip,
|
|
|
|
actionsForClip = this._actionsByClip[ clipUuid ],
|
|
prototypeAction = null;
|
|
|
|
if ( actionsForClip !== undefined ) {
|
|
|
|
var existingAction =
|
|
actionsForClip.actionByRoot[ rootUuid ];
|
|
|
|
if ( existingAction !== undefined ) {
|
|
|
|
return existingAction;
|
|
|
|
}
|
|
|
|
// we know the clip, so we don't have to parse all
|
|
// the bindings again but can just copy
|
|
prototypeAction = actionsForClip.knownActions[ 0 ];
|
|
|
|
// also, take the clip from the prototype action
|
|
if ( clipObject === null )
|
|
clipObject = prototypeAction._clip;
|
|
|
|
}
|
|
|
|
// clip must be known when specified via string
|
|
if ( clipObject === null ) return null;
|
|
|
|
// allocate all resources required to run it
|
|
var newAction = new AnimationAction( this, clipObject, optionalRoot );
|
|
|
|
this._bindAction( newAction, prototypeAction );
|
|
|
|
// and make the action known to the memory manager
|
|
this._addInactiveAction( newAction, clipUuid, rootUuid );
|
|
|
|
return newAction;
|
|
|
|
},
|
|
|
|
// get an existing action
|
|
existingAction: function ( clip, optionalRoot ) {
|
|
|
|
var root = optionalRoot || this._root,
|
|
rootUuid = root.uuid,
|
|
|
|
clipObject = typeof clip === 'string' ?
|
|
AnimationClip.findByName( root, clip ) : clip,
|
|
|
|
clipUuid = clipObject ? clipObject.uuid : clip,
|
|
|
|
actionsForClip = this._actionsByClip[ clipUuid ];
|
|
|
|
if ( actionsForClip !== undefined ) {
|
|
|
|
return actionsForClip.actionByRoot[ rootUuid ] || null;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
// deactivates all previously scheduled actions
|
|
stopAllAction: function () {
|
|
|
|
var actions = this._actions,
|
|
nActions = this._nActiveActions,
|
|
bindings = this._bindings,
|
|
nBindings = this._nActiveBindings;
|
|
|
|
this._nActiveActions = 0;
|
|
this._nActiveBindings = 0;
|
|
|
|
for ( var i = 0; i !== nActions; ++ i ) {
|
|
|
|
actions[ i ].reset();
|
|
|
|
}
|
|
|
|
for ( var i = 0; i !== nBindings; ++ i ) {
|
|
|
|
bindings[ i ].useCount = 0;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// advance the time and update apply the animation
|
|
update: function ( deltaTime ) {
|
|
|
|
deltaTime *= this.timeScale;
|
|
|
|
var actions = this._actions,
|
|
nActions = this._nActiveActions,
|
|
|
|
time = this.time += deltaTime,
|
|
timeDirection = Math.sign( deltaTime ),
|
|
|
|
accuIndex = this._accuIndex ^= 1;
|
|
|
|
// run active actions
|
|
|
|
for ( var i = 0; i !== nActions; ++ i ) {
|
|
|
|
var action = actions[ i ];
|
|
|
|
action._update( time, deltaTime, timeDirection, accuIndex );
|
|
|
|
}
|
|
|
|
// update scene graph
|
|
|
|
var bindings = this._bindings,
|
|
nBindings = this._nActiveBindings;
|
|
|
|
for ( var i = 0; i !== nBindings; ++ i ) {
|
|
|
|
bindings[ i ].apply( accuIndex );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// return this mixer's root target object
|
|
getRoot: function () {
|
|
|
|
return this._root;
|
|
|
|
},
|
|
|
|
// free all resources specific to a particular clip
|
|
uncacheClip: function ( clip ) {
|
|
|
|
var actions = this._actions,
|
|
clipUuid = clip.uuid,
|
|
actionsByClip = this._actionsByClip,
|
|
actionsForClip = actionsByClip[ clipUuid ];
|
|
|
|
if ( actionsForClip !== undefined ) {
|
|
|
|
// note: just calling _removeInactiveAction would mess up the
|
|
// iteration state and also require updating the state we can
|
|
// just throw away
|
|
|
|
var actionsToRemove = actionsForClip.knownActions;
|
|
|
|
for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {
|
|
|
|
var action = actionsToRemove[ i ];
|
|
|
|
this._deactivateAction( action );
|
|
|
|
var cacheIndex = action._cacheIndex,
|
|
lastInactiveAction = actions[ actions.length - 1 ];
|
|
|
|
action._cacheIndex = null;
|
|
action._byClipCacheIndex = null;
|
|
|
|
lastInactiveAction._cacheIndex = cacheIndex;
|
|
actions[ cacheIndex ] = lastInactiveAction;
|
|
actions.pop();
|
|
|
|
this._removeInactiveBindingsForAction( action );
|
|
|
|
}
|
|
|
|
delete actionsByClip[ clipUuid ];
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// free all resources specific to a particular root target object
|
|
uncacheRoot: function ( root ) {
|
|
|
|
var rootUuid = root.uuid,
|
|
actionsByClip = this._actionsByClip;
|
|
|
|
for ( var clipUuid in actionsByClip ) {
|
|
|
|
var actionByRoot = actionsByClip[ clipUuid ].actionByRoot,
|
|
action = actionByRoot[ rootUuid ];
|
|
|
|
if ( action !== undefined ) {
|
|
|
|
this._deactivateAction( action );
|
|
this._removeInactiveAction( action );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var bindingsByRoot = this._bindingsByRootAndName,
|
|
bindingByName = bindingsByRoot[ rootUuid ];
|
|
|
|
if ( bindingByName !== undefined ) {
|
|
|
|
for ( var trackName in bindingByName ) {
|
|
|
|
var binding = bindingByName[ trackName ];
|
|
binding.restoreOriginalState();
|
|
this._removeInactiveBinding( binding );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
// remove a targeted clip from the cache
|
|
uncacheAction: function ( clip, optionalRoot ) {
|
|
|
|
var action = this.existingAction( clip, optionalRoot );
|
|
|
|
if ( action !== null ) {
|
|
|
|
this._deactivateAction( action );
|
|
this._removeInactiveAction( action );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function Uniform( value ) {
|
|
|
|
if ( typeof value === 'string' ) {
|
|
|
|
console.warn( 'THREE.Uniform: Type parameter is no longer needed.' );
|
|
value = arguments[ 1 ];
|
|
|
|
}
|
|
|
|
this.value = value;
|
|
|
|
}
|
|
|
|
Uniform.prototype.clone = function () {
|
|
|
|
return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );
|
|
|
|
};
|
|
|
|
/**
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
*/
|
|
|
|
function InstancedBufferGeometry() {
|
|
|
|
BufferGeometry.call( this );
|
|
|
|
this.type = 'InstancedBufferGeometry';
|
|
this.maxInstancedCount = undefined;
|
|
|
|
}
|
|
|
|
InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {
|
|
|
|
constructor: InstancedBufferGeometry,
|
|
|
|
isInstancedBufferGeometry: true,
|
|
|
|
addGroup: function ( start, count, materialIndex ) {
|
|
|
|
this.groups.push( {
|
|
|
|
start: start,
|
|
count: count,
|
|
materialIndex: materialIndex
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
var index = source.index;
|
|
|
|
if ( index !== null ) {
|
|
|
|
this.setIndex( index.clone() );
|
|
|
|
}
|
|
|
|
var attributes = source.attributes;
|
|
|
|
for ( var name in attributes ) {
|
|
|
|
var attribute = attributes[ name ];
|
|
this.addAttribute( name, attribute.clone() );
|
|
|
|
}
|
|
|
|
var groups = source.groups;
|
|
|
|
for ( var i = 0, l = groups.length; i < l; i ++ ) {
|
|
|
|
var group = groups[ i ];
|
|
this.addGroup( group.start, group.count, group.materialIndex );
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
*/
|
|
|
|
function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.data = interleavedBuffer;
|
|
this.itemSize = itemSize;
|
|
this.offset = offset;
|
|
|
|
this.normalized = normalized === true;
|
|
|
|
}
|
|
|
|
Object.defineProperties( InterleavedBufferAttribute.prototype, {
|
|
|
|
count: {
|
|
|
|
get: function () {
|
|
|
|
return this.data.count;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
array: {
|
|
|
|
get: function () {
|
|
|
|
return this.data.array;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( InterleavedBufferAttribute.prototype, {
|
|
|
|
isInterleavedBufferAttribute: true,
|
|
|
|
setX: function ( index, x ) {
|
|
|
|
this.data.array[ index * this.data.stride + this.offset ] = x;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setY: function ( index, y ) {
|
|
|
|
this.data.array[ index * this.data.stride + this.offset + 1 ] = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setZ: function ( index, z ) {
|
|
|
|
this.data.array[ index * this.data.stride + this.offset + 2 ] = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setW: function ( index, w ) {
|
|
|
|
this.data.array[ index * this.data.stride + this.offset + 3 ] = w;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
getX: function ( index ) {
|
|
|
|
return this.data.array[ index * this.data.stride + this.offset ];
|
|
|
|
},
|
|
|
|
getY: function ( index ) {
|
|
|
|
return this.data.array[ index * this.data.stride + this.offset + 1 ];
|
|
|
|
},
|
|
|
|
getZ: function ( index ) {
|
|
|
|
return this.data.array[ index * this.data.stride + this.offset + 2 ];
|
|
|
|
},
|
|
|
|
getW: function ( index ) {
|
|
|
|
return this.data.array[ index * this.data.stride + this.offset + 3 ];
|
|
|
|
},
|
|
|
|
setXY: function ( index, x, y ) {
|
|
|
|
index = index * this.data.stride + this.offset;
|
|
|
|
this.data.array[ index + 0 ] = x;
|
|
this.data.array[ index + 1 ] = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setXYZ: function ( index, x, y, z ) {
|
|
|
|
index = index * this.data.stride + this.offset;
|
|
|
|
this.data.array[ index + 0 ] = x;
|
|
this.data.array[ index + 1 ] = y;
|
|
this.data.array[ index + 2 ] = z;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setXYZW: function ( index, x, y, z, w ) {
|
|
|
|
index = index * this.data.stride + this.offset;
|
|
|
|
this.data.array[ index + 0 ] = x;
|
|
this.data.array[ index + 1 ] = y;
|
|
this.data.array[ index + 2 ] = z;
|
|
this.data.array[ index + 3 ] = w;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
*/
|
|
|
|
function InterleavedBuffer( array, stride ) {
|
|
|
|
this.uuid = _Math.generateUUID();
|
|
|
|
this.array = array;
|
|
this.stride = stride;
|
|
this.count = array !== undefined ? array.length / stride : 0;
|
|
|
|
this.dynamic = false;
|
|
this.updateRange = { offset: 0, count: - 1 };
|
|
|
|
this.onUploadCallback = function () {};
|
|
|
|
this.version = 0;
|
|
|
|
}
|
|
|
|
Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {
|
|
|
|
set: function ( value ) {
|
|
|
|
if ( value === true ) this.version ++;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( InterleavedBuffer.prototype, {
|
|
|
|
isInterleavedBuffer: true,
|
|
|
|
setArray: function ( array ) {
|
|
|
|
if ( Array.isArray( array ) ) {
|
|
|
|
throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
|
|
|
|
}
|
|
|
|
this.count = array !== undefined ? array.length / this.stride : 0;
|
|
this.array = array;
|
|
|
|
},
|
|
|
|
setDynamic: function ( value ) {
|
|
|
|
this.dynamic = value;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copy: function ( source ) {
|
|
|
|
this.array = new source.array.constructor( source.array );
|
|
this.count = source.count;
|
|
this.stride = source.stride;
|
|
this.dynamic = source.dynamic;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
copyAt: function ( index1, attribute, index2 ) {
|
|
|
|
index1 *= this.stride;
|
|
index2 *= attribute.stride;
|
|
|
|
for ( var i = 0, l = this.stride; i < l; i ++ ) {
|
|
|
|
this.array[ index1 + i ] = attribute.array[ index2 + i ];
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
set: function ( value, offset ) {
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
this.array.set( value, offset );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
onUpload: function ( callback ) {
|
|
|
|
this.onUploadCallback = callback;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
*/
|
|
|
|
function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {
|
|
|
|
InterleavedBuffer.call( this, array, stride );
|
|
|
|
this.meshPerAttribute = meshPerAttribute || 1;
|
|
|
|
}
|
|
|
|
InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {
|
|
|
|
constructor: InstancedInterleavedBuffer,
|
|
|
|
isInstancedInterleavedBuffer: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
InterleavedBuffer.prototype.copy.call( this, source );
|
|
|
|
this.meshPerAttribute = source.meshPerAttribute;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author benaadams / https://twitter.com/ben_a_adams
|
|
*/
|
|
|
|
function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {
|
|
|
|
BufferAttribute.call( this, array, itemSize );
|
|
|
|
this.meshPerAttribute = meshPerAttribute || 1;
|
|
|
|
}
|
|
|
|
InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {
|
|
|
|
constructor: InstancedBufferAttribute,
|
|
|
|
isInstancedBufferAttribute: true,
|
|
|
|
copy: function ( source ) {
|
|
|
|
BufferAttribute.prototype.copy.call( this, source );
|
|
|
|
this.meshPerAttribute = source.meshPerAttribute;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author bhouston / http://clara.io/
|
|
* @author stephomi / http://stephaneginier.com/
|
|
*/
|
|
|
|
function Raycaster( origin, direction, near, far ) {
|
|
|
|
this.ray = new Ray( origin, direction );
|
|
// direction is assumed to be normalized (for accurate distance calculations)
|
|
|
|
this.near = near || 0;
|
|
this.far = far || Infinity;
|
|
|
|
this.params = {
|
|
Mesh: {},
|
|
Line: {},
|
|
LOD: {},
|
|
Points: { threshold: 1 },
|
|
Sprite: {}
|
|
};
|
|
|
|
Object.defineProperties( this.params, {
|
|
PointCloud: {
|
|
get: function () {
|
|
console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );
|
|
return this.Points;
|
|
}
|
|
}
|
|
} );
|
|
|
|
}
|
|
|
|
function ascSort( a, b ) {
|
|
|
|
return a.distance - b.distance;
|
|
|
|
}
|
|
|
|
function intersectObject( object, raycaster, intersects, recursive ) {
|
|
|
|
if ( object.visible === false ) return;
|
|
|
|
object.raycast( raycaster, intersects );
|
|
|
|
if ( recursive === true ) {
|
|
|
|
var children = object.children;
|
|
|
|
for ( var i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
intersectObject( children[ i ], raycaster, intersects, true );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Object.assign( Raycaster.prototype, {
|
|
|
|
linePrecision: 1,
|
|
|
|
set: function ( origin, direction ) {
|
|
|
|
// direction is assumed to be normalized (for accurate distance calculations)
|
|
|
|
this.ray.set( origin, direction );
|
|
|
|
},
|
|
|
|
setFromCamera: function ( coords, camera ) {
|
|
|
|
if ( ( camera && camera.isPerspectiveCamera ) ) {
|
|
|
|
this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
|
|
this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
|
|
|
|
} else if ( ( camera && camera.isOrthographicCamera ) ) {
|
|
|
|
this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
|
|
this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
|
|
|
|
} else {
|
|
|
|
console.error( 'THREE.Raycaster: Unsupported camera type.' );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
intersectObject: function ( object, recursive ) {
|
|
|
|
var intersects = [];
|
|
|
|
intersectObject( object, this, intersects, recursive );
|
|
|
|
intersects.sort( ascSort );
|
|
|
|
return intersects;
|
|
|
|
},
|
|
|
|
intersectObjects: function ( objects, recursive ) {
|
|
|
|
var intersects = [];
|
|
|
|
if ( Array.isArray( objects ) === false ) {
|
|
|
|
console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );
|
|
return intersects;
|
|
|
|
}
|
|
|
|
for ( var i = 0, l = objects.length; i < l; i ++ ) {
|
|
|
|
intersectObject( objects[ i ], this, intersects, recursive );
|
|
|
|
}
|
|
|
|
intersects.sort( ascSort );
|
|
|
|
return intersects;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function Clock( autoStart ) {
|
|
|
|
this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
|
|
|
|
this.startTime = 0;
|
|
this.oldTime = 0;
|
|
this.elapsedTime = 0;
|
|
|
|
this.running = false;
|
|
|
|
}
|
|
|
|
Object.assign( Clock.prototype, {
|
|
|
|
start: function () {
|
|
|
|
this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
|
|
|
|
this.oldTime = this.startTime;
|
|
this.elapsedTime = 0;
|
|
this.running = true;
|
|
|
|
},
|
|
|
|
stop: function () {
|
|
|
|
this.getElapsedTime();
|
|
this.running = false;
|
|
|
|
},
|
|
|
|
getElapsedTime: function () {
|
|
|
|
this.getDelta();
|
|
return this.elapsedTime;
|
|
|
|
},
|
|
|
|
getDelta: function () {
|
|
|
|
var diff = 0;
|
|
|
|
if ( this.autoStart && ! this.running ) {
|
|
|
|
this.start();
|
|
return 0;
|
|
|
|
}
|
|
|
|
if ( this.running ) {
|
|
|
|
var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
|
|
|
|
diff = ( newTime - this.oldTime ) / 1000;
|
|
this.oldTime = newTime;
|
|
|
|
this.elapsedTime += diff;
|
|
|
|
}
|
|
|
|
return diff;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author bhouston / http://clara.io
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*
|
|
* Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
|
|
*
|
|
* The poles (phi) are at the positive and negative y axis.
|
|
* The equator starts at positive z.
|
|
*/
|
|
|
|
function Spherical( radius, phi, theta ) {
|
|
|
|
this.radius = ( radius !== undefined ) ? radius : 1.0;
|
|
this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole
|
|
this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
Object.assign( Spherical.prototype, {
|
|
|
|
set: function ( radius, phi, theta ) {
|
|
|
|
this.radius = radius;
|
|
this.phi = phi;
|
|
this.theta = theta;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( other ) {
|
|
|
|
this.radius = other.radius;
|
|
this.phi = other.phi;
|
|
this.theta = other.theta;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
// restrict phi to be betwee EPS and PI-EPS
|
|
makeSafe: function() {
|
|
|
|
var EPS = 0.000001;
|
|
this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromVector3: function( vec3 ) {
|
|
|
|
this.radius = vec3.length();
|
|
|
|
if ( this.radius === 0 ) {
|
|
|
|
this.theta = 0;
|
|
this.phi = 0;
|
|
|
|
} else {
|
|
|
|
this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis
|
|
this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*
|
|
* Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
|
|
*
|
|
*/
|
|
|
|
function Cylindrical( radius, theta, y ) {
|
|
|
|
this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane
|
|
this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis
|
|
this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
Object.assign( Cylindrical.prototype, {
|
|
|
|
set: function ( radius, theta, y ) {
|
|
|
|
this.radius = radius;
|
|
this.theta = theta;
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
clone: function () {
|
|
|
|
return new this.constructor().copy( this );
|
|
|
|
},
|
|
|
|
copy: function ( other ) {
|
|
|
|
this.radius = other.radius;
|
|
this.theta = other.theta;
|
|
this.y = other.y;
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
setFromVector3: function( vec3 ) {
|
|
|
|
this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );
|
|
this.theta = Math.atan2( vec3.x, vec3.z );
|
|
this.y = vec3.y;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function MorphBlendMesh( geometry, material ) {
|
|
|
|
Mesh.call( this, geometry, material );
|
|
|
|
this.animationsMap = {};
|
|
this.animationsList = [];
|
|
|
|
// prepare default animation
|
|
// (all frames played together in 1 second)
|
|
|
|
var numFrames = this.geometry.morphTargets.length;
|
|
|
|
var name = "__default";
|
|
|
|
var startFrame = 0;
|
|
var endFrame = numFrames - 1;
|
|
|
|
var fps = numFrames / 1;
|
|
|
|
this.createAnimation( name, startFrame, endFrame, fps );
|
|
this.setAnimationWeight( name, 1 );
|
|
|
|
}
|
|
|
|
MorphBlendMesh.prototype = Object.create( Mesh.prototype );
|
|
MorphBlendMesh.prototype.constructor = MorphBlendMesh;
|
|
|
|
MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {
|
|
|
|
var animation = {
|
|
|
|
start: start,
|
|
end: end,
|
|
|
|
length: end - start + 1,
|
|
|
|
fps: fps,
|
|
duration: ( end - start ) / fps,
|
|
|
|
lastFrame: 0,
|
|
currentFrame: 0,
|
|
|
|
active: false,
|
|
|
|
time: 0,
|
|
direction: 1,
|
|
weight: 1,
|
|
|
|
directionBackwards: false,
|
|
mirroredLoop: false
|
|
|
|
};
|
|
|
|
this.animationsMap[ name ] = animation;
|
|
this.animationsList.push( animation );
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {
|
|
|
|
var pattern = /([a-z]+)_?(\d+)/i;
|
|
|
|
var firstAnimation, frameRanges = {};
|
|
|
|
var geometry = this.geometry;
|
|
|
|
for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {
|
|
|
|
var morph = geometry.morphTargets[ i ];
|
|
var chunks = morph.name.match( pattern );
|
|
|
|
if ( chunks && chunks.length > 1 ) {
|
|
|
|
var name = chunks[ 1 ];
|
|
|
|
if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };
|
|
|
|
var range = frameRanges[ name ];
|
|
|
|
if ( i < range.start ) range.start = i;
|
|
if ( i > range.end ) range.end = i;
|
|
|
|
if ( ! firstAnimation ) firstAnimation = name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for ( var name in frameRanges ) {
|
|
|
|
var range = frameRanges[ name ];
|
|
this.createAnimation( name, range.start, range.end, fps );
|
|
|
|
}
|
|
|
|
this.firstAnimation = firstAnimation;
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.direction = 1;
|
|
animation.directionBackwards = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.direction = - 1;
|
|
animation.directionBackwards = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.fps = fps;
|
|
animation.duration = ( animation.end - animation.start ) / animation.fps;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.duration = duration;
|
|
animation.fps = ( animation.end - animation.start ) / animation.duration;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.weight = weight;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.time = time;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.getAnimationTime = function ( name ) {
|
|
|
|
var time = 0;
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
time = animation.time;
|
|
|
|
}
|
|
|
|
return time;
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.getAnimationDuration = function ( name ) {
|
|
|
|
var duration = - 1;
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
duration = animation.duration;
|
|
|
|
}
|
|
|
|
return duration;
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.playAnimation = function ( name ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.time = 0;
|
|
animation.active = true;
|
|
|
|
} else {
|
|
|
|
console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.stopAnimation = function ( name ) {
|
|
|
|
var animation = this.animationsMap[ name ];
|
|
|
|
if ( animation ) {
|
|
|
|
animation.active = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MorphBlendMesh.prototype.update = function ( delta ) {
|
|
|
|
for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {
|
|
|
|
var animation = this.animationsList[ i ];
|
|
|
|
if ( ! animation.active ) continue;
|
|
|
|
var frameTime = animation.duration / animation.length;
|
|
|
|
animation.time += animation.direction * delta;
|
|
|
|
if ( animation.mirroredLoop ) {
|
|
|
|
if ( animation.time > animation.duration || animation.time < 0 ) {
|
|
|
|
animation.direction *= - 1;
|
|
|
|
if ( animation.time > animation.duration ) {
|
|
|
|
animation.time = animation.duration;
|
|
animation.directionBackwards = true;
|
|
|
|
}
|
|
|
|
if ( animation.time < 0 ) {
|
|
|
|
animation.time = 0;
|
|
animation.directionBackwards = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
animation.time = animation.time % animation.duration;
|
|
|
|
if ( animation.time < 0 ) animation.time += animation.duration;
|
|
|
|
}
|
|
|
|
var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );
|
|
var weight = animation.weight;
|
|
|
|
if ( keyframe !== animation.currentFrame ) {
|
|
|
|
this.morphTargetInfluences[ animation.lastFrame ] = 0;
|
|
this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;
|
|
|
|
this.morphTargetInfluences[ keyframe ] = 0;
|
|
|
|
animation.lastFrame = animation.currentFrame;
|
|
animation.currentFrame = keyframe;
|
|
|
|
}
|
|
|
|
var mix = ( animation.time % frameTime ) / frameTime;
|
|
|
|
if ( animation.directionBackwards ) mix = 1 - mix;
|
|
|
|
if ( animation.currentFrame !== animation.lastFrame ) {
|
|
|
|
this.morphTargetInfluences[ animation.currentFrame ] = mix * weight;
|
|
this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;
|
|
|
|
} else {
|
|
|
|
this.morphTargetInfluences[ animation.currentFrame ] = weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
*/
|
|
|
|
function ImmediateRenderObject( material ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.material = material;
|
|
this.render = function ( renderCallback ) {};
|
|
|
|
}
|
|
|
|
ImmediateRenderObject.prototype = Object.create( Object3D.prototype );
|
|
ImmediateRenderObject.prototype.constructor = ImmediateRenderObject;
|
|
|
|
ImmediateRenderObject.prototype.isImmediateRenderObject = true;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function VertexNormalsHelper( object, size, hex, linewidth ) {
|
|
|
|
this.object = object;
|
|
|
|
this.size = ( size !== undefined ) ? size : 1;
|
|
|
|
var color = ( hex !== undefined ) ? hex : 0xff0000;
|
|
|
|
var width = ( linewidth !== undefined ) ? linewidth : 1;
|
|
|
|
//
|
|
|
|
var nNormals = 0;
|
|
|
|
var objGeometry = this.object.geometry;
|
|
|
|
if ( objGeometry && objGeometry.isGeometry ) {
|
|
|
|
nNormals = objGeometry.faces.length * 3;
|
|
|
|
} else if ( objGeometry && objGeometry.isBufferGeometry ) {
|
|
|
|
nNormals = objGeometry.attributes.normal.count;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var geometry = new BufferGeometry();
|
|
|
|
var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );
|
|
|
|
geometry.addAttribute( 'position', positions );
|
|
|
|
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );
|
|
|
|
//
|
|
|
|
this.matrixAutoUpdate = false;
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
VertexNormalsHelper.prototype = Object.create( LineSegments.prototype );
|
|
VertexNormalsHelper.prototype.constructor = VertexNormalsHelper;
|
|
|
|
VertexNormalsHelper.prototype.update = ( function () {
|
|
|
|
var v1 = new Vector3();
|
|
var v2 = new Vector3();
|
|
var normalMatrix = new Matrix3();
|
|
|
|
return function update() {
|
|
|
|
var keys = [ 'a', 'b', 'c' ];
|
|
|
|
this.object.updateMatrixWorld( true );
|
|
|
|
normalMatrix.getNormalMatrix( this.object.matrixWorld );
|
|
|
|
var matrixWorld = this.object.matrixWorld;
|
|
|
|
var position = this.geometry.attributes.position;
|
|
|
|
//
|
|
|
|
var objGeometry = this.object.geometry;
|
|
|
|
if ( objGeometry && objGeometry.isGeometry ) {
|
|
|
|
var vertices = objGeometry.vertices;
|
|
|
|
var faces = objGeometry.faces;
|
|
|
|
var idx = 0;
|
|
|
|
for ( var i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
|
|
|
|
var vertex = vertices[ face[ keys[ j ] ] ];
|
|
|
|
var normal = face.vertexNormals[ j ];
|
|
|
|
v1.copy( vertex ).applyMatrix4( matrixWorld );
|
|
|
|
v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
|
|
|
|
position.setXYZ( idx, v1.x, v1.y, v1.z );
|
|
|
|
idx = idx + 1;
|
|
|
|
position.setXYZ( idx, v2.x, v2.y, v2.z );
|
|
|
|
idx = idx + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if ( objGeometry && objGeometry.isBufferGeometry ) {
|
|
|
|
var objPos = objGeometry.attributes.position;
|
|
|
|
var objNorm = objGeometry.attributes.normal;
|
|
|
|
var idx = 0;
|
|
|
|
// for simplicity, ignore index and drawcalls, and render every normal
|
|
|
|
for ( var j = 0, jl = objPos.count; j < jl; j ++ ) {
|
|
|
|
v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );
|
|
|
|
v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );
|
|
|
|
v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
|
|
|
|
position.setXYZ( idx, v1.x, v1.y, v1.z );
|
|
|
|
idx = idx + 1;
|
|
|
|
position.setXYZ( idx, v2.x, v2.y, v2.z );
|
|
|
|
idx = idx + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
position.needsUpdate = true;
|
|
|
|
};
|
|
|
|
}() );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function SpotLightHelper( light ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.light = light;
|
|
this.light.updateMatrixWorld();
|
|
|
|
this.matrix = light.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
var geometry = new BufferGeometry();
|
|
|
|
var positions = [
|
|
0, 0, 0, 0, 0, 1,
|
|
0, 0, 0, 1, 0, 1,
|
|
0, 0, 0, - 1, 0, 1,
|
|
0, 0, 0, 0, 1, 1,
|
|
0, 0, 0, 0, - 1, 1
|
|
];
|
|
|
|
for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {
|
|
|
|
var p1 = ( i / l ) * Math.PI * 2;
|
|
var p2 = ( j / l ) * Math.PI * 2;
|
|
|
|
positions.push(
|
|
Math.cos( p1 ), Math.sin( p1 ), 1,
|
|
Math.cos( p2 ), Math.sin( p2 ), 1
|
|
);
|
|
|
|
}
|
|
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
|
|
|
|
var material = new LineBasicMaterial( { fog: false } );
|
|
|
|
this.cone = new LineSegments( geometry, material );
|
|
this.add( this.cone );
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
SpotLightHelper.prototype = Object.create( Object3D.prototype );
|
|
SpotLightHelper.prototype.constructor = SpotLightHelper;
|
|
|
|
SpotLightHelper.prototype.dispose = function () {
|
|
|
|
this.cone.geometry.dispose();
|
|
this.cone.material.dispose();
|
|
|
|
};
|
|
|
|
SpotLightHelper.prototype.update = function () {
|
|
|
|
var vector = new Vector3();
|
|
var vector2 = new Vector3();
|
|
|
|
return function update() {
|
|
|
|
var coneLength = this.light.distance ? this.light.distance : 1000;
|
|
var coneWidth = coneLength * Math.tan( this.light.angle );
|
|
|
|
this.cone.scale.set( coneWidth, coneWidth, coneLength );
|
|
|
|
vector.setFromMatrixPosition( this.light.matrixWorld );
|
|
vector2.setFromMatrixPosition( this.light.target.matrixWorld );
|
|
|
|
this.cone.lookAt( vector2.sub( vector ) );
|
|
|
|
this.cone.material.color.copy( this.light.color );
|
|
|
|
};
|
|
|
|
}();
|
|
|
|
/**
|
|
* @author Sean Griffin / http://twitter.com/sgrif
|
|
* @author Michael Guerrero / http://realitymeltdown.com
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author ikerr / http://verold.com
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
function SkeletonHelper( object ) {
|
|
|
|
this.bones = this.getBoneList( object );
|
|
|
|
var geometry = new BufferGeometry();
|
|
|
|
var vertices = [];
|
|
var colors = [];
|
|
|
|
var color1 = new Color( 0, 0, 1 );
|
|
var color2 = new Color( 0, 1, 0 );
|
|
|
|
for ( var i = 0; i < this.bones.length; i ++ ) {
|
|
|
|
var bone = this.bones[ i ];
|
|
|
|
if ( bone.parent && bone.parent.isBone ) {
|
|
|
|
vertices.push( 0, 0, 0 );
|
|
vertices.push( 0, 0, 0 );
|
|
colors.push( color1.r, color1.g, color1.b );
|
|
colors.push( color2.r, color2.g, color2.b );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
|
|
|
|
var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );
|
|
|
|
LineSegments.call( this, geometry, material );
|
|
|
|
this.root = object;
|
|
|
|
this.matrix = object.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
|
|
SkeletonHelper.prototype = Object.create( LineSegments.prototype );
|
|
SkeletonHelper.prototype.constructor = SkeletonHelper;
|
|
|
|
SkeletonHelper.prototype.getBoneList = function( object ) {
|
|
|
|
var boneList = [];
|
|
|
|
if ( object && object.isBone ) {
|
|
|
|
boneList.push( object );
|
|
|
|
}
|
|
|
|
for ( var i = 0; i < object.children.length; i ++ ) {
|
|
|
|
boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );
|
|
|
|
}
|
|
|
|
return boneList;
|
|
|
|
};
|
|
|
|
SkeletonHelper.prototype.update = function () {
|
|
|
|
var vector = new Vector3();
|
|
|
|
var boneMatrix = new Matrix4();
|
|
var matrixWorldInv = new Matrix4();
|
|
|
|
return function update() {
|
|
|
|
var geometry = this.geometry;
|
|
var position = geometry.getAttribute( 'position' );
|
|
|
|
matrixWorldInv.getInverse( this.root.matrixWorld );
|
|
|
|
for ( var i = 0, j = 0; i < this.bones.length; i ++ ) {
|
|
|
|
var bone = this.bones[ i ];
|
|
|
|
if ( bone.parent && bone.parent.isBone ) {
|
|
|
|
boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );
|
|
vector.setFromMatrixPosition( boneMatrix );
|
|
position.setXYZ( j, vector.x, vector.y, vector.z );
|
|
|
|
boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );
|
|
vector.setFromMatrixPosition( boneMatrix );
|
|
position.setXYZ( j + 1, vector.x, vector.y, vector.z );
|
|
|
|
j += 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
geometry.getAttribute( 'position' ).needsUpdate = true;
|
|
|
|
};
|
|
|
|
}();
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function PointLightHelper( light, sphereSize ) {
|
|
|
|
this.light = light;
|
|
this.light.updateMatrixWorld();
|
|
|
|
var geometry = new SphereBufferGeometry( sphereSize, 4, 2 );
|
|
var material = new MeshBasicMaterial( { wireframe: true, fog: false } );
|
|
material.color.copy( this.light.color );
|
|
|
|
Mesh.call( this, geometry, material );
|
|
|
|
this.matrix = this.light.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
/*
|
|
var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
|
|
var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
|
|
|
|
this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
|
|
this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
|
|
|
|
var d = light.distance;
|
|
|
|
if ( d === 0.0 ) {
|
|
|
|
this.lightDistance.visible = false;
|
|
|
|
} else {
|
|
|
|
this.lightDistance.scale.set( d, d, d );
|
|
|
|
}
|
|
|
|
this.add( this.lightDistance );
|
|
*/
|
|
|
|
}
|
|
|
|
PointLightHelper.prototype = Object.create( Mesh.prototype );
|
|
PointLightHelper.prototype.constructor = PointLightHelper;
|
|
|
|
PointLightHelper.prototype.dispose = function () {
|
|
|
|
this.geometry.dispose();
|
|
this.material.dispose();
|
|
|
|
};
|
|
|
|
PointLightHelper.prototype.update = function () {
|
|
|
|
this.material.color.copy( this.light.color );
|
|
|
|
/*
|
|
var d = this.light.distance;
|
|
|
|
if ( d === 0.0 ) {
|
|
|
|
this.lightDistance.visible = false;
|
|
|
|
} else {
|
|
|
|
this.lightDistance.visible = true;
|
|
this.lightDistance.scale.set( d, d, d );
|
|
|
|
}
|
|
*/
|
|
|
|
};
|
|
|
|
/**
|
|
* @author abelnation / http://github.com/abelnation
|
|
* @author Mugen87 / http://github.com/Mugen87
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function RectAreaLightHelper( light ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.light = light;
|
|
this.light.updateMatrixWorld();
|
|
|
|
this.matrix = light.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
var material = new LineBasicMaterial( { color: light.color } );
|
|
|
|
var geometry = new BufferGeometry();
|
|
|
|
geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) );
|
|
|
|
this.add( new Line( geometry, material ) );
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
RectAreaLightHelper.prototype = Object.create( Object3D.prototype );
|
|
RectAreaLightHelper.prototype.constructor = RectAreaLightHelper;
|
|
|
|
RectAreaLightHelper.prototype.dispose = function () {
|
|
|
|
this.children[ 0 ].geometry.dispose();
|
|
this.children[ 0 ].material.dispose();
|
|
|
|
};
|
|
|
|
RectAreaLightHelper.prototype.update = function () {
|
|
|
|
var line = this.children[ 0 ];
|
|
|
|
// update material
|
|
|
|
line.material.color.copy( this.light.color );
|
|
|
|
// calculate new dimensions of the helper
|
|
|
|
var hx = this.light.width * 0.5;
|
|
var hy = this.light.height * 0.5;
|
|
|
|
var position = line.geometry.attributes.position;
|
|
var array = position.array;
|
|
|
|
// update vertices
|
|
|
|
array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;
|
|
array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;
|
|
array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;
|
|
array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0;
|
|
array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0;
|
|
|
|
position.needsUpdate = true;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*/
|
|
|
|
function HemisphereLightHelper( light, size ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.light = light;
|
|
this.light.updateMatrixWorld();
|
|
|
|
this.matrix = light.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
var geometry = new OctahedronBufferGeometry( size );
|
|
geometry.rotateY( Math.PI * 0.5 );
|
|
|
|
var material = new MeshBasicMaterial( { vertexColors: VertexColors, wireframe: true } );
|
|
|
|
var position = geometry.getAttribute( 'position' );
|
|
var colors = new Float32Array( position.count * 3 );
|
|
|
|
geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );
|
|
|
|
this.add( new Mesh( geometry, material ) );
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
HemisphereLightHelper.prototype = Object.create( Object3D.prototype );
|
|
HemisphereLightHelper.prototype.constructor = HemisphereLightHelper;
|
|
|
|
HemisphereLightHelper.prototype.dispose = function () {
|
|
|
|
this.children[ 0 ].geometry.dispose();
|
|
this.children[ 0 ].material.dispose();
|
|
|
|
};
|
|
|
|
HemisphereLightHelper.prototype.update = function () {
|
|
|
|
var vector = new Vector3();
|
|
|
|
var color1 = new Color();
|
|
var color2 = new Color();
|
|
|
|
return function update() {
|
|
|
|
var mesh = this.children[ 0 ];
|
|
|
|
var colors = mesh.geometry.getAttribute( 'color' );
|
|
|
|
color1.copy( this.light.color );
|
|
color2.copy( this.light.groundColor );
|
|
|
|
for ( var i = 0, l = colors.count; i < l; i ++ ) {
|
|
|
|
var color = ( i < ( l / 2 ) ) ? color1 : color2;
|
|
|
|
colors.setXYZ( i, color.r, color.g, color.b );
|
|
|
|
}
|
|
|
|
mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );
|
|
|
|
colors.needsUpdate = true;
|
|
|
|
};
|
|
|
|
}();
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function GridHelper( size, divisions, color1, color2 ) {
|
|
|
|
size = size || 10;
|
|
divisions = divisions || 10;
|
|
color1 = new Color( color1 !== undefined ? color1 : 0x444444 );
|
|
color2 = new Color( color2 !== undefined ? color2 : 0x888888 );
|
|
|
|
var center = divisions / 2;
|
|
var step = size / divisions;
|
|
var halfSize = size / 2;
|
|
|
|
var vertices = [], colors = [];
|
|
|
|
for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {
|
|
|
|
vertices.push( - halfSize, 0, k, halfSize, 0, k );
|
|
vertices.push( k, 0, - halfSize, k, 0, halfSize );
|
|
|
|
var color = i === center ? color1 : color2;
|
|
|
|
color.toArray( colors, j ); j += 3;
|
|
color.toArray( colors, j ); j += 3;
|
|
color.toArray( colors, j ); j += 3;
|
|
color.toArray( colors, j ); j += 3;
|
|
|
|
}
|
|
|
|
var geometry = new BufferGeometry();
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
|
|
|
|
var material = new LineBasicMaterial( { vertexColors: VertexColors } );
|
|
|
|
LineSegments.call( this, geometry, material );
|
|
|
|
}
|
|
|
|
GridHelper.prototype = Object.create( LineSegments.prototype );
|
|
GridHelper.prototype.constructor = GridHelper;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / http://github.com/Mugen87
|
|
* @author Hectate / http://www.github.com/Hectate
|
|
*/
|
|
|
|
function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {
|
|
|
|
radius = radius || 10;
|
|
radials = radials || 16;
|
|
circles = circles || 8;
|
|
divisions = divisions || 64;
|
|
color1 = new Color( color1 !== undefined ? color1 : 0x444444 );
|
|
color2 = new Color( color2 !== undefined ? color2 : 0x888888 );
|
|
|
|
var vertices = [];
|
|
var colors = [];
|
|
|
|
var x, z;
|
|
var v, i, j, r, color;
|
|
|
|
// create the radials
|
|
|
|
for ( i = 0; i <= radials; i ++ ) {
|
|
|
|
v = ( i / radials ) * ( Math.PI * 2 );
|
|
|
|
x = Math.sin( v ) * radius;
|
|
z = Math.cos( v ) * radius;
|
|
|
|
vertices.push( 0, 0, 0 );
|
|
vertices.push( x, 0, z );
|
|
|
|
color = ( i & 1 ) ? color1 : color2;
|
|
|
|
colors.push( color.r, color.g, color.b );
|
|
colors.push( color.r, color.g, color.b );
|
|
|
|
}
|
|
|
|
// create the circles
|
|
|
|
for ( i = 0; i <= circles; i ++ ) {
|
|
|
|
color = ( i & 1 ) ? color1 : color2;
|
|
|
|
r = radius - ( radius / circles * i );
|
|
|
|
for ( j = 0; j < divisions; j ++ ) {
|
|
|
|
// first vertex
|
|
|
|
v = ( j / divisions ) * ( Math.PI * 2 );
|
|
|
|
x = Math.sin( v ) * r;
|
|
z = Math.cos( v ) * r;
|
|
|
|
vertices.push( x, 0, z );
|
|
colors.push( color.r, color.g, color.b );
|
|
|
|
// second vertex
|
|
|
|
v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );
|
|
|
|
x = Math.sin( v ) * r;
|
|
z = Math.cos( v ) * r;
|
|
|
|
vertices.push( x, 0, z );
|
|
colors.push( color.r, color.g, color.b );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var geometry = new BufferGeometry();
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
|
|
|
|
var material = new LineBasicMaterial( { vertexColors: VertexColors } );
|
|
|
|
LineSegments.call( this, geometry, material );
|
|
|
|
}
|
|
|
|
PolarGridHelper.prototype = Object.create( LineSegments.prototype );
|
|
PolarGridHelper.prototype.constructor = PolarGridHelper;
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function FaceNormalsHelper( object, size, hex, linewidth ) {
|
|
|
|
// FaceNormalsHelper only supports THREE.Geometry
|
|
|
|
this.object = object;
|
|
|
|
this.size = ( size !== undefined ) ? size : 1;
|
|
|
|
var color = ( hex !== undefined ) ? hex : 0xffff00;
|
|
|
|
var width = ( linewidth !== undefined ) ? linewidth : 1;
|
|
|
|
//
|
|
|
|
var nNormals = 0;
|
|
|
|
var objGeometry = this.object.geometry;
|
|
|
|
if ( objGeometry && objGeometry.isGeometry ) {
|
|
|
|
nNormals = objGeometry.faces.length;
|
|
|
|
} else {
|
|
|
|
console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var geometry = new BufferGeometry();
|
|
|
|
var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );
|
|
|
|
geometry.addAttribute( 'position', positions );
|
|
|
|
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );
|
|
|
|
//
|
|
|
|
this.matrixAutoUpdate = false;
|
|
this.update();
|
|
|
|
}
|
|
|
|
FaceNormalsHelper.prototype = Object.create( LineSegments.prototype );
|
|
FaceNormalsHelper.prototype.constructor = FaceNormalsHelper;
|
|
|
|
FaceNormalsHelper.prototype.update = ( function () {
|
|
|
|
var v1 = new Vector3();
|
|
var v2 = new Vector3();
|
|
var normalMatrix = new Matrix3();
|
|
|
|
return function update() {
|
|
|
|
this.object.updateMatrixWorld( true );
|
|
|
|
normalMatrix.getNormalMatrix( this.object.matrixWorld );
|
|
|
|
var matrixWorld = this.object.matrixWorld;
|
|
|
|
var position = this.geometry.attributes.position;
|
|
|
|
//
|
|
|
|
var objGeometry = this.object.geometry;
|
|
|
|
var vertices = objGeometry.vertices;
|
|
|
|
var faces = objGeometry.faces;
|
|
|
|
var idx = 0;
|
|
|
|
for ( var i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
|
var face = faces[ i ];
|
|
|
|
var normal = face.normal;
|
|
|
|
v1.copy( vertices[ face.a ] )
|
|
.add( vertices[ face.b ] )
|
|
.add( vertices[ face.c ] )
|
|
.divideScalar( 3 )
|
|
.applyMatrix4( matrixWorld );
|
|
|
|
v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
|
|
|
|
position.setXYZ( idx, v1.x, v1.y, v1.z );
|
|
|
|
idx = idx + 1;
|
|
|
|
position.setXYZ( idx, v2.x, v2.y, v2.z );
|
|
|
|
idx = idx + 1;
|
|
|
|
}
|
|
|
|
position.needsUpdate = true;
|
|
|
|
};
|
|
|
|
}() );
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
*/
|
|
|
|
function DirectionalLightHelper( light, size ) {
|
|
|
|
Object3D.call( this );
|
|
|
|
this.light = light;
|
|
this.light.updateMatrixWorld();
|
|
|
|
this.matrix = light.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
if ( size === undefined ) size = 1;
|
|
|
|
var geometry = new BufferGeometry();
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( [
|
|
- size, size, 0,
|
|
size, size, 0,
|
|
size, - size, 0,
|
|
- size, - size, 0,
|
|
- size, size, 0
|
|
], 3 ) );
|
|
|
|
var material = new LineBasicMaterial( { fog: false } );
|
|
|
|
this.add( new Line( geometry, material ) );
|
|
|
|
geometry = new BufferGeometry();
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );
|
|
|
|
this.add( new Line( geometry, material ));
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
DirectionalLightHelper.prototype = Object.create( Object3D.prototype );
|
|
DirectionalLightHelper.prototype.constructor = DirectionalLightHelper;
|
|
|
|
DirectionalLightHelper.prototype.dispose = function () {
|
|
|
|
var lightPlane = this.children[ 0 ];
|
|
var targetLine = this.children[ 1 ];
|
|
|
|
lightPlane.geometry.dispose();
|
|
lightPlane.material.dispose();
|
|
targetLine.geometry.dispose();
|
|
targetLine.material.dispose();
|
|
|
|
};
|
|
|
|
DirectionalLightHelper.prototype.update = function () {
|
|
|
|
var v1 = new Vector3();
|
|
var v2 = new Vector3();
|
|
var v3 = new Vector3();
|
|
|
|
return function update() {
|
|
|
|
v1.setFromMatrixPosition( this.light.matrixWorld );
|
|
v2.setFromMatrixPosition( this.light.target.matrixWorld );
|
|
v3.subVectors( v2, v1 );
|
|
|
|
var lightPlane = this.children[ 0 ];
|
|
var targetLine = this.children[ 1 ];
|
|
|
|
lightPlane.lookAt( v3 );
|
|
lightPlane.material.color.copy( this.light.color );
|
|
|
|
targetLine.lookAt( v3 );
|
|
targetLine.scale.z = v3.length();
|
|
|
|
};
|
|
|
|
}();
|
|
|
|
/**
|
|
* @author alteredq / http://alteredqualia.com/
|
|
* @author Mugen87 / https://github.com/Mugen87
|
|
*
|
|
* - shows frustum, line of sight and up of the camera
|
|
* - suitable for fast updates
|
|
* - based on frustum visualization in lightgl.js shadowmap example
|
|
* http://evanw.github.com/lightgl.js/tests/shadowmap.html
|
|
*/
|
|
|
|
function CameraHelper( camera ) {
|
|
|
|
var geometry = new BufferGeometry();
|
|
var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );
|
|
|
|
var vertices = [];
|
|
var colors = [];
|
|
|
|
var pointMap = {};
|
|
|
|
// colors
|
|
|
|
var colorFrustum = new Color( 0xffaa00 );
|
|
var colorCone = new Color( 0xff0000 );
|
|
var colorUp = new Color( 0x00aaff );
|
|
var colorTarget = new Color( 0xffffff );
|
|
var colorCross = new Color( 0x333333 );
|
|
|
|
// near
|
|
|
|
addLine( "n1", "n2", colorFrustum );
|
|
addLine( "n2", "n4", colorFrustum );
|
|
addLine( "n4", "n3", colorFrustum );
|
|
addLine( "n3", "n1", colorFrustum );
|
|
|
|
// far
|
|
|
|
addLine( "f1", "f2", colorFrustum );
|
|
addLine( "f2", "f4", colorFrustum );
|
|
addLine( "f4", "f3", colorFrustum );
|
|
addLine( "f3", "f1", colorFrustum );
|
|
|
|
// sides
|
|
|
|
addLine( "n1", "f1", colorFrustum );
|
|
addLine( "n2", "f2", colorFrustum );
|
|
addLine( "n3", "f3", colorFrustum );
|
|
addLine( "n4", "f4", colorFrustum );
|
|
|
|
// cone
|
|
|
|
addLine( "p", "n1", colorCone );
|
|
addLine( "p", "n2", colorCone );
|
|
addLine( "p", "n3", colorCone );
|
|
addLine( "p", "n4", colorCone );
|
|
|
|
// up
|
|
|
|
addLine( "u1", "u2", colorUp );
|
|
addLine( "u2", "u3", colorUp );
|
|
addLine( "u3", "u1", colorUp );
|
|
|
|
// target
|
|
|
|
addLine( "c", "t", colorTarget );
|
|
addLine( "p", "c", colorCross );
|
|
|
|
// cross
|
|
|
|
addLine( "cn1", "cn2", colorCross );
|
|
addLine( "cn3", "cn4", colorCross );
|
|
|
|
addLine( "cf1", "cf2", colorCross );
|
|
addLine( "cf3", "cf4", colorCross );
|
|
|
|
function addLine( a, b, color ) {
|
|
|
|
addPoint( a, color );
|
|
addPoint( b, color );
|
|
|
|
}
|
|
|
|
function addPoint( id, color ) {
|
|
|
|
vertices.push( 0, 0, 0 );
|
|
colors.push( color.r, color.g, color.b );
|
|
|
|
if ( pointMap[ id ] === undefined ) {
|
|
|
|
pointMap[ id ] = [];
|
|
|
|
}
|
|
|
|
pointMap[ id ].push( ( vertices.length / 3 ) - 1 );
|
|
|
|
}
|
|
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
|
|
|
|
LineSegments.call( this, geometry, material );
|
|
|
|
this.camera = camera;
|
|
if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();
|
|
|
|
this.matrix = camera.matrixWorld;
|
|
this.matrixAutoUpdate = false;
|
|
|
|
this.pointMap = pointMap;
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
CameraHelper.prototype = Object.create( LineSegments.prototype );
|
|
CameraHelper.prototype.constructor = CameraHelper;
|
|
|
|
CameraHelper.prototype.update = function () {
|
|
|
|
var geometry, pointMap;
|
|
|
|
var vector = new Vector3();
|
|
var camera = new Camera();
|
|
|
|
function setPoint( point, x, y, z ) {
|
|
|
|
vector.set( x, y, z ).unproject( camera );
|
|
|
|
var points = pointMap[ point ];
|
|
|
|
if ( points !== undefined ) {
|
|
|
|
var position = geometry.getAttribute( 'position' );
|
|
|
|
for ( var i = 0, l = points.length; i < l; i ++ ) {
|
|
|
|
position.setXYZ( points[ i ], vector.x, vector.y, vector.z );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return function update() {
|
|
|
|
geometry = this.geometry;
|
|
pointMap = this.pointMap;
|
|
|
|
var w = 1, h = 1;
|
|
|
|
// we need just camera projection matrix
|
|
// world matrix must be identity
|
|
|
|
camera.projectionMatrix.copy( this.camera.projectionMatrix );
|
|
|
|
// center / target
|
|
|
|
setPoint( "c", 0, 0, - 1 );
|
|
setPoint( "t", 0, 0, 1 );
|
|
|
|
// near
|
|
|
|
setPoint( "n1", - w, - h, - 1 );
|
|
setPoint( "n2", w, - h, - 1 );
|
|
setPoint( "n3", - w, h, - 1 );
|
|
setPoint( "n4", w, h, - 1 );
|
|
|
|
// far
|
|
|
|
setPoint( "f1", - w, - h, 1 );
|
|
setPoint( "f2", w, - h, 1 );
|
|
setPoint( "f3", - w, h, 1 );
|
|
setPoint( "f4", w, h, 1 );
|
|
|
|
// up
|
|
|
|
setPoint( "u1", w * 0.7, h * 1.1, - 1 );
|
|
setPoint( "u2", - w * 0.7, h * 1.1, - 1 );
|
|
setPoint( "u3", 0, h * 2, - 1 );
|
|
|
|
// cross
|
|
|
|
setPoint( "cf1", - w, 0, 1 );
|
|
setPoint( "cf2", w, 0, 1 );
|
|
setPoint( "cf3", 0, - h, 1 );
|
|
setPoint( "cf4", 0, h, 1 );
|
|
|
|
setPoint( "cn1", - w, 0, - 1 );
|
|
setPoint( "cn2", w, 0, - 1 );
|
|
setPoint( "cn3", 0, - h, - 1 );
|
|
setPoint( "cn4", 0, h, - 1 );
|
|
|
|
geometry.getAttribute( 'position' ).needsUpdate = true;
|
|
|
|
};
|
|
|
|
}();
|
|
|
|
/**
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author Mugen87 / http://github.com/Mugen87
|
|
*/
|
|
|
|
function BoxHelper( object, color ) {
|
|
|
|
this.object = object;
|
|
|
|
if ( color === undefined ) color = 0xffff00;
|
|
|
|
var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
|
|
var positions = new Float32Array( 8 * 3 );
|
|
|
|
var geometry = new BufferGeometry();
|
|
geometry.setIndex( new BufferAttribute( indices, 1 ) );
|
|
geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );
|
|
|
|
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );
|
|
|
|
this.matrixAutoUpdate = false;
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
BoxHelper.prototype = Object.create( LineSegments.prototype );
|
|
BoxHelper.prototype.constructor = BoxHelper;
|
|
|
|
BoxHelper.prototype.update = ( function () {
|
|
|
|
var box = new Box3();
|
|
|
|
return function update( object ) {
|
|
|
|
if ( object !== undefined ) {
|
|
|
|
console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );
|
|
|
|
}
|
|
|
|
if ( this.object !== undefined ) {
|
|
|
|
box.setFromObject( this.object );
|
|
|
|
}
|
|
|
|
if ( box.isEmpty() ) return;
|
|
|
|
var min = box.min;
|
|
var max = box.max;
|
|
|
|
/*
|
|
5____4
|
|
1/___0/|
|
|
| 6__|_7
|
|
2/___3/
|
|
|
|
0: max.x, max.y, max.z
|
|
1: min.x, max.y, max.z
|
|
2: min.x, min.y, max.z
|
|
3: max.x, min.y, max.z
|
|
4: max.x, max.y, min.z
|
|
5: min.x, max.y, min.z
|
|
6: min.x, min.y, min.z
|
|
7: max.x, min.y, min.z
|
|
*/
|
|
|
|
var position = this.geometry.attributes.position;
|
|
var array = position.array;
|
|
|
|
array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;
|
|
array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;
|
|
array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;
|
|
array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;
|
|
array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;
|
|
array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;
|
|
array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;
|
|
array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;
|
|
|
|
position.needsUpdate = true;
|
|
|
|
this.geometry.computeBoundingSphere();
|
|
|
|
};
|
|
|
|
} )();
|
|
|
|
BoxHelper.prototype.setFromObject = function ( object ) {
|
|
|
|
this.object = object;
|
|
this.update();
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
/**
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
* @author zz85 / http://github.com/zz85
|
|
* @author bhouston / http://clara.io
|
|
*
|
|
* Creates an arrow for visualizing directions
|
|
*
|
|
* Parameters:
|
|
* dir - Vector3
|
|
* origin - Vector3
|
|
* length - Number
|
|
* color - color in hex value
|
|
* headLength - Number
|
|
* headWidth - Number
|
|
*/
|
|
|
|
var lineGeometry;
|
|
var coneGeometry;
|
|
|
|
function ArrowHelper( dir, origin, length, color, headLength, headWidth ) {
|
|
|
|
// dir is assumed to be normalized
|
|
|
|
Object3D.call( this );
|
|
|
|
if ( color === undefined ) color = 0xffff00;
|
|
if ( length === undefined ) length = 1;
|
|
if ( headLength === undefined ) headLength = 0.2 * length;
|
|
if ( headWidth === undefined ) headWidth = 0.2 * headLength;
|
|
|
|
if ( lineGeometry === undefined ) {
|
|
|
|
lineGeometry = new BufferGeometry();
|
|
lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );
|
|
|
|
coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );
|
|
coneGeometry.translate( 0, - 0.5, 0 );
|
|
|
|
}
|
|
|
|
this.position.copy( origin );
|
|
|
|
this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );
|
|
this.line.matrixAutoUpdate = false;
|
|
this.add( this.line );
|
|
|
|
this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );
|
|
this.cone.matrixAutoUpdate = false;
|
|
this.add( this.cone );
|
|
|
|
this.setDirection( dir );
|
|
this.setLength( length, headLength, headWidth );
|
|
|
|
}
|
|
|
|
ArrowHelper.prototype = Object.create( Object3D.prototype );
|
|
ArrowHelper.prototype.constructor = ArrowHelper;
|
|
|
|
ArrowHelper.prototype.setDirection = ( function () {
|
|
|
|
var axis = new Vector3();
|
|
var radians;
|
|
|
|
return function setDirection( dir ) {
|
|
|
|
// dir is assumed to be normalized
|
|
|
|
if ( dir.y > 0.99999 ) {
|
|
|
|
this.quaternion.set( 0, 0, 0, 1 );
|
|
|
|
} else if ( dir.y < - 0.99999 ) {
|
|
|
|
this.quaternion.set( 1, 0, 0, 0 );
|
|
|
|
} else {
|
|
|
|
axis.set( dir.z, 0, - dir.x ).normalize();
|
|
|
|
radians = Math.acos( dir.y );
|
|
|
|
this.quaternion.setFromAxisAngle( axis, radians );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}() );
|
|
|
|
ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {
|
|
|
|
if ( headLength === undefined ) headLength = 0.2 * length;
|
|
if ( headWidth === undefined ) headWidth = 0.2 * headLength;
|
|
|
|
this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );
|
|
this.line.updateMatrix();
|
|
|
|
this.cone.scale.set( headWidth, headLength, headWidth );
|
|
this.cone.position.y = length;
|
|
this.cone.updateMatrix();
|
|
|
|
};
|
|
|
|
ArrowHelper.prototype.setColor = function ( color ) {
|
|
|
|
this.line.material.color.copy( color );
|
|
this.cone.material.color.copy( color );
|
|
|
|
};
|
|
|
|
/**
|
|
* @author sroucheray / http://sroucheray.org/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
|
|
function AxisHelper( size ) {
|
|
|
|
size = size || 1;
|
|
|
|
var vertices = [
|
|
0, 0, 0, size, 0, 0,
|
|
0, 0, 0, 0, size, 0,
|
|
0, 0, 0, 0, 0, size
|
|
];
|
|
|
|
var colors = [
|
|
1, 0, 0, 1, 0.6, 0,
|
|
0, 1, 0, 0.6, 1, 0,
|
|
0, 0, 1, 0, 0.6, 1
|
|
];
|
|
|
|
var geometry = new BufferGeometry();
|
|
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
|
|
|
|
var material = new LineBasicMaterial( { vertexColors: VertexColors } );
|
|
|
|
LineSegments.call( this, geometry, material );
|
|
|
|
}
|
|
|
|
AxisHelper.prototype = Object.create( LineSegments.prototype );
|
|
AxisHelper.prototype.constructor = AxisHelper;
|
|
|
|
/**
|
|
* @author zz85 https://github.com/zz85
|
|
*
|
|
* Centripetal CatmullRom Curve - which is useful for avoiding
|
|
* cusps and self-intersections in non-uniform catmull rom curves.
|
|
* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf
|
|
*
|
|
* curve.type accepts centripetal(default), chordal and catmullrom
|
|
* curve.tension is used for catmullrom which defaults to 0.5
|
|
*/
|
|
|
|
|
|
/*
|
|
Based on an optimized c++ solution in
|
|
- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/
|
|
- http://ideone.com/NoEbVM
|
|
|
|
This CubicPoly class could be used for reusing some variables and calculations,
|
|
but for three.js curve use, it could be possible inlined and flatten into a single function call
|
|
which can be placed in CurveUtils.
|
|
*/
|
|
|
|
function CubicPoly() {
|
|
|
|
var c0 = 0, c1 = 0, c2 = 0, c3 = 0;
|
|
|
|
/*
|
|
* Compute coefficients for a cubic polynomial
|
|
* p(s) = c0 + c1*s + c2*s^2 + c3*s^3
|
|
* such that
|
|
* p(0) = x0, p(1) = x1
|
|
* and
|
|
* p'(0) = t0, p'(1) = t1.
|
|
*/
|
|
function init( x0, x1, t0, t1 ) {
|
|
|
|
c0 = x0;
|
|
c1 = t0;
|
|
c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;
|
|
c3 = 2 * x0 - 2 * x1 + t0 + t1;
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
initCatmullRom: function ( x0, x1, x2, x3, tension ) {
|
|
|
|
init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );
|
|
|
|
},
|
|
|
|
initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {
|
|
|
|
// compute tangents when parameterized in [t1,t2]
|
|
var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;
|
|
var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;
|
|
|
|
// rescale tangents for parametrization in [0,1]
|
|
t1 *= dt1;
|
|
t2 *= dt1;
|
|
|
|
init( x1, x2, t1, t2 );
|
|
|
|
},
|
|
|
|
calc: function ( t ) {
|
|
|
|
var t2 = t * t;
|
|
var t3 = t2 * t;
|
|
return c0 + c1 * t + c2 * t2 + c3 * t3;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
//
|
|
|
|
var tmp = new Vector3();
|
|
var px = new CubicPoly();
|
|
var py = new CubicPoly();
|
|
var pz = new CubicPoly();
|
|
|
|
function CatmullRomCurve3( p /* array of Vector3 */ ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.points = p || [];
|
|
this.closed = false;
|
|
|
|
}
|
|
|
|
CatmullRomCurve3.prototype = Object.create( Curve.prototype );
|
|
CatmullRomCurve3.prototype.constructor = CatmullRomCurve3;
|
|
|
|
CatmullRomCurve3.prototype.getPoint = function ( t ) {
|
|
|
|
var points = this.points;
|
|
var l = points.length;
|
|
|
|
if ( l < 2 ) console.log( 'duh, you need at least 2 points' );
|
|
|
|
var point = ( l - ( this.closed ? 0 : 1 ) ) * t;
|
|
var intPoint = Math.floor( point );
|
|
var weight = point - intPoint;
|
|
|
|
if ( this.closed ) {
|
|
|
|
intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;
|
|
|
|
} else if ( weight === 0 && intPoint === l - 1 ) {
|
|
|
|
intPoint = l - 2;
|
|
weight = 1;
|
|
|
|
}
|
|
|
|
var p0, p1, p2, p3; // 4 points
|
|
|
|
if ( this.closed || intPoint > 0 ) {
|
|
|
|
p0 = points[ ( intPoint - 1 ) % l ];
|
|
|
|
} else {
|
|
|
|
// extrapolate first point
|
|
tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );
|
|
p0 = tmp;
|
|
|
|
}
|
|
|
|
p1 = points[ intPoint % l ];
|
|
p2 = points[ ( intPoint + 1 ) % l ];
|
|
|
|
if ( this.closed || intPoint + 2 < l ) {
|
|
|
|
p3 = points[ ( intPoint + 2 ) % l ];
|
|
|
|
} else {
|
|
|
|
// extrapolate last point
|
|
tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );
|
|
p3 = tmp;
|
|
|
|
}
|
|
|
|
if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {
|
|
|
|
// init Centripetal / Chordal Catmull-Rom
|
|
var pow = this.type === 'chordal' ? 0.5 : 0.25;
|
|
var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );
|
|
var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );
|
|
var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );
|
|
|
|
// safety check for repeated points
|
|
if ( dt1 < 1e-4 ) dt1 = 1.0;
|
|
if ( dt0 < 1e-4 ) dt0 = dt1;
|
|
if ( dt2 < 1e-4 ) dt2 = dt1;
|
|
|
|
px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );
|
|
py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );
|
|
pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );
|
|
|
|
} else if ( this.type === 'catmullrom' ) {
|
|
|
|
var tension = this.tension !== undefined ? this.tension : 0.5;
|
|
px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );
|
|
py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );
|
|
pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );
|
|
|
|
}
|
|
|
|
return new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );
|
|
|
|
};
|
|
|
|
function CubicBezierCurve3( v0, v1, v2, v3 ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.v0 = v0;
|
|
this.v1 = v1;
|
|
this.v2 = v2;
|
|
this.v3 = v3;
|
|
|
|
}
|
|
|
|
CubicBezierCurve3.prototype = Object.create( Curve.prototype );
|
|
CubicBezierCurve3.prototype.constructor = CubicBezierCurve3;
|
|
|
|
CubicBezierCurve3.prototype.getPoint = function ( t ) {
|
|
|
|
var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;
|
|
|
|
return new Vector3(
|
|
CubicBezier( t, v0.x, v1.x, v2.x, v3.x ),
|
|
CubicBezier( t, v0.y, v1.y, v2.y, v3.y ),
|
|
CubicBezier( t, v0.z, v1.z, v2.z, v3.z )
|
|
);
|
|
|
|
};
|
|
|
|
function QuadraticBezierCurve3( v0, v1, v2 ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.v0 = v0;
|
|
this.v1 = v1;
|
|
this.v2 = v2;
|
|
|
|
}
|
|
|
|
QuadraticBezierCurve3.prototype = Object.create( Curve.prototype );
|
|
QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;
|
|
|
|
QuadraticBezierCurve3.prototype.getPoint = function ( t ) {
|
|
|
|
var v0 = this.v0, v1 = this.v1, v2 = this.v2;
|
|
|
|
return new Vector3(
|
|
QuadraticBezier( t, v0.x, v1.x, v2.x ),
|
|
QuadraticBezier( t, v0.y, v1.y, v2.y ),
|
|
QuadraticBezier( t, v0.z, v1.z, v2.z )
|
|
);
|
|
|
|
};
|
|
|
|
function LineCurve3( v1, v2 ) {
|
|
|
|
Curve.call( this );
|
|
|
|
this.v1 = v1;
|
|
this.v2 = v2;
|
|
|
|
}
|
|
|
|
LineCurve3.prototype = Object.create( Curve.prototype );
|
|
LineCurve3.prototype.constructor = LineCurve3;
|
|
|
|
LineCurve3.prototype.getPoint = function ( t ) {
|
|
|
|
if ( t === 1 ) {
|
|
|
|
return this.v2.clone();
|
|
|
|
}
|
|
|
|
var vector = new Vector3();
|
|
|
|
vector.subVectors( this.v2, this.v1 ); // diff
|
|
vector.multiplyScalar( t );
|
|
vector.add( this.v1 );
|
|
|
|
return vector;
|
|
|
|
};
|
|
|
|
function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
|
|
|
|
EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
|
|
|
|
}
|
|
|
|
ArcCurve.prototype = Object.create( EllipseCurve.prototype );
|
|
ArcCurve.prototype.constructor = ArcCurve;
|
|
|
|
//
|
|
|
|
Curve.create = function ( construct, getPoint ) {
|
|
|
|
console.log( 'THREE.Curve.create() has been deprecated' );
|
|
|
|
construct.prototype = Object.create( Curve.prototype );
|
|
construct.prototype.constructor = construct;
|
|
construct.prototype.getPoint = getPoint;
|
|
|
|
return construct;
|
|
|
|
};
|
|
|
|
//
|
|
|
|
function Spline( points ) {
|
|
|
|
console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );
|
|
|
|
CatmullRomCurve3.call( this, points );
|
|
this.type = 'catmullrom';
|
|
|
|
}
|
|
|
|
Spline.prototype = Object.create( CatmullRomCurve3.prototype );
|
|
|
|
Object.assign( Spline.prototype, {
|
|
|
|
initFromArray: function ( a ) {
|
|
|
|
console.error( 'THREE.Spline: .initFromArray() has been removed.' );
|
|
|
|
},
|
|
getControlPointsArray: function ( optionalTarget ) {
|
|
|
|
console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );
|
|
|
|
},
|
|
reparametrizeByArcLength: function ( samplingCoef ) {
|
|
|
|
console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
GridHelper.prototype.setColors = function () {
|
|
|
|
console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );
|
|
|
|
};
|
|
|
|
//
|
|
|
|
Object.assign( Box2.prototype, {
|
|
|
|
center: function ( optionalTarget ) {
|
|
|
|
console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );
|
|
return this.getCenter( optionalTarget );
|
|
|
|
},
|
|
empty: function () {
|
|
|
|
console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );
|
|
return this.isEmpty();
|
|
|
|
},
|
|
isIntersectionBox: function ( box ) {
|
|
|
|
console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );
|
|
return this.intersectsBox( box );
|
|
|
|
},
|
|
size: function ( optionalTarget ) {
|
|
|
|
console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );
|
|
return this.getSize( optionalTarget );
|
|
|
|
}
|
|
} );
|
|
|
|
Object.assign( Box3.prototype, {
|
|
|
|
center: function ( optionalTarget ) {
|
|
|
|
console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );
|
|
return this.getCenter( optionalTarget );
|
|
|
|
},
|
|
empty: function () {
|
|
|
|
console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );
|
|
return this.isEmpty();
|
|
|
|
},
|
|
isIntersectionBox: function ( box ) {
|
|
|
|
console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );
|
|
return this.intersectsBox( box );
|
|
|
|
},
|
|
isIntersectionSphere: function ( sphere ) {
|
|
|
|
console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
|
|
return this.intersectsSphere( sphere );
|
|
|
|
},
|
|
size: function ( optionalTarget ) {
|
|
|
|
console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );
|
|
return this.getSize( optionalTarget );
|
|
|
|
}
|
|
} );
|
|
|
|
Line3.prototype.center = function ( optionalTarget ) {
|
|
|
|
console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );
|
|
return this.getCenter( optionalTarget );
|
|
|
|
};
|
|
|
|
_Math.random16 = function () {
|
|
|
|
console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );
|
|
return Math.random();
|
|
|
|
};
|
|
|
|
Object.assign( Matrix3.prototype, {
|
|
|
|
flattenToArrayOffset: function ( array, offset ) {
|
|
|
|
console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." );
|
|
return this.toArray( array, offset );
|
|
|
|
},
|
|
multiplyVector3: function ( vector ) {
|
|
|
|
console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
|
|
return vector.applyMatrix3( this );
|
|
|
|
},
|
|
multiplyVector3Array: function ( a ) {
|
|
|
|
console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );
|
|
return this.applyToVector3Array( a );
|
|
|
|
},
|
|
applyToBuffer: function( buffer, offset, length ) {
|
|
|
|
console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );
|
|
return this.applyToBufferAttribute( buffer );
|
|
|
|
},
|
|
applyToVector3Array: function( array, offset, length ) {
|
|
|
|
console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Matrix4.prototype, {
|
|
|
|
extractPosition: function ( m ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );
|
|
return this.copyPosition( m );
|
|
|
|
},
|
|
flattenToArrayOffset: function ( array, offset ) {
|
|
|
|
console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." );
|
|
return this.toArray( array, offset );
|
|
|
|
},
|
|
getPosition: function () {
|
|
|
|
var v1;
|
|
|
|
return function getPosition() {
|
|
|
|
if ( v1 === undefined ) v1 = new Vector3();
|
|
console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );
|
|
return v1.setFromMatrixColumn( this, 3 );
|
|
|
|
};
|
|
|
|
}(),
|
|
setRotationFromQuaternion: function ( q ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );
|
|
return this.makeRotationFromQuaternion( q );
|
|
|
|
},
|
|
multiplyToArray: function () {
|
|
|
|
console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );
|
|
|
|
},
|
|
multiplyVector3: function ( vector ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
|
|
return vector.applyMatrix4( this );
|
|
|
|
},
|
|
multiplyVector4: function ( vector ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
|
|
return vector.applyMatrix4( this );
|
|
|
|
},
|
|
multiplyVector3Array: function ( a ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );
|
|
return this.applyToVector3Array( a );
|
|
|
|
},
|
|
rotateAxis: function ( v ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );
|
|
v.transformDirection( this );
|
|
|
|
},
|
|
crossVector: function ( vector ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
|
|
return vector.applyMatrix4( this );
|
|
|
|
},
|
|
translate: function () {
|
|
|
|
console.error( 'THREE.Matrix4: .translate() has been removed.' );
|
|
|
|
},
|
|
rotateX: function () {
|
|
|
|
console.error( 'THREE.Matrix4: .rotateX() has been removed.' );
|
|
|
|
},
|
|
rotateY: function () {
|
|
|
|
console.error( 'THREE.Matrix4: .rotateY() has been removed.' );
|
|
|
|
},
|
|
rotateZ: function () {
|
|
|
|
console.error( 'THREE.Matrix4: .rotateZ() has been removed.' );
|
|
|
|
},
|
|
rotateByAxis: function () {
|
|
|
|
console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );
|
|
|
|
},
|
|
applyToBuffer: function( buffer, offset, length ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );
|
|
return this.applyToBufferAttribute( buffer );
|
|
|
|
},
|
|
applyToVector3Array: function( array, offset, length ) {
|
|
|
|
console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );
|
|
|
|
},
|
|
makeFrustum: function( left, right, bottom, top, near, far ) {
|
|
|
|
console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );
|
|
return this.makePerspective( left, right, top, bottom, near, far );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Plane.prototype.isIntersectionLine = function ( line ) {
|
|
|
|
console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );
|
|
return this.intersectsLine( line );
|
|
|
|
};
|
|
|
|
Quaternion.prototype.multiplyVector3 = function ( vector ) {
|
|
|
|
console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
|
|
return vector.applyQuaternion( this );
|
|
|
|
};
|
|
|
|
Object.assign( Ray.prototype, {
|
|
|
|
isIntersectionBox: function ( box ) {
|
|
|
|
console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );
|
|
return this.intersectsBox( box );
|
|
|
|
},
|
|
isIntersectionPlane: function ( plane ) {
|
|
|
|
console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );
|
|
return this.intersectsPlane( plane );
|
|
|
|
},
|
|
isIntersectionSphere: function ( sphere ) {
|
|
|
|
console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
|
|
return this.intersectsSphere( sphere );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Shape.prototype, {
|
|
|
|
extrude: function ( options ) {
|
|
|
|
console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );
|
|
return new ExtrudeGeometry( this, options );
|
|
|
|
},
|
|
makeGeometry: function ( options ) {
|
|
|
|
console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );
|
|
return new ShapeGeometry( this, options );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Vector2.prototype, {
|
|
|
|
fromAttribute: function ( attribute, index, offset ) {
|
|
|
|
console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );
|
|
return this.fromBufferAttribute( attribute, index, offset );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Vector3.prototype, {
|
|
|
|
setEulerFromRotationMatrix: function () {
|
|
|
|
console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
|
|
|
|
},
|
|
setEulerFromQuaternion: function () {
|
|
|
|
console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
|
|
|
|
},
|
|
getPositionFromMatrix: function ( m ) {
|
|
|
|
console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
|
|
return this.setFromMatrixPosition( m );
|
|
|
|
},
|
|
getScaleFromMatrix: function ( m ) {
|
|
|
|
console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
|
|
return this.setFromMatrixScale( m );
|
|
|
|
},
|
|
getColumnFromMatrix: function ( index, matrix ) {
|
|
|
|
console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
|
|
return this.setFromMatrixColumn( matrix, index );
|
|
|
|
},
|
|
applyProjection: function ( m ) {
|
|
|
|
console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );
|
|
return this.applyMatrix4( m );
|
|
|
|
},
|
|
fromAttribute: function ( attribute, index, offset ) {
|
|
|
|
console.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );
|
|
return this.fromBufferAttribute( attribute, index, offset );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( Vector4.prototype, {
|
|
|
|
fromAttribute: function ( attribute, index, offset ) {
|
|
|
|
console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );
|
|
return this.fromBufferAttribute( attribute, index, offset );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
Geometry.prototype.computeTangents = function () {
|
|
|
|
console.warn( 'THREE.Geometry: .computeTangents() has been removed.' );
|
|
|
|
};
|
|
|
|
Object.assign( Object3D.prototype, {
|
|
|
|
getChildByName: function ( name ) {
|
|
|
|
console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
|
|
return this.getObjectByName( name );
|
|
|
|
},
|
|
renderDepth: function () {
|
|
|
|
console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );
|
|
|
|
},
|
|
translate: function ( distance, axis ) {
|
|
|
|
console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
|
|
return this.translateOnAxis( axis, distance );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( Object3D.prototype, {
|
|
|
|
eulerOrder: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
|
|
return this.rotation.order;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
|
|
this.rotation.order = value;
|
|
|
|
}
|
|
},
|
|
useQuaternion: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
|
|
|
|
},
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( LOD.prototype, {
|
|
|
|
objects: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.LOD: .objects has been renamed to .levels.' );
|
|
return this.levels;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperty( Skeleton.prototype, 'useVertexTexture', {
|
|
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );
|
|
|
|
},
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperty( Curve.prototype, '__arcLengthDivisions', {
|
|
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );
|
|
return this.arcLengthDivisions;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );
|
|
this.arcLengthDivisions = value;
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {
|
|
|
|
console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " +
|
|
"Use .setFocalLength and .filmGauge for a photographic setup." );
|
|
|
|
if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
|
|
this.setFocalLength( focalLength );
|
|
|
|
};
|
|
|
|
//
|
|
|
|
Object.defineProperties( Light.prototype, {
|
|
onlyShadow: {
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Light: .onlyShadow has been removed.' );
|
|
|
|
}
|
|
},
|
|
shadowCameraFov: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );
|
|
this.shadow.camera.fov = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraLeft: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );
|
|
this.shadow.camera.left = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraRight: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );
|
|
this.shadow.camera.right = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraTop: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );
|
|
this.shadow.camera.top = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraBottom: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );
|
|
this.shadow.camera.bottom = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraNear: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );
|
|
this.shadow.camera.near = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraFar: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );
|
|
this.shadow.camera.far = value;
|
|
|
|
}
|
|
},
|
|
shadowCameraVisible: {
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );
|
|
|
|
}
|
|
},
|
|
shadowBias: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );
|
|
this.shadow.bias = value;
|
|
|
|
}
|
|
},
|
|
shadowDarkness: {
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Light: .shadowDarkness has been removed.' );
|
|
|
|
}
|
|
},
|
|
shadowMapWidth: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );
|
|
this.shadow.mapSize.width = value;
|
|
|
|
}
|
|
},
|
|
shadowMapHeight: {
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );
|
|
this.shadow.mapSize.height = value;
|
|
|
|
}
|
|
}
|
|
} );
|
|
|
|
//
|
|
|
|
Object.defineProperties( BufferAttribute.prototype, {
|
|
|
|
length: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );
|
|
return this.array.length;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
Object.assign( BufferGeometry.prototype, {
|
|
|
|
addIndex: function ( index ) {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );
|
|
this.setIndex( index );
|
|
|
|
},
|
|
addDrawCall: function ( start, count, indexOffset ) {
|
|
|
|
if ( indexOffset !== undefined ) {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );
|
|
|
|
}
|
|
console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );
|
|
this.addGroup( start, count );
|
|
|
|
},
|
|
clearDrawCalls: function () {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );
|
|
this.clearGroups();
|
|
|
|
},
|
|
computeTangents: function () {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );
|
|
|
|
},
|
|
computeOffsets: function () {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( BufferGeometry.prototype, {
|
|
|
|
drawcalls: {
|
|
get: function () {
|
|
|
|
console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );
|
|
return this.groups;
|
|
|
|
}
|
|
},
|
|
offsets: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );
|
|
return this.groups;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
Object.defineProperties( Uniform.prototype, {
|
|
|
|
dynamic: {
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );
|
|
|
|
}
|
|
},
|
|
onUpdate: {
|
|
value: function () {
|
|
|
|
console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );
|
|
return this;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
Object.defineProperties( Material.prototype, {
|
|
|
|
wrapAround: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.Material: .wrapAround has been removed.' );
|
|
|
|
},
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.Material: .wrapAround has been removed.' );
|
|
|
|
}
|
|
},
|
|
wrapRGB: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.Material: .wrapRGB has been removed.' );
|
|
return new Color();
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( MeshPhongMaterial.prototype, {
|
|
|
|
metal: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );
|
|
return false;
|
|
|
|
},
|
|
set: function () {
|
|
|
|
console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( ShaderMaterial.prototype, {
|
|
|
|
derivatives: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
|
|
return this.extensions.derivatives;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
|
|
this.extensions.derivatives = value;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
Object.assign( WebGLRenderer.prototype, {
|
|
|
|
getCurrentRenderTarget: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );
|
|
return this.getRenderTarget();
|
|
|
|
},
|
|
|
|
supportsFloatTextures: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
|
|
return this.extensions.get( 'OES_texture_float' );
|
|
|
|
},
|
|
supportsHalfFloatTextures: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
|
|
return this.extensions.get( 'OES_texture_half_float' );
|
|
|
|
},
|
|
supportsStandardDerivatives: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
|
|
return this.extensions.get( 'OES_standard_derivatives' );
|
|
|
|
},
|
|
supportsCompressedTextureS3TC: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
|
|
return this.extensions.get( 'WEBGL_compressed_texture_s3tc' );
|
|
|
|
},
|
|
supportsCompressedTexturePVRTC: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
|
|
return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );
|
|
|
|
},
|
|
supportsBlendMinMax: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
|
|
return this.extensions.get( 'EXT_blend_minmax' );
|
|
|
|
},
|
|
supportsVertexTextures: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );
|
|
return this.capabilities.vertexTextures;
|
|
|
|
},
|
|
supportsInstancedArrays: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' );
|
|
return this.extensions.get( 'ANGLE_instanced_arrays' );
|
|
|
|
},
|
|
enableScissorTest: function ( boolean ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );
|
|
this.setScissorTest( boolean );
|
|
|
|
},
|
|
initMaterial: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
|
|
|
|
},
|
|
addPrePlugin: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
|
|
|
|
},
|
|
addPostPlugin: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
|
|
|
|
},
|
|
updateShadowMap: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
Object.defineProperties( WebGLRenderer.prototype, {
|
|
|
|
shadowMapEnabled: {
|
|
get: function () {
|
|
|
|
return this.shadowMap.enabled;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
|
|
this.shadowMap.enabled = value;
|
|
|
|
}
|
|
},
|
|
shadowMapType: {
|
|
get: function () {
|
|
|
|
return this.shadowMap.type;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
|
|
this.shadowMap.type = value;
|
|
|
|
}
|
|
},
|
|
shadowMapCullFace: {
|
|
get: function () {
|
|
|
|
return this.shadowMap.cullFace;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );
|
|
this.shadowMap.cullFace = value;
|
|
|
|
}
|
|
}
|
|
} );
|
|
|
|
Object.defineProperties( WebGLShadowMap.prototype, {
|
|
|
|
cullFace: {
|
|
get: function () {
|
|
|
|
return this.renderReverseSided ? CullFaceFront : CullFaceBack;
|
|
|
|
},
|
|
set: function ( cullFace ) {
|
|
|
|
var value = ( cullFace !== CullFaceBack );
|
|
console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." );
|
|
this.renderReverseSided = value;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
Object.defineProperties( WebGLRenderTarget.prototype, {
|
|
|
|
wrapS: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
|
|
return this.texture.wrapS;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
|
|
this.texture.wrapS = value;
|
|
|
|
}
|
|
},
|
|
wrapT: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
|
|
return this.texture.wrapT;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
|
|
this.texture.wrapT = value;
|
|
|
|
}
|
|
},
|
|
magFilter: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
|
|
return this.texture.magFilter;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
|
|
this.texture.magFilter = value;
|
|
|
|
}
|
|
},
|
|
minFilter: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
|
|
return this.texture.minFilter;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
|
|
this.texture.minFilter = value;
|
|
|
|
}
|
|
},
|
|
anisotropy: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
|
|
return this.texture.anisotropy;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
|
|
this.texture.anisotropy = value;
|
|
|
|
}
|
|
},
|
|
offset: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
|
|
return this.texture.offset;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
|
|
this.texture.offset = value;
|
|
|
|
}
|
|
},
|
|
repeat: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
|
|
return this.texture.repeat;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
|
|
this.texture.repeat = value;
|
|
|
|
}
|
|
},
|
|
format: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
|
|
return this.texture.format;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
|
|
this.texture.format = value;
|
|
|
|
}
|
|
},
|
|
type: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
|
|
return this.texture.type;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
|
|
this.texture.type = value;
|
|
|
|
}
|
|
},
|
|
generateMipmaps: {
|
|
get: function () {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
|
|
return this.texture.generateMipmaps;
|
|
|
|
},
|
|
set: function ( value ) {
|
|
|
|
console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
|
|
this.texture.generateMipmaps = value;
|
|
|
|
}
|
|
}
|
|
|
|
} );
|
|
|
|
//
|
|
|
|
Audio.prototype.load = function ( file ) {
|
|
|
|
console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );
|
|
var scope = this;
|
|
var audioLoader = new AudioLoader();
|
|
audioLoader.load( file, function ( buffer ) {
|
|
|
|
scope.setBuffer( buffer );
|
|
|
|
} );
|
|
return this;
|
|
|
|
};
|
|
|
|
AudioAnalyser.prototype.getData = function () {
|
|
|
|
console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );
|
|
return this.getFrequencyData();
|
|
|
|
};
|
|
|
|
function _typeof(obj) {
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof = function (obj) {
|
|
return typeof obj;
|
|
};
|
|
} else {
|
|
_typeof = function (obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
};
|
|
}
|
|
|
|
return _typeof(obj);
|
|
}
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
|
|
function _defineProperties(target, props) {
|
|
for (var i = 0; i < props.length; i++) {
|
|
var descriptor = props[i];
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
descriptor.configurable = true;
|
|
if ("value" in descriptor) descriptor.writable = true;
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
}
|
|
}
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
return Constructor;
|
|
}
|
|
|
|
function _defineProperty(obj, key, value) {
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
function _inherits(subClass, superClass) {
|
|
if (typeof superClass !== "function" && superClass !== null) {
|
|
throw new TypeError("Super expression must either be null or a function");
|
|
}
|
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
constructor: {
|
|
value: subClass,
|
|
writable: true,
|
|
configurable: true
|
|
}
|
|
});
|
|
if (superClass) _setPrototypeOf(subClass, superClass);
|
|
}
|
|
|
|
function _getPrototypeOf(o) {
|
|
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
|
|
return o.__proto__ || Object.getPrototypeOf(o);
|
|
};
|
|
return _getPrototypeOf(o);
|
|
}
|
|
|
|
function _setPrototypeOf(o, p) {
|
|
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
|
|
o.__proto__ = p;
|
|
return o;
|
|
};
|
|
|
|
return _setPrototypeOf(o, p);
|
|
}
|
|
|
|
function _assertThisInitialized(self) {
|
|
if (self === void 0) {
|
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
function _possibleConstructorReturn(self, call) {
|
|
if (call && (typeof call === "object" || typeof call === "function")) {
|
|
return call;
|
|
}
|
|
|
|
return _assertThisInitialized(self);
|
|
}
|
|
|
|
function _toConsumableArray(arr) {
|
|
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
|
|
}
|
|
|
|
function _arrayWithoutHoles(arr) {
|
|
if (Array.isArray(arr)) {
|
|
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
|
|
|
|
return arr2;
|
|
}
|
|
}
|
|
|
|
function _iterableToArray(iter) {
|
|
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
|
|
}
|
|
|
|
function _nonIterableSpread() {
|
|
throw new TypeError("Invalid attempt to spread non-iterable instance");
|
|
}
|
|
|
|
var additional = {
|
|
wireframe: {
|
|
wireframe: 'boolean',
|
|
wireframeLinecap: ['butt', 'round', 'square'],
|
|
wireframeLinejoin: ['round', 'bevel', 'miter'],
|
|
wireframeLinewidth: 'number'
|
|
},
|
|
refr: {
|
|
reflectivity: 'number',
|
|
refractionRatio: 'number'
|
|
},
|
|
maps: {
|
|
map: 'texture',
|
|
alphaMap: 'texture',
|
|
envMap: 'texture',
|
|
lightMap: 'texture',
|
|
lightMapIntensity: 'number'
|
|
},
|
|
normal: {
|
|
normalMap: 'texture',
|
|
normalScale: 'number'
|
|
},
|
|
displacement: {
|
|
displacementScale: 'number',
|
|
displacementBias: 'number',
|
|
displacementMap: 'texture'
|
|
},
|
|
emissive: {
|
|
emissive: 'color',
|
|
emissiveMap: 'texture',
|
|
emissiveIntensity: 'number'
|
|
},
|
|
specular: {
|
|
specular: 'color',
|
|
specularMap: 'texture'
|
|
},
|
|
ao: {
|
|
aoMap: 'texture',
|
|
aoMapIntensity: 'number'
|
|
}
|
|
};
|
|
|
|
var add = function add(origin) {
|
|
for (var _len = arguments.length, addv = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
addv[_key - 1] = arguments[_key];
|
|
}
|
|
|
|
return Object.assign.apply(Object, [origin].concat(_toConsumableArray(addv.map(function (value) {
|
|
return additional[value];
|
|
}))));
|
|
};
|
|
|
|
var materials = {
|
|
any: add({
|
|
side: {
|
|
FrontSide: FrontSide,
|
|
BackSide: BackSide,
|
|
DoubleSide: DoubleSide
|
|
},
|
|
shading: {
|
|
SmoothShading: SmoothShading,
|
|
FlatShading: FlatShading
|
|
},
|
|
blending: {
|
|
NoBlending: NoBlending,
|
|
NormalBlending: NormalBlending,
|
|
AdditiveBlending: AdditiveBlending,
|
|
SubtractiveBlending: SubtractiveBlending,
|
|
MultiplyBlending: MultiplyBlending,
|
|
CustomBlending: CustomBlending
|
|
},
|
|
depthFunc: {
|
|
NeverDepth: NeverDepth,
|
|
AlwaysDepth: AlwaysDepth,
|
|
LessDepth: LessDepth,
|
|
LessEqualDepth: LessEqualDepth,
|
|
GreaterEqualDepth: GreaterEqualDepth,
|
|
GreaterDepth: GreaterDepth,
|
|
NotEqualDepth: NotEqualDepth
|
|
}
|
|
}, 'wireframe'),
|
|
MeshBasicMaterial: {
|
|
color: 'color',
|
|
lights: 'boolean',
|
|
linewidth: 'number',
|
|
linecap: ['butt', 'round', 'square'],
|
|
linejoin: ['round', 'bevel', 'miter']
|
|
},
|
|
MeshLambertMaterial: add({
|
|
color: 'color',
|
|
skinning: 'boolean',
|
|
morphTargets: 'boolean',
|
|
morphNormals: 'boolean'
|
|
}, 'emissive', 'refr', 'maps', 'normal', 'specular', 'ao'),
|
|
MeshPhongMaterial: add({
|
|
color: 'color',
|
|
skinning: 'boolean',
|
|
morphTargets: 'boolean',
|
|
morphNormals: 'boolean'
|
|
}, 'displacement', 'emissive', 'maps', 'refr', 'specular', 'ao'),
|
|
MeshDepthMaterial: {} // To be continued...
|
|
|
|
};
|
|
|
|
var DatAPI =
|
|
/*#__PURE__*/
|
|
function () {
|
|
function DatAPI() {
|
|
_classCallCheck(this, DatAPI);
|
|
}
|
|
|
|
_createClass(DatAPI, [{
|
|
key: "foldObject",
|
|
value: function foldObject(object, origin) {
|
|
var instance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.fold;
|
|
var onChange = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
|
|
|
|
for (var key in origin) {
|
|
var value = object[key];
|
|
if (!value) continue;
|
|
|
|
if (value.isColor) {
|
|
this.addColor(object, key, instance);
|
|
} else if (_typeof(origin[key]) === 'object') {
|
|
if (object[key] === object) continue;
|
|
this.foldObject(object[key], origin[key], instance.addFolder(key));
|
|
} else {
|
|
// let range = '1' + '0'.repeat(value.toString().length);
|
|
// if (value.toString().indexOf('.') !== -1) range = 1;
|
|
instance.add(object, key).min(0).step(0.001).onChange(onChange);
|
|
}
|
|
}
|
|
}
|
|
}, {
|
|
key: "guiTransforms",
|
|
value: function guiTransforms(native) {
|
|
var instance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.fold;
|
|
if (!this.params.transforms) return;
|
|
var controller = instance.addFolder('transforms'); // position
|
|
|
|
var position = controller.addFolder('position');
|
|
position.add(native.position, 'x');
|
|
position.add(native.position, 'y');
|
|
position.add(native.position, 'z'); // rotation
|
|
|
|
var rotation = controller.addFolder('rotation');
|
|
rotation.add(native.rotation, 'x').step(0.1);
|
|
rotation.add(native.rotation, 'y').step(0.1);
|
|
rotation.add(native.rotation, 'z').step(0.1); // scale
|
|
|
|
if (!native.scale) return;
|
|
var scale = controller.addFolder('scale');
|
|
scale.add(native.scale, 'x').step(0.1);
|
|
scale.add(native.scale, 'y').step(0.1);
|
|
scale.add(native.scale, 'z').step(0.1);
|
|
}
|
|
}]);
|
|
return DatAPI;
|
|
}();
|
|
|
|
var DatMeshModule =
|
|
/*#__PURE__*/
|
|
function (_DatAPI) {
|
|
function DatMeshModule() {
|
|
var _this;
|
|
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 ? arguments[1] : undefined;
|
|
_classCallCheck(this, DatMeshModule);
|
|
_this = _possibleConstructorReturn(this, _getPrototypeOf(DatMeshModule).call(this));
|
|
_defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "bridge", {
|
|
material: function material(_material, self) {
|
|
if (!self.params.material) return _material;
|
|
var folder = self.fold.addFolder('material');
|
|
self.guiMaterial(this, _material, folder);
|
|
return _material;
|
|
},
|
|
geometry: function geometry(_geometry, self) {
|
|
if (!self.params.geometry) return _geometry;
|
|
if (!this.g_) throw new Error('WHS.DynamicGeometryModule should be used in a component (before gui)');
|
|
var folder = self.fold.addFolder('geometry');
|
|
self.guiGeometry(this, folder);
|
|
return _geometry;
|
|
},
|
|
mesh: function mesh(_mesh, self) {
|
|
var _this2 = this;
|
|
|
|
if (!self.customMaterials) return _mesh;
|
|
self.customMaterials.current = _mesh.material; // const matAlias = {material: 'current'};
|
|
|
|
var keys = Object.keys(self.customMaterials);
|
|
var folder = self.fold;
|
|
folder.add({
|
|
type: 'current'
|
|
}, 'type', keys).onChange(function (v) {
|
|
_mesh.material = self.customMaterials[v];
|
|
folder.removeFolder('material');
|
|
self.guiMaterial(_this2, _mesh.material, folder.addFolder('material'));
|
|
});
|
|
return _mesh;
|
|
},
|
|
onWrap: function onWrap(a, self) {
|
|
self.guiTransforms(this.native, self.fold);
|
|
}
|
|
});
|
|
_this.params = Object.assign({
|
|
name: 'Unknown mesh',
|
|
geometry: true,
|
|
material: true,
|
|
transforms: true,
|
|
gui: false
|
|
}, params);
|
|
_this.gui = gui;
|
|
_this.fold = _this.gui.addFolder(_this.params.name);
|
|
_this.customMaterials = false;
|
|
return _this;
|
|
}
|
|
|
|
_createClass(DatMeshModule, [{
|
|
key: "addColor",
|
|
value: function addColor(object, property) {
|
|
var instance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.fold;
|
|
var color = object[property];
|
|
instance.addColor(_defineProperty({}, property, color.getHex()), property).onChange(function (value) {
|
|
if (typeof value === 'string') value.replace('#', '0x');
|
|
color.setHex(value);
|
|
});
|
|
}
|
|
}, {
|
|
key: "guiMaterial",
|
|
value: function guiMaterial(component, material) {
|
|
var _this3 = this;
|
|
|
|
var instance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.fold;
|
|
|
|
var paramsProcessor = function paramsProcessor(params) {
|
|
for (var key in params) {
|
|
if (params[key] && material[key] !== undefined) {
|
|
switch (params[key]) {
|
|
case 'color':
|
|
_this3.addColor(material, key, instance);
|
|
|
|
break;
|
|
|
|
case 'boolean':
|
|
instance.add(material, key);
|
|
break;
|
|
|
|
case 'number':
|
|
instance.add(material, key);
|
|
break;
|
|
|
|
case 'texture':
|
|
// TODO
|
|
break;
|
|
|
|
default:
|
|
instance.add(material, key, params[key]);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
paramsProcessor(materials[material.type]);
|
|
paramsProcessor(materials.any);
|
|
}
|
|
}, {
|
|
key: "guiGeometry",
|
|
value: function guiGeometry(component) {
|
|
var instance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.fold;
|
|
if (!component.g_) throw new Error('DatGUIModule requires WHS.DynamicGeometryModule for geometry updates.');
|
|
var geomParams = component.params.geometry;
|
|
var geomData = this.params.geometry;
|
|
|
|
var _loop = function _loop(key) {
|
|
var data = geomData[key];
|
|
var range = data && data.range ? data.range : [0, 100];
|
|
instance.add(geomParams, key).min(range[0]).max(range[1]).step(key.indexOf('Segments') > 0 ? 1 : 0.1).onChange(function (value) {
|
|
component.g_(_defineProperty({}, key, value));
|
|
});
|
|
};
|
|
|
|
for (var key in geomParams) {
|
|
_loop(key);
|
|
}
|
|
}
|
|
}, {
|
|
key: "materials",
|
|
value: function materials$$1() {
|
|
var _materials = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
|
this.customMaterials = _materials;
|
|
return this;
|
|
}
|
|
}]);
|
|
_inherits(DatMeshModule, _DatAPI);
|
|
return DatMeshModule;
|
|
}(DatAPI);
|
|
|
|
var DatLightModule =
|
|
/*#__PURE__*/
|
|
function (_DatAPI) {
|
|
function DatLightModule() {
|
|
var _this;
|
|
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 ? arguments[1] : undefined;
|
|
_classCallCheck(this, DatLightModule);
|
|
_this = _possibleConstructorReturn(this, _getPrototypeOf(DatLightModule).call(this));
|
|
_defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "bridge", {
|
|
light: function light(_light, self) {
|
|
if (!self.params.light) return _light;
|
|
var lightParams = Object.assign({}, this.params);
|
|
delete lightParams.position;
|
|
delete lightParams.rotation;
|
|
delete lightParams.shadow;
|
|
self.foldObject(_light, lightParams, self.fold.addFolder('light'));
|
|
|
|
if (_light.shadow) {
|
|
var shadowFolder = self.fold.addFolder('shadow');
|
|
self.foldObject(_light.shadow, this.params.shadow, shadowFolder);
|
|
console.log(_light);
|
|
shadowFolder.add(_light, 'castShadow');
|
|
}
|
|
|
|
return _light;
|
|
},
|
|
onWrap: function onWrap(a, self) {
|
|
self.guiTransforms(this.native, self.fold);
|
|
}
|
|
});
|
|
_this.params = Object.assign({
|
|
name: 'Unknown light',
|
|
light: true,
|
|
shadow: true,
|
|
transforms: true,
|
|
gui: false
|
|
}, params);
|
|
_this.gui = gui;
|
|
_this.fold = _this.gui.addFolder(_this.params.name);
|
|
return _this;
|
|
}
|
|
|
|
_createClass(DatLightModule, [{
|
|
key: "addColor",
|
|
value: function addColor(object, property) {
|
|
var instance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.fold;
|
|
var color = object[property];
|
|
instance.addColor(_defineProperty({}, property, color.getHex()), property).onChange(function (value) {
|
|
if (typeof value === 'string') value.replace('#', '0x');
|
|
color.setHex(value);
|
|
});
|
|
}
|
|
}]);
|
|
_inherits(DatLightModule, _DatAPI);
|
|
return DatLightModule;
|
|
}(DatAPI);
|
|
|
|
var DatCameraModule =
|
|
/*#__PURE__*/
|
|
function (_DatAPI) {
|
|
function DatCameraModule() {
|
|
var _this;
|
|
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 ? arguments[1] : undefined;
|
|
_classCallCheck(this, DatCameraModule);
|
|
_this = _possibleConstructorReturn(this, _getPrototypeOf(DatCameraModule).call(this));
|
|
_defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "bridge", {
|
|
camera: function camera(_camera, self) {
|
|
if (!self.params.camera) return _camera;
|
|
self.foldObject(_camera, this.params, self.fold, function () {
|
|
_camera.updateProjectionMatrix();
|
|
});
|
|
return _camera;
|
|
},
|
|
onWrap: function onWrap(a, self) {
|
|
self.guiTransforms(this.native, self.fold);
|
|
}
|
|
});
|
|
_this.params = Object.assign({
|
|
name: 'Unknown camera',
|
|
transforms: true,
|
|
camera: true
|
|
}, params);
|
|
_this.gui = gui;
|
|
_this.fold = _this.gui.addFolder(_this.params.name);
|
|
return _this;
|
|
}
|
|
|
|
_inherits(DatCameraModule, _DatAPI);
|
|
return DatCameraModule;
|
|
}(DatAPI);
|
|
|
|
var DatCustomModule =
|
|
/*#__PURE__*/
|
|
function () {
|
|
function DatCustomModule() {
|
|
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
var gui = arguments.length > 1 ? arguments[1] : undefined;
|
|
_classCallCheck(this, DatCustomModule);
|
|
this.props = props;
|
|
this.gui = gui;
|
|
props.forEach(this.add.bind(this));
|
|
}
|
|
|
|
_createClass(DatCustomModule, [{
|
|
key: "add",
|
|
value: function add(_ref) {
|
|
var name = _ref.name,
|
|
value = _ref.value,
|
|
_ref$range = _ref.range,
|
|
range = _ref$range === void 0 ? [false, false] : _ref$range,
|
|
_ref$step = _ref.step,
|
|
onChange = _ref.onChange,
|
|
onFinishChange = _ref.onFinishChange,
|
|
_ref$listen = _ref.listen,
|
|
listen = _ref$listen === void 0 ? false : _ref$listen;
|
|
var controller = this.gui.add(_defineProperty({}, name, value), name, range[0] || 0, range[1] || 1);
|
|
controller.onChange(onChange);
|
|
if (onFinishChange) controller.onFinishChange(onFinishChange);
|
|
if (listen) controller.listen();
|
|
return controller;
|
|
}
|
|
}]);
|
|
return DatCustomModule;
|
|
}();
|
|
|
|
index.GUI.prototype.removeFolder = function (name) {
|
|
var folder = this.__folders[name];
|
|
|
|
if (!folder) {
|
|
return;
|
|
}
|
|
|
|
folder.close();
|
|
|
|
this.__ul.removeChild(folder.domElement.parentNode);
|
|
|
|
delete this.__folders[name];
|
|
this.onResize();
|
|
};
|
|
|
|
var DatGUIModule =
|
|
/*#__PURE__*/
|
|
function () {
|
|
_createClass(DatGUIModule, null, [{
|
|
key: "new",
|
|
value: function _new(params) {
|
|
return new DatGUIModule(new index.GUI(params));
|
|
}
|
|
}]);
|
|
|
|
function DatGUIModule() {
|
|
var gui = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new index.GUI({
|
|
autoPlace: false
|
|
});
|
|
_classCallCheck(this, DatGUIModule);
|
|
this.gui = gui;
|
|
}
|
|
|
|
_createClass(DatGUIModule, [{
|
|
key: "manager",
|
|
value: function manager(_manager) {
|
|
_manager.define('gui/dat.gui');
|
|
|
|
var dom = this.gui.domElement;
|
|
var style = dom.style;
|
|
style.position = 'absolute';
|
|
style.top = 0;
|
|
style.right = '20px';
|
|
|
|
_manager.get('element').appendChild(this.gui.domElement);
|
|
}
|
|
}, {
|
|
key: "set",
|
|
value: function set(gui) {
|
|
this.gui = gui;
|
|
return this;
|
|
}
|
|
}, {
|
|
key: "folder",
|
|
value: function folder() {
|
|
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'folder';
|
|
return new DatGUIModule(this.gui.addFolder(name));
|
|
}
|
|
}, {
|
|
key: "Mesh",
|
|
value: function Mesh() {
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.gui;
|
|
return new DatMeshModule(params, gui);
|
|
}
|
|
}, {
|
|
key: "Light",
|
|
value: function Light() {
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.gui;
|
|
return new DatLightModule(params, gui);
|
|
}
|
|
}, {
|
|
key: "Camera",
|
|
value: function Camera() {
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.gui;
|
|
return new DatCameraModule(params, gui);
|
|
}
|
|
}, {
|
|
key: "Custom",
|
|
value: function Custom() {
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
var gui = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.gui;
|
|
return new DatCustomModule(params, gui);
|
|
}
|
|
}]);
|
|
return DatGUIModule;
|
|
}();
|
|
DatGUIModule.dat = index;
|
|
|
|
return DatGUIModule;
|
|
|
|
})));
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0R1VJTW9kdWxlLmpzIiwic291cmNlcyI6WyIuLi9zcmMvbW9kdWxlcy9leHRyYS9ub2RlX21vZHVsZXMvZGF0LWd1aS92ZW5kb3IvZGF0Lmd1aS5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL25vZGVfbW9kdWxlcy9kYXQtZ3VpL3ZlbmRvci9kYXQuY29sb3IuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9ub2RlX21vZHVsZXMvZGF0LWd1aS9pbmRleC5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL25vZGVfbW9kdWxlcy90aHJlZS9idWlsZC90aHJlZS5tb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9kYXRndWkvbWF0ZXJpYWxzLmpzIiwiLi4vc3JjL21vZHVsZXMvZXh0cmEvZGF0Z3VpL0RhdEFQSS5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL2RhdGd1aS9EYXRNZXNoTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvZXh0cmEvZGF0Z3VpL0RhdExpZ2h0TW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvZXh0cmEvZGF0Z3VpL0RhdENhbWVyYU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL2RhdGd1aS9EYXRDdXN0b21Nb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9EYXRHVUlNb2R1bGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkYXQtZ3VpIEphdmFTY3JpcHQgQ29udHJvbGxlciBMaWJyYXJ5XG4gKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZGF0LWd1aVxuICpcbiAqIENvcHlyaWdodCAyMDExIERhdGEgQXJ0cyBUZWFtLCBHb29nbGUgQ3JlYXRpdmUgTGFiXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICovXG5cbi8qKiBAbmFtZXNwYWNlICovXG52YXIgZGF0ID0gbW9kdWxlLmV4cG9ydHMgPSBkYXQgfHwge307XG5cbi8qKiBAbmFtZXNwYWNlICovXG5kYXQuZ3VpID0gZGF0Lmd1aSB8fCB7fTtcblxuLyoqIEBuYW1lc3BhY2UgKi9cbmRhdC51dGlscyA9IGRhdC51dGlscyB8fCB7fTtcblxuLyoqIEBuYW1lc3BhY2UgKi9cbmRhdC5jb250cm9sbGVycyA9IGRhdC5jb250cm9sbGVycyB8fCB7fTtcblxuLyoqIEBuYW1lc3BhY2UgKi9cbmRhdC5kb20gPSBkYXQuZG9tIHx8IHt9O1xuXG4vKiogQG5hbWVzcGFjZSAqL1xuZGF0LmNvbG9yID0gZGF0LmNvbG9yIHx8IHt9O1xuXG5kYXQudXRpbHMuY3NzID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHtcbiAgICBsb2FkOiBmdW5jdGlvbiAodXJsLCBkb2MpIHtcbiAgICAgIGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcbiAgICAgIHZhciBsaW5rID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH0sXG4gICAgaW5qZWN0OiBmdW5jdGlvbihjc3MsIGRvYykge1xuICAgICAgZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuICAgICAgdmFyIGluamVjdGVkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIGluamVjdGVkLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgaW5qZWN0ZWQuaW5uZXJIVE1MID0gY3NzO1xuICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoaW5qZWN0ZWQpO1xuICAgIH1cbiAgfVxufSkoKTtcblxuXG5kYXQudXRpbHMuY29tbW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgXG4gIHZhciBBUlJfRUFDSCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xuICB2YXIgQVJSX1NMSUNFID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4gIC8qKlxuICAgKiBCYW5kLWFpZCBtZXRob2RzIGZvciB0aGluZ3MgdGhhdCBzaG91bGQgYmUgYSBsb3QgZWFzaWVyIGluIEphdmFTY3JpcHQuXG4gICAqIEltcGxlbWVudGF0aW9uIGFuZCBzdHJ1Y3R1cmUgaW5zcGlyZWQgYnkgdW5kZXJzY29yZS5qc1xuICAgKiBodHRwOi8vZG9jdW1lbnRjbG91ZC5naXRodWIuY29tL3VuZGVyc2NvcmUvXG4gICAqL1xuXG4gIHJldHVybiB7IFxuICAgIFxuICAgIEJSRUFLOiB7fSxcbiAgXG4gICAgZXh0ZW5kOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgIFxuICAgICAgdGhpcy5lYWNoKEFSUl9TTElDRS5jYWxsKGFyZ3VtZW50cywgMSksIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgICBpZiAoIXRoaXMuaXNVbmRlZmluZWQob2JqW2tleV0pKSBcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIFxuICAgICAgfSwgdGhpcyk7XG4gICAgICBcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICBcbiAgICB9LFxuICAgIFxuICAgIGRlZmF1bHRzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgIFxuICAgICAgdGhpcy5lYWNoKEFSUl9TTElDRS5jYWxsKGFyZ3VtZW50cywgMSksIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgICBpZiAodGhpcy5pc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIFxuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgXG4gICAgICB9LCB0aGlzKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICBcbiAgICB9LFxuICAgIFxuICAgIGNvbXBvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHRvQ2FsbCA9IEFSUl9TTElDRS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBhcmdzID0gQVJSX1NMSUNFLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRvQ2FsbC5sZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IFt0b0NhbGxbaV0uYXBwbHkodGhpcywgYXJncyldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhcmdzWzBdO1xuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgZWFjaDogZnVuY3Rpb24ob2JqLCBpdHIsIHNjb3BlKSB7XG5cbiAgICAgIFxuICAgICAgaWYgKEFSUl9FQUNIICYmIG9iai5mb3JFYWNoID09PSBBUlJfRUFDSCkgeyBcbiAgICAgICAgXG4gICAgICAgIG9iai5mb3JFYWNoKGl0ciwgc2NvcGUpO1xuICAgICAgICBcbiAgICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA9PT0gb2JqLmxlbmd0aCArIDApIHsgLy8gSXMgbnVtYmVyIGJ1dCBub3QgTmFOXG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciBrZXkgPSAwLCBsID0gb2JqLmxlbmd0aDsga2V5IDwgbDsga2V5KyspXG4gICAgICAgICAgaWYgKGtleSBpbiBvYmogJiYgaXRyLmNhbGwoc2NvcGUsIG9ialtrZXldLCBrZXkpID09PSB0aGlzLkJSRUFLKSBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBcbiAgICAgICAgICBpZiAoaXRyLmNhbGwoc2NvcGUsIG9ialtrZXldLCBrZXkpID09PSB0aGlzLkJSRUFLKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICB9XG4gICAgICAgICAgICBcbiAgICB9LFxuICAgIFxuICAgIGRlZmVyOiBmdW5jdGlvbihmbmMpIHtcbiAgICAgIHNldFRpbWVvdXQoZm5jLCAwKTtcbiAgICB9LFxuICAgIFxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgaWYgKG9iai50b0FycmF5KSByZXR1cm4gb2JqLnRvQXJyYXkoKTtcbiAgICAgIHJldHVybiBBUlJfU0xJQ0UuY2FsbChvYmopO1xuICAgIH0sXG5cbiAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBcbiAgICBpc051bGw6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbiAgICB9LFxuICAgIFxuICAgIGlzTmFOOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogIT09IG9iajtcbiAgICB9LFxuICAgIFxuICAgIGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqLmNvbnN0cnVjdG9yID09PSBBcnJheTtcbiAgICB9LFxuICAgIFxuICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogPT09IE9iamVjdChvYmopO1xuICAgIH0sXG4gICAgXG4gICAgaXNOdW1iZXI6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb2JqKzA7XG4gICAgfSxcbiAgICBcbiAgICBpc1N0cmluZzogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09PSBvYmorJyc7XG4gICAgfSxcbiAgICBcbiAgICBpc0Jvb2xlYW46IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gZmFsc2UgfHwgb2JqID09PSB0cnVlO1xuICAgIH0sXG4gICAgXG4gICAgaXNGdW5jdGlvbjogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICBcbiAgfTtcbiAgICBcbn0pKCk7XG5cblxuZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKGNvbW1vbikge1xuXG4gIC8qKlxuICAgKiBAY2xhc3MgQW4gXCJhYnN0cmFjdFwiIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGdpdmVuIHByb3BlcnR5IG9mIGFuIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgbWFuaXB1bGF0ZWRcbiAgICpcbiAgICogQG1lbWJlciBkYXQuY29udHJvbGxlcnNcbiAgICovXG4gIHZhciBDb250cm9sbGVyID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXG4gICAgdGhpcy5pbml0aWFsVmFsdWUgPSBvYmplY3RbcHJvcGVydHldO1xuXG4gICAgLyoqXG4gICAgICogVGhvc2Ugd2hvIGV4dGVuZCB0aGlzIGNsYXNzIHdpbGwgcHV0IHRoZWlyIERPTSBlbGVtZW50cyBpbiBoZXJlLlxuICAgICAqIEB0eXBlIHtET01FbGVtZW50fVxuICAgICAqL1xuICAgIHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9iamVjdCB0byBtYW5pcHVsYXRlXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBtYW5pcHVsYXRlXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGNoYW5nZS5cbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHRoaXMuX19vbkNoYW5nZSA9IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZmluaXNoaW5nIGNoYW5nZS5cbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHRoaXMuX19vbkZpbmlzaENoYW5nZSA9IHVuZGVmaW5lZDtcblxuICB9O1xuXG4gIGNvbW1vbi5leHRlbmQoXG5cbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLFxuXG4gICAgICAvKiogQGxlbmRzIGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyLnByb3RvdHlwZSAqL1xuICAgICAge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZ5IHRoYXQgYSBmdW5jdGlvbiBmaXJlIGV2ZXJ5IHRpbWUgc29tZW9uZSBjaGFuZ2VzIHRoZSB2YWx1ZSB3aXRoXG4gICAgICAgICAqIHRoaXMgQ29udHJvbGxlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5jIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHZhbHVlXG4gICAgICAgICAqIGlzIG1vZGlmaWVkIHZpYSB0aGlzIENvbnRyb2xsZXIuXG4gICAgICAgICAqIEByZXR1cm5zIHtkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcn0gdGhpc1xuICAgICAgICAgKi9cbiAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uKGZuYykge1xuICAgICAgICAgIHRoaXMuX19vbkNoYW5nZSA9IGZuYztcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmeSB0aGF0IGEgZnVuY3Rpb24gZmlyZSBldmVyeSB0aW1lIHNvbWVvbmUgXCJmaW5pc2hlc1wiIGNoYW5naW5nXG4gICAgICAgICAqIHRoZSB2YWx1ZSB3aWggdGhpcyBDb250cm9sbGVyLiBVc2VmdWwgZm9yIHZhbHVlcyB0aGF0IGNoYW5nZVxuICAgICAgICAgKiBpbmNyZW1lbnRhbGx5IGxpa2UgbnVtYmVycyBvciBzdHJpbmdzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbmMgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlclxuICAgICAgICAgKiBzb21lb25lIFwiZmluaXNoZXNcIiBjaGFuZ2luZyB0aGUgdmFsdWUgdmlhIHRoaXMgQ29udHJvbGxlci5cbiAgICAgICAgICogQHJldHVybnMge2RhdC5jb250cm9sbGVycy5Db250cm9sbGVyfSB0aGlzXG4gICAgICAgICAqL1xuICAgICAgICBvbkZpbmlzaENoYW5nZTogZnVuY3Rpb24oZm5jKSB7XG4gICAgICAgICAgdGhpcy5fX29uRmluaXNoQ2hhbmdlID0gZm5jO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIDxjb2RlPm9iamVjdFtwcm9wZXJ0eV08L2NvZGU+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIDxjb2RlPm9iamVjdFtwcm9wZXJ0eV08L2NvZGU+XG4gICAgICAgICAqL1xuICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9iamVjdFt0aGlzLnByb3BlcnR5XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgIGlmICh0aGlzLl9fb25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX19vbkNoYW5nZS5jYWxsKHRoaXMsIG5ld1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIDxjb2RlPm9iamVjdFtwcm9wZXJ0eV08L2NvZGU+XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBjdXJyZW50IHZhbHVlIG9mIDxjb2RlPm9iamVjdFtwcm9wZXJ0eV08L2NvZGU+XG4gICAgICAgICAqL1xuICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0W3RoaXMucHJvcGVydHldO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWZyZXNoZXMgdGhlIHZpc3VhbCBkaXNwbGF5IG9mIGEgQ29udHJvbGxlciBpbiBvcmRlciB0byBrZWVwIHN5bmNcbiAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0J3MgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgICogQHJldHVybnMge2RhdC5jb250cm9sbGVycy5Db250cm9sbGVyfSB0aGlzXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVEaXNwbGF5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIHZhbHVlIGhhcyBkZXZpYXRlZCBmcm9tIGluaXRpYWxWYWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgaXNNb2RpZmllZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlICE9PSB0aGlzLmdldFZhbHVlKClcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgKTtcblxuICByZXR1cm4gQ29udHJvbGxlcjtcblxuXG59KShkYXQudXRpbHMuY29tbW9uKTtcblxuXG5kYXQuZG9tLmRvbSA9IChmdW5jdGlvbiAoY29tbW9uKSB7XG5cbiAgdmFyIEVWRU5UX01BUCA9IHtcbiAgICAnSFRNTEV2ZW50cyc6IFsnY2hhbmdlJ10sXG4gICAgJ01vdXNlRXZlbnRzJzogWydjbGljaycsJ21vdXNlbW92ZScsJ21vdXNlZG93bicsJ21vdXNldXAnLCAnbW91c2VvdmVyJ10sXG4gICAgJ0tleWJvYXJkRXZlbnRzJzogWydrZXlkb3duJ11cbiAgfTtcblxuICB2YXIgRVZFTlRfTUFQX0lOViA9IHt9O1xuICBjb21tb24uZWFjaChFVkVOVF9NQVAsIGZ1bmN0aW9uKHYsIGspIHtcbiAgICBjb21tb24uZWFjaCh2LCBmdW5jdGlvbihlKSB7XG4gICAgICBFVkVOVF9NQVBfSU5WW2VdID0gaztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIENTU19WQUxVRV9QSVhFTFMgPSAvKFxcZCsoXFwuXFxkKyk/KXB4LztcblxuICBmdW5jdGlvbiBjc3NWYWx1ZVRvUGl4ZWxzKHZhbCkge1xuXG4gICAgaWYgKHZhbCA9PT0gJzAnIHx8IGNvbW1vbi5pc1VuZGVmaW5lZCh2YWwpKSByZXR1cm4gMDtcblxuICAgIHZhciBtYXRjaCA9IHZhbC5tYXRjaChDU1NfVkFMVUVfUElYRUxTKTtcblxuICAgIGlmICghY29tbW9uLmlzTnVsbChtYXRjaCkpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIC4uLmVtcz8gJT9cblxuICAgIHJldHVybiAwO1xuXG4gIH1cblxuICAvKipcbiAgICogQG5hbWVzcGFjZVxuICAgKiBAbWVtYmVyIGRhdC5kb21cbiAgICovXG4gIHZhciBkb20gPSB7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqIEBwYXJhbSBzZWxlY3RhYmxlXG4gICAgICovXG4gICAgbWFrZVNlbGVjdGFibGU6IGZ1bmN0aW9uKGVsZW0sIHNlbGVjdGFibGUpIHtcblxuICAgICAgaWYgKGVsZW0gPT09IHVuZGVmaW5lZCB8fCBlbGVtLnN0eWxlID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgZWxlbS5vbnNlbGVjdHN0YXJ0ID0gc2VsZWN0YWJsZSA/IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IDogZnVuY3Rpb24oKSB7XG4gICAgICB9O1xuXG4gICAgICBlbGVtLnN0eWxlLk1velVzZXJTZWxlY3QgPSBzZWxlY3RhYmxlID8gJ2F1dG8nIDogJ25vbmUnO1xuICAgICAgZWxlbS5zdHlsZS5LaHRtbFVzZXJTZWxlY3QgPSBzZWxlY3RhYmxlID8gJ2F1dG8nIDogJ25vbmUnO1xuICAgICAgZWxlbS51bnNlbGVjdGFibGUgPSBzZWxlY3RhYmxlID8gJ29uJyA6ICdvZmYnO1xuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1cbiAgICAgKiBAcGFyYW0gaG9yaXpvbnRhbFxuICAgICAqIEBwYXJhbSB2ZXJ0aWNhbFxuICAgICAqL1xuICAgIG1ha2VGdWxsc2NyZWVuOiBmdW5jdGlvbihlbGVtLCBob3Jpem9udGFsLCB2ZXJ0aWNhbCkge1xuXG4gICAgICBpZiAoY29tbW9uLmlzVW5kZWZpbmVkKGhvcml6b250YWwpKSBob3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgIGlmIChjb21tb24uaXNVbmRlZmluZWQodmVydGljYWwpKSB2ZXJ0aWNhbCA9IHRydWU7XG5cbiAgICAgIGVsZW0uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXG4gICAgICBpZiAoaG9yaXpvbnRhbCkge1xuICAgICAgICBlbGVtLnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICBlbGVtLnN0eWxlLnJpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBlbGVtLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIGVsZW0uc3R5bGUuYm90dG9tID0gMDtcbiAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtXG4gICAgICogQHBhcmFtIGV2ZW50VHlwZVxuICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgKi9cbiAgICBmYWtlRXZlbnQ6IGZ1bmN0aW9uKGVsZW0sIGV2ZW50VHlwZSwgcGFyYW1zLCBhdXgpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICAgIHZhciBjbGFzc05hbWUgPSBFVkVOVF9NQVBfSU5WW2V2ZW50VHlwZV07XG4gICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V2ZW50IHR5cGUgJyArIGV2ZW50VHlwZSArICcgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChjbGFzc05hbWUpO1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAnTW91c2VFdmVudHMnOlxuICAgICAgICAgIHZhciBjbGllbnRYID0gcGFyYW1zLnggfHwgcGFyYW1zLmNsaWVudFggfHwgMDtcbiAgICAgICAgICB2YXIgY2xpZW50WSA9IHBhcmFtcy55IHx8IHBhcmFtcy5jbGllbnRZIHx8IDA7XG4gICAgICAgICAgZXZ0LmluaXRNb3VzZUV2ZW50KGV2ZW50VHlwZSwgcGFyYW1zLmJ1YmJsZXMgfHwgZmFsc2UsXG4gICAgICAgICAgICAgIHBhcmFtcy5jYW5jZWxhYmxlIHx8IHRydWUsIHdpbmRvdywgcGFyYW1zLmNsaWNrQ291bnQgfHwgMSxcbiAgICAgICAgICAgICAgMCwgLy9zY3JlZW4gWFxuICAgICAgICAgICAgICAwLCAvL3NjcmVlbiBZXG4gICAgICAgICAgICAgIGNsaWVudFgsIC8vY2xpZW50IFhcbiAgICAgICAgICAgICAgY2xpZW50WSwgLy9jbGllbnQgWVxuICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0tleWJvYXJkRXZlbnRzJzpcbiAgICAgICAgICB2YXIgaW5pdCA9IGV2dC5pbml0S2V5Ym9hcmRFdmVudCB8fCBldnQuaW5pdEtleUV2ZW50OyAvLyB3ZWJraXQgfHwgbW96XG4gICAgICAgICAgY29tbW9uLmRlZmF1bHRzKHBhcmFtcywge1xuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGN0cmxLZXk6IGZhbHNlLFxuICAgICAgICAgICAgYWx0S2V5OiBmYWxzZSxcbiAgICAgICAgICAgIHNoaWZ0S2V5OiBmYWxzZSxcbiAgICAgICAgICAgIG1ldGFLZXk6IGZhbHNlLFxuICAgICAgICAgICAga2V5Q29kZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2hhckNvZGU6IHVuZGVmaW5lZFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluaXQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcyB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgcGFyYW1zLmNhbmNlbGFibGUsIHdpbmRvdyxcbiAgICAgICAgICAgICAgcGFyYW1zLmN0cmxLZXksIHBhcmFtcy5hbHRLZXksXG4gICAgICAgICAgICAgIHBhcmFtcy5zaGlmdEtleSwgcGFyYW1zLm1ldGFLZXksXG4gICAgICAgICAgICAgIHBhcmFtcy5rZXlDb2RlLCBwYXJhbXMuY2hhckNvZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGV2dC5pbml0RXZlbnQoZXZlbnRUeXBlLCBwYXJhbXMuYnViYmxlcyB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgcGFyYW1zLmNhbmNlbGFibGUgfHwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb21tb24uZGVmYXVsdHMoZXZ0LCBhdXgpO1xuICAgICAgZWxlbS5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1cbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKiBAcGFyYW0gZnVuY1xuICAgICAqIEBwYXJhbSBib29sXG4gICAgICovXG4gICAgYmluZDogZnVuY3Rpb24oZWxlbSwgZXZlbnQsIGZ1bmMsIGJvb2wpIHtcbiAgICAgIGJvb2wgPSBib29sIHx8IGZhbHNlO1xuICAgICAgaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmdW5jLCBib29sKTtcbiAgICAgIGVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpXG4gICAgICAgIGVsZW0uYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBmdW5jKTtcbiAgICAgIHJldHVybiBkb207XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1cbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKiBAcGFyYW0gZnVuY1xuICAgICAqIEBwYXJhbSBib29sXG4gICAgICovXG4gICAgdW5iaW5kOiBmdW5jdGlvbihlbGVtLCBldmVudCwgZnVuYywgYm9vbCkge1xuICAgICAgYm9vbCA9IGJvb2wgfHwgZmFsc2U7XG4gICAgICBpZiAoZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKVxuICAgICAgICBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGZ1bmMsIGJvb2wpO1xuICAgICAgZWxzZSBpZiAoZWxlbS5kZXRhY2hFdmVudClcbiAgICAgICAgZWxlbS5kZXRhY2hFdmVudCgnb24nICsgZXZlbnQsIGZ1bmMpO1xuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqIEBwYXJhbSBjbGFzc05hbWVcbiAgICAgKi9cbiAgICBhZGRDbGFzczogZnVuY3Rpb24oZWxlbSwgY2xhc3NOYW1lKSB7XG4gICAgICBpZiAoZWxlbS5jbGFzc05hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS5jbGFzc05hbWUgIT09IGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgY2xhc3NlcyA9IGVsZW0uY2xhc3NOYW1lLnNwbGl0KC8gKy8pO1xuICAgICAgICBpZiAoY2xhc3Nlcy5pbmRleE9mKGNsYXNzTmFtZSkgPT0gLTEpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbiAgICAgICAgICBlbGVtLmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbignICcpLnJlcGxhY2UoL15cXHMrLywgJycpLnJlcGxhY2UoL1xccyskLywgJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtXG4gICAgICogQHBhcmFtIGNsYXNzTmFtZVxuICAgICAqL1xuICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbihlbGVtLCBjbGFzc05hbWUpIHtcbiAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKGVsZW0uY2xhc3NOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBlbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtLmNsYXNzTmFtZSA9PT0gY2xhc3NOYW1lKSB7XG4gICAgICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGNsYXNzZXMgPSBlbGVtLmNsYXNzTmFtZS5zcGxpdCgvICsvKTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBjbGFzc2VzLmluZGV4T2YoY2xhc3NOYW1lKTtcbiAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgIGNsYXNzZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIGVsZW0uY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtLmNsYXNzTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb207XG4gICAgfSxcblxuICAgIGhhc0NsYXNzOiBmdW5jdGlvbihlbGVtLCBjbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKCcoPzpefFxcXFxzKyknICsgY2xhc3NOYW1lICsgJyg/OlxcXFxzK3wkKScpLnRlc3QoZWxlbS5jbGFzc05hbWUpIHx8IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtXG4gICAgICovXG4gICAgZ2V0V2lkdGg6IGZ1bmN0aW9uKGVsZW0pIHtcblxuICAgICAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcblxuICAgICAgcmV0dXJuIGNzc1ZhbHVlVG9QaXhlbHMoc3R5bGVbJ2JvcmRlci1sZWZ0LXdpZHRoJ10pICtcbiAgICAgICAgICBjc3NWYWx1ZVRvUGl4ZWxzKHN0eWxlWydib3JkZXItcmlnaHQtd2lkdGgnXSkgK1xuICAgICAgICAgIGNzc1ZhbHVlVG9QaXhlbHMoc3R5bGVbJ3BhZGRpbmctbGVmdCddKSArXG4gICAgICAgICAgY3NzVmFsdWVUb1BpeGVscyhzdHlsZVsncGFkZGluZy1yaWdodCddKSArXG4gICAgICAgICAgY3NzVmFsdWVUb1BpeGVscyhzdHlsZVsnd2lkdGgnXSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1cbiAgICAgKi9cbiAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKGVsZW0pIHtcblxuICAgICAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcblxuICAgICAgcmV0dXJuIGNzc1ZhbHVlVG9QaXhlbHMoc3R5bGVbJ2JvcmRlci10b3Atd2lkdGgnXSkgK1xuICAgICAgICAgIGNzc1ZhbHVlVG9QaXhlbHMoc3R5bGVbJ2JvcmRlci1ib3R0b20td2lkdGgnXSkgK1xuICAgICAgICAgIGNzc1ZhbHVlVG9QaXhlbHMoc3R5bGVbJ3BhZGRpbmctdG9wJ10pICtcbiAgICAgICAgICBjc3NWYWx1ZVRvUGl4ZWxzKHN0eWxlWydwYWRkaW5nLWJvdHRvbSddKSArXG4gICAgICAgICAgY3NzVmFsdWVUb1BpeGVscyhzdHlsZVsnaGVpZ2h0J10pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtXG4gICAgICovXG4gICAgZ2V0T2Zmc2V0OiBmdW5jdGlvbihlbGVtKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0ge2xlZnQ6IDAsIHRvcDowfTtcbiAgICAgIGlmIChlbGVtLm9mZnNldFBhcmVudCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgb2Zmc2V0LmxlZnQgKz0gZWxlbS5vZmZzZXRMZWZ0O1xuICAgICAgICAgIG9mZnNldC50b3AgKz0gZWxlbS5vZmZzZXRUb3A7XG4gICAgICAgIH0gd2hpbGUgKGVsZW0gPSBlbGVtLm9mZnNldFBhcmVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH0sXG5cbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcG9zdHMvMjY4NDU2MS9yZXZpc2lvbnNcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIGlzQWN0aXZlOiBmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgKTtcbiAgICB9XG5cbiAgfTtcblxuICByZXR1cm4gZG9tO1xuXG59KShkYXQudXRpbHMuY29tbW9uKTtcblxuXG5kYXQuY29udHJvbGxlcnMuT3B0aW9uQ29udHJvbGxlciA9IChmdW5jdGlvbiAoQ29udHJvbGxlciwgZG9tLCBjb21tb24pIHtcblxuICAvKipcbiAgICogQGNsYXNzIFByb3ZpZGVzIGEgc2VsZWN0IGlucHV0IHRvIGFsdGVyIHRoZSBwcm9wZXJ0eSBvZiBhbiBvYmplY3QsIHVzaW5nIGFcbiAgICogbGlzdCBvZiBhY2NlcHRlZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleHRlbmRzIGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fHN0cmluZ1tdfSBvcHRpb25zIEEgbWFwIG9mIGxhYmVscyB0byBhY2NlcHRhYmxlIHZhbHVlcywgb3JcbiAgICogYSBsaXN0IG9mIGFjY2VwdGFibGUgc3RyaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQG1lbWJlciBkYXQuY29udHJvbGxlcnNcbiAgICovXG4gIHZhciBPcHRpb25Db250cm9sbGVyID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgb3B0aW9ucykge1xuXG4gICAgT3B0aW9uQ29udHJvbGxlci5zdXBlcmNsYXNzLmNhbGwodGhpcywgb2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRyb3AgZG93biBtZW51XG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHRoaXMuX19zZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcblxuICAgIGlmIChjb21tb24uaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgdmFyIG1hcCA9IHt9O1xuICAgICAgY29tbW9uLmVhY2gob3B0aW9ucywgZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICBtYXBbZWxlbWVudF0gPSBlbGVtZW50O1xuICAgICAgfSk7XG4gICAgICBvcHRpb25zID0gbWFwO1xuICAgIH1cblxuICAgIGNvbW1vbi5lYWNoKG9wdGlvbnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcblxuICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0LmlubmVySFRNTCA9IGtleTtcbiAgICAgIG9wdC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdmFsdWUpO1xuICAgICAgX3RoaXMuX19zZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcblxuICAgIH0pO1xuXG4gICAgLy8gQWNrbm93bGVkZ2Ugb3JpZ2luYWwgdmFsdWVcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcblxuICAgIGRvbS5iaW5kKHRoaXMuX19zZWxlY3QsICdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBkZXNpcmVkVmFsdWUgPSB0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcbiAgICAgIF90aGlzLnNldFZhbHVlKGRlc2lyZWRWYWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fX3NlbGVjdCk7XG5cbiAgfTtcblxuICBPcHRpb25Db250cm9sbGVyLnN1cGVyY2xhc3MgPSBDb250cm9sbGVyO1xuXG4gIGNvbW1vbi5leHRlbmQoXG5cbiAgICAgIE9wdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLFxuICAgICAgQ29udHJvbGxlci5wcm90b3R5cGUsXG5cbiAgICAgIHtcblxuICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odikge1xuICAgICAgICAgIHZhciB0b1JldHVybiA9IE9wdGlvbkNvbnRyb2xsZXIuc3VwZXJjbGFzcy5wcm90b3R5cGUuc2V0VmFsdWUuY2FsbCh0aGlzLCB2KTtcbiAgICAgICAgICBpZiAodGhpcy5fX29uRmluaXNoQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9fb25GaW5pc2hDaGFuZ2UuY2FsbCh0aGlzLCB0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlRGlzcGxheTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdGhpcy5fX3NlbGVjdC52YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gT3B0aW9uQ29udHJvbGxlci5zdXBlcmNsYXNzLnByb3RvdHlwZS51cGRhdGVEaXNwbGF5LmNhbGwodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICk7XG5cbiAgcmV0dXJuIE9wdGlvbkNvbnRyb2xsZXI7XG5cbn0pKGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyLFxuZGF0LmRvbS5kb20sXG5kYXQudXRpbHMuY29tbW9uKTtcblxuXG5kYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlciA9IChmdW5jdGlvbiAoQ29udHJvbGxlciwgY29tbW9uKSB7XG5cbiAgLyoqXG4gICAqIEBjbGFzcyBSZXByZXNlbnRzIGEgZ2l2ZW4gcHJvcGVydHkgb2YgYW4gb2JqZWN0IHRoYXQgaXMgYSBudW1iZXIuXG4gICAqXG4gICAqIEBleHRlbmRzIGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSBPcHRpb25hbCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLm1pbl0gTWluaW11bSBhbGxvd2VkIHZhbHVlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLm1heF0gTWF4aW11bSBhbGxvd2VkIHZhbHVlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLnN0ZXBdIEluY3JlbWVudCBieSB3aGljaCB0byBjaGFuZ2UgdmFsdWVcbiAgICpcbiAgICogQG1lbWJlciBkYXQuY29udHJvbGxlcnNcbiAgICovXG4gIHZhciBOdW1iZXJDb250cm9sbGVyID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgcGFyYW1zKSB7XG5cbiAgICBOdW1iZXJDb250cm9sbGVyLnN1cGVyY2xhc3MuY2FsbCh0aGlzLCBvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAgIHRoaXMuX19taW4gPSBwYXJhbXMubWluO1xuICAgIHRoaXMuX19tYXggPSBwYXJhbXMubWF4O1xuICAgIHRoaXMuX19zdGVwID0gcGFyYW1zLnN0ZXA7XG5cbiAgICBpZiAoY29tbW9uLmlzVW5kZWZpbmVkKHRoaXMuX19zdGVwKSkge1xuXG4gICAgICBpZiAodGhpcy5pbml0aWFsVmFsdWUgPT0gMCkge1xuICAgICAgICB0aGlzLl9faW1wbGllZFN0ZXAgPSAxOyAvLyBXaGF0IGFyZSB3ZSwgcHN5Y2hpY3M/XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIZXkgRG91ZywgY2hlY2sgdGhpcyBvdXQuXG4gICAgICAgIHRoaXMuX19pbXBsaWVkU3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHRoaXMuaW5pdGlhbFZhbHVlKS9NYXRoLkxOMTApKS8xMDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIHRoaXMuX19pbXBsaWVkU3RlcCA9IHRoaXMuX19zdGVwO1xuXG4gICAgfVxuXG4gICAgdGhpcy5fX3ByZWNpc2lvbiA9IG51bURlY2ltYWxzKHRoaXMuX19pbXBsaWVkU3RlcCk7XG5cblxuICB9O1xuXG4gIE51bWJlckNvbnRyb2xsZXIuc3VwZXJjbGFzcyA9IENvbnRyb2xsZXI7XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgTnVtYmVyQ29udHJvbGxlci5wcm90b3R5cGUsXG4gICAgICBDb250cm9sbGVyLnByb3RvdHlwZSxcblxuICAgICAgLyoqIEBsZW5kcyBkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlci5wcm90b3R5cGUgKi9cbiAgICAgIHtcblxuICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24odikge1xuXG4gICAgICAgICAgaWYgKHRoaXMuX19taW4gIT09IHVuZGVmaW5lZCAmJiB2IDwgdGhpcy5fX21pbikge1xuICAgICAgICAgICAgdiA9IHRoaXMuX19taW47XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fbWF4ICE9PSB1bmRlZmluZWQgJiYgdiA+IHRoaXMuX19tYXgpIHtcbiAgICAgICAgICAgIHYgPSB0aGlzLl9fbWF4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLl9fc3RlcCAhPT0gdW5kZWZpbmVkICYmIHYgJSB0aGlzLl9fc3RlcCAhPSAwKSB7XG4gICAgICAgICAgICB2ID0gTWF0aC5yb3VuZCh2IC8gdGhpcy5fX3N0ZXApICogdGhpcy5fX3N0ZXA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIE51bWJlckNvbnRyb2xsZXIuc3VwZXJjbGFzcy5wcm90b3R5cGUuc2V0VmFsdWUuY2FsbCh0aGlzLCB2KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZ5IGEgbWluaW11bSB2YWx1ZSBmb3IgPGNvZGU+b2JqZWN0W3Byb3BlcnR5XTwvY29kZT4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtaW5WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSBmb3JcbiAgICAgICAgICogPGNvZGU+b2JqZWN0W3Byb3BlcnR5XTwvY29kZT5cbiAgICAgICAgICogQHJldHVybnMge2RhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyfSB0aGlzXG4gICAgICAgICAqL1xuICAgICAgICBtaW46IGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICB0aGlzLl9fbWluID0gdjtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmeSBhIG1heGltdW0gdmFsdWUgZm9yIDxjb2RlPm9iamVjdFtwcm9wZXJ0eV08L2NvZGU+LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VmFsdWUgVGhlIG1heGltdW0gdmFsdWUgZm9yXG4gICAgICAgICAqIDxjb2RlPm9iamVjdFtwcm9wZXJ0eV08L2NvZGU+XG4gICAgICAgICAqIEByZXR1cm5zIHtkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlcn0gdGhpc1xuICAgICAgICAgKi9cbiAgICAgICAgbWF4OiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgdGhpcy5fX21heCA9IHY7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZnkgYSBzdGVwIHZhbHVlIHRoYXQgZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJcbiAgICAgICAgICogaW5jcmVtZW50cyBieS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0ZXBWYWx1ZSBUaGUgc3RlcCB2YWx1ZSBmb3JcbiAgICAgICAgICogZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJcbiAgICAgICAgICogQGRlZmF1bHQgaWYgbWluaW11bSBhbmQgbWF4aW11bSBzcGVjaWZpZWQgaW5jcmVtZW50IGlzIDElIG9mIHRoZVxuICAgICAgICAgKiBkaWZmZXJlbmNlIG90aGVyd2lzZSBzdGVwVmFsdWUgaXMgMVxuICAgICAgICAgKiBAcmV0dXJucyB7ZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJ9IHRoaXNcbiAgICAgICAgICovXG4gICAgICAgIHN0ZXA6IGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICB0aGlzLl9fc3RlcCA9IHY7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICk7XG5cbiAgZnVuY3Rpb24gbnVtRGVjaW1hbHMoeCkge1xuICAgIHggPSB4LnRvU3RyaW5nKCk7XG4gICAgaWYgKHguaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIHJldHVybiB4Lmxlbmd0aCAtIHguaW5kZXhPZignLicpIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE51bWJlckNvbnRyb2xsZXI7XG5cbn0pKGRhdC5jb250cm9sbGVycy5Db250cm9sbGVyLFxuZGF0LnV0aWxzLmNvbW1vbik7XG5cblxuZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJCb3ggPSAoZnVuY3Rpb24gKE51bWJlckNvbnRyb2xsZXIsIGRvbSwgY29tbW9uKSB7XG5cbiAgLyoqXG4gICAqIEBjbGFzcyBSZXByZXNlbnRzIGEgZ2l2ZW4gcHJvcGVydHkgb2YgYW4gb2JqZWN0IHRoYXQgaXMgYSBudW1iZXIgYW5kXG4gICAqIHByb3ZpZGVzIGFuIGlucHV0IGVsZW1lbnQgd2l0aCB3aGljaCB0byBtYW5pcHVsYXRlIGl0LlxuICAgKlxuICAgKiBAZXh0ZW5kcyBkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlclxuICAgKiBAZXh0ZW5kcyBkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gT3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5taW5dIE1pbmltdW0gYWxsb3dlZCB2YWx1ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhdIE1heGltdW0gYWxsb3dlZCB2YWx1ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5zdGVwXSBJbmNyZW1lbnQgYnkgd2hpY2ggdG8gY2hhbmdlIHZhbHVlXG4gICAqXG4gICAqIEBtZW1iZXIgZGF0LmNvbnRyb2xsZXJzXG4gICAqL1xuICB2YXIgTnVtYmVyQ29udHJvbGxlckJveCA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIHBhcmFtcykge1xuXG4gICAgdGhpcy5fX3RydW5jYXRpb25TdXNwZW5kZWQgPSBmYWxzZTtcblxuICAgIE51bWJlckNvbnRyb2xsZXJCb3guc3VwZXJjbGFzcy5jYWxsKHRoaXMsIG9iamVjdCwgcHJvcGVydHksIHBhcmFtcyk7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLyoqXG4gICAgICoge051bWJlcn0gUHJldmlvdXMgbW91c2UgeSBwb3NpdGlvblxuICAgICAqIEBpZ25vcmVcbiAgICAgKi9cbiAgICB2YXIgcHJldl95O1xuXG4gICAgdGhpcy5fX2lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLl9faW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcblxuICAgIC8vIE1ha2VzIGl0IHNvIG1hbnVhbGx5IHNwZWNpZmllZCB2YWx1ZXMgYXJlIG5vdCB0cnVuY2F0ZWQuXG5cbiAgICBkb20uYmluZCh0aGlzLl9faW5wdXQsICdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgZG9tLmJpbmQodGhpcy5fX2lucHV0LCAnYmx1cicsIG9uQmx1cik7XG4gICAgZG9tLmJpbmQodGhpcy5fX2lucHV0LCAnbW91c2Vkb3duJywgb25Nb3VzZURvd24pO1xuICAgIGRvbS5iaW5kKHRoaXMuX19pbnB1dCwgJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgIC8vIFdoZW4gcHJlc3NpbmcgZW50aXJlLCB5b3UgY2FuIGJlIGFzIHByZWNpc2UgYXMgeW91IHdhbnQuXG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xuICAgICAgICBfdGhpcy5fX3RydW5jYXRpb25TdXNwZW5kZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgX3RoaXMuX190cnVuY2F0aW9uU3VzcGVuZGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG9uQ2hhbmdlKCkge1xuICAgICAgdmFyIGF0dGVtcHRlZCA9IHBhcnNlRmxvYXQoX3RoaXMuX19pbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoIWNvbW1vbi5pc05hTihhdHRlbXB0ZWQpKSBfdGhpcy5zZXRWYWx1ZShhdHRlbXB0ZWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICAgIG9uQ2hhbmdlKCk7XG4gICAgICBpZiAoX3RoaXMuX19vbkZpbmlzaENoYW5nZSkge1xuICAgICAgICBfdGhpcy5fX29uRmluaXNoQ2hhbmdlLmNhbGwoX3RoaXMsIF90aGlzLmdldFZhbHVlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgIGRvbS5iaW5kKHdpbmRvdywgJ21vdXNlbW92ZScsIG9uTW91c2VEcmFnKTtcbiAgICAgIGRvbS5iaW5kKHdpbmRvdywgJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgcHJldl95ID0gZS5jbGllbnRZO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VEcmFnKGUpIHtcblxuICAgICAgdmFyIGRpZmYgPSBwcmV2X3kgLSBlLmNsaWVudFk7XG4gICAgICBfdGhpcy5zZXRWYWx1ZShfdGhpcy5nZXRWYWx1ZSgpICsgZGlmZiAqIF90aGlzLl9faW1wbGllZFN0ZXApO1xuXG4gICAgICBwcmV2X3kgPSBlLmNsaWVudFk7XG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgICBkb20udW5iaW5kKHdpbmRvdywgJ21vdXNlbW92ZScsIG9uTW91c2VEcmFnKTtcbiAgICAgIGRvbS51bmJpbmQod2luZG93LCAnbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fX2lucHV0KTtcblxuICB9O1xuXG4gIE51bWJlckNvbnRyb2xsZXJCb3guc3VwZXJjbGFzcyA9IE51bWJlckNvbnRyb2xsZXI7XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgTnVtYmVyQ29udHJvbGxlckJveC5wcm90b3R5cGUsXG4gICAgICBOdW1iZXJDb250cm9sbGVyLnByb3RvdHlwZSxcblxuICAgICAge1xuXG4gICAgICAgIHVwZGF0ZURpc3BsYXk6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgdGhpcy5fX2lucHV0LnZhbHVlID0gdGhpcy5fX3RydW5jYXRpb25TdXNwZW5kZWQgPyB0aGlzLmdldFZhbHVlKCkgOiByb3VuZFRvRGVjaW1hbCh0aGlzLmdldFZhbHVlKCksIHRoaXMuX19wcmVjaXNpb24pO1xuICAgICAgICAgIHJldHVybiBOdW1iZXJDb250cm9sbGVyQm94LnN1cGVyY2xhc3MucHJvdG90eXBlLnVwZGF0ZURpc3BsYXkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgKTtcblxuICBmdW5jdGlvbiByb3VuZFRvRGVjaW1hbCh2YWx1ZSwgZGVjaW1hbHMpIHtcbiAgICB2YXIgdGVuVG8gPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogdGVuVG8pIC8gdGVuVG87XG4gIH1cblxuICByZXR1cm4gTnVtYmVyQ29udHJvbGxlckJveDtcblxufSkoZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXIsXG5kYXQuZG9tLmRvbSxcbmRhdC51dGlscy5jb21tb24pO1xuXG5cbmRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyU2xpZGVyID0gKGZ1bmN0aW9uIChOdW1iZXJDb250cm9sbGVyLCBkb20sIGNzcywgY29tbW9uLCBzdHlsZVNoZWV0KSB7XG5cbiAgLyoqXG4gICAqIEBjbGFzcyBSZXByZXNlbnRzIGEgZ2l2ZW4gcHJvcGVydHkgb2YgYW4gb2JqZWN0IHRoYXQgaXMgYSBudW1iZXIsIGNvbnRhaW5zXG4gICAqIGEgbWluaW11bSBhbmQgbWF4aW11bSwgYW5kIHByb3ZpZGVzIGEgc2xpZGVyIGVsZW1lbnQgd2l0aCB3aGljaCB0b1xuICAgKiBtYW5pcHVsYXRlIGl0LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgc2xpZGVyIGVsZW1lbnQgaXMgbWFkZSB1cCBvZlxuICAgKiA8Y29kZT4mbHQ7ZGl2Jmd0OzwvY29kZT4gdGFncywgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gdGhlIGh0bWw1XG4gICAqIDxjb2RlPiZsdDtzbGlkZXImZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICAgKlxuICAgKiBAZXh0ZW5kcyBkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlclxuICAgKiBAZXh0ZW5kcyBkYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlclxuICAgKiBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG1pblZhbHVlIE1pbmltdW0gYWxsb3dlZCB2YWx1ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VmFsdWUgTWF4aW11bSBhbGxvd2VkIHZhbHVlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBzdGVwVmFsdWUgSW5jcmVtZW50IGJ5IHdoaWNoIHRvIGNoYW5nZSB2YWx1ZVxuICAgKlxuICAgKiBAbWVtYmVyIGRhdC5jb250cm9sbGVyc1xuICAgKi9cbiAgdmFyIE51bWJlckNvbnRyb2xsZXJTbGlkZXIgPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5LCBtaW4sIG1heCwgc3RlcCkge1xuXG4gICAgTnVtYmVyQ29udHJvbGxlclNsaWRlci5zdXBlcmNsYXNzLmNhbGwodGhpcywgb2JqZWN0LCBwcm9wZXJ0eSwgeyBtaW46IG1pbiwgbWF4OiBtYXgsIHN0ZXA6IHN0ZXAgfSk7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5fX2JhY2tncm91bmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9fZm9yZWdyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIFxuXG5cbiAgICBkb20uYmluZCh0aGlzLl9fYmFja2dyb3VuZCwgJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICBcbiAgICBkb20uYWRkQ2xhc3ModGhpcy5fX2JhY2tncm91bmQsICdzbGlkZXInKTtcbiAgICBkb20uYWRkQ2xhc3ModGhpcy5fX2ZvcmVncm91bmQsICdzbGlkZXItZmcnKTtcblxuICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcblxuICAgICAgZG9tLmJpbmQod2luZG93LCAnbW91c2Vtb3ZlJywgb25Nb3VzZURyYWcpO1xuICAgICAgZG9tLmJpbmQod2luZG93LCAnbW91c2V1cCcsIG9uTW91c2VVcCk7XG5cbiAgICAgIG9uTW91c2VEcmFnKGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VEcmFnKGUpIHtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgb2Zmc2V0ID0gZG9tLmdldE9mZnNldChfdGhpcy5fX2JhY2tncm91bmQpO1xuICAgICAgdmFyIHdpZHRoID0gZG9tLmdldFdpZHRoKF90aGlzLl9fYmFja2dyb3VuZCk7XG4gICAgICBcbiAgICAgIF90aGlzLnNldFZhbHVlKFxuICAgICAgICBtYXAoZS5jbGllbnRYLCBvZmZzZXQubGVmdCwgb2Zmc2V0LmxlZnQgKyB3aWR0aCwgX3RoaXMuX19taW4sIF90aGlzLl9fbWF4KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Nb3VzZVVwKCkge1xuICAgICAgZG9tLnVuYmluZCh3aW5kb3csICdtb3VzZW1vdmUnLCBvbk1vdXNlRHJhZyk7XG4gICAgICBkb20udW5iaW5kKHdpbmRvdywgJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgaWYgKF90aGlzLl9fb25GaW5pc2hDaGFuZ2UpIHtcbiAgICAgICAgX3RoaXMuX19vbkZpbmlzaENoYW5nZS5jYWxsKF90aGlzLCBfdGhpcy5nZXRWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcblxuICAgIHRoaXMuX19iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuX19mb3JlZ3JvdW5kKTtcbiAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fX2JhY2tncm91bmQpO1xuXG4gIH07XG5cbiAgTnVtYmVyQ29udHJvbGxlclNsaWRlci5zdXBlcmNsYXNzID0gTnVtYmVyQ29udHJvbGxlcjtcblxuICAvKipcbiAgICogSW5qZWN0cyBkZWZhdWx0IHN0eWxlc2hlZXQgZm9yIHNsaWRlciBlbGVtZW50cy5cbiAgICovXG4gIE51bWJlckNvbnRyb2xsZXJTbGlkZXIudXNlRGVmYXVsdFN0eWxlcyA9IGZ1bmN0aW9uKCkge1xuICAgIGNzcy5pbmplY3Qoc3R5bGVTaGVldCk7XG4gIH07XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgTnVtYmVyQ29udHJvbGxlclNsaWRlci5wcm90b3R5cGUsXG4gICAgICBOdW1iZXJDb250cm9sbGVyLnByb3RvdHlwZSxcblxuICAgICAge1xuXG4gICAgICAgIHVwZGF0ZURpc3BsYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBwY3QgPSAodGhpcy5nZXRWYWx1ZSgpIC0gdGhpcy5fX21pbikvKHRoaXMuX19tYXggLSB0aGlzLl9fbWluKTtcbiAgICAgICAgICB0aGlzLl9fZm9yZWdyb3VuZC5zdHlsZS53aWR0aCA9IHBjdCoxMDArJyUnO1xuICAgICAgICAgIHJldHVybiBOdW1iZXJDb250cm9sbGVyU2xpZGVyLnN1cGVyY2xhc3MucHJvdG90eXBlLnVwZGF0ZURpc3BsYXkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cblxuXG4gICk7XG5cbiAgZnVuY3Rpb24gbWFwKHYsIGkxLCBpMiwgbzEsIG8yKSB7XG4gICAgcmV0dXJuIG8xICsgKG8yIC0gbzEpICogKCh2IC0gaTEpIC8gKGkyIC0gaTEpKTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXJDb250cm9sbGVyU2xpZGVyO1xuICBcbn0pKGRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyLFxuZGF0LmRvbS5kb20sXG5kYXQudXRpbHMuY3NzLFxuZGF0LnV0aWxzLmNvbW1vbixcblwiLnNsaWRlciB7XFxuICBib3gtc2hhZG93OiBpbnNldCAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjE1KTtcXG4gIGhlaWdodDogMWVtO1xcbiAgYm9yZGVyLXJhZGl1czogMWVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcXG4gIHBhZGRpbmc6IDAgMC41ZW07XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4uc2xpZGVyLWZnIHtcXG4gIHBhZGRpbmc6IDFweCAwIDJweCAwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2FhYTtcXG4gIGhlaWdodDogMWVtO1xcbiAgbWFyZ2luLWxlZnQ6IC0wLjVlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xcbiAgYm9yZGVyLXJhZGl1czogMWVtIDAgMCAxZW07XFxufVxcblxcbi5zbGlkZXItZmc6YWZ0ZXIge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgYm9yZGVyLXJhZGl1czogMWVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIGJvcmRlcjogIDFweCBzb2xpZCAjYWFhO1xcbiAgY29udGVudDogJyc7XFxuICBmbG9hdDogcmlnaHQ7XFxuICBtYXJnaW4tcmlnaHQ6IC0xZW07XFxuICBtYXJnaW4tdG9wOiAtMXB4O1xcbiAgaGVpZ2h0OiAwLjllbTtcXG4gIHdpZHRoOiAwLjllbTtcXG59XCIpO1xuXG5cbmRhdC5jb250cm9sbGVycy5GdW5jdGlvbkNvbnRyb2xsZXIgPSAoZnVuY3Rpb24gKENvbnRyb2xsZXIsIGRvbSwgY29tbW9uKSB7XG5cbiAgLyoqXG4gICAqIEBjbGFzcyBQcm92aWRlcyBhIEdVSSBpbnRlcmZhY2UgdG8gZmlyZSBhIHNwZWNpZmllZCBtZXRob2QsIGEgcHJvcGVydHkgb2YgYW4gb2JqZWN0LlxuICAgKlxuICAgKiBAZXh0ZW5kcyBkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBtYW5pcHVsYXRlZFxuICAgKlxuICAgKiBAbWVtYmVyIGRhdC5jb250cm9sbGVyc1xuICAgKi9cbiAgdmFyIEZ1bmN0aW9uQ29udHJvbGxlciA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIHRleHQpIHtcblxuICAgIEZ1bmN0aW9uQ29udHJvbGxlci5zdXBlcmNsYXNzLmNhbGwodGhpcywgb2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5fX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX19idXR0b24uaW5uZXJIVE1MID0gdGV4dCA9PT0gdW5kZWZpbmVkID8gJ0ZpcmUnIDogdGV4dDtcbiAgICBkb20uYmluZCh0aGlzLl9fYnV0dG9uLCAnY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBfdGhpcy5maXJlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBkb20uYWRkQ2xhc3ModGhpcy5fX2J1dHRvbiwgJ2J1dHRvbicpO1xuXG4gICAgdGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19idXR0b24pO1xuXG5cbiAgfTtcblxuICBGdW5jdGlvbkNvbnRyb2xsZXIuc3VwZXJjbGFzcyA9IENvbnRyb2xsZXI7XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgRnVuY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZSxcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLFxuICAgICAge1xuICAgICAgICBcbiAgICAgICAgZmlyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX19vbkNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fX29uQ2hhbmdlLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9fb25GaW5pc2hDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX19vbkZpbmlzaENoYW5nZS5jYWxsKHRoaXMsIHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2V0VmFsdWUoKS5jYWxsKHRoaXMub2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICk7XG5cbiAgcmV0dXJuIEZ1bmN0aW9uQ29udHJvbGxlcjtcblxufSkoZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXIsXG5kYXQuZG9tLmRvbSxcbmRhdC51dGlscy5jb21tb24pO1xuXG5cbmRhdC5jb250cm9sbGVycy5Cb29sZWFuQ29udHJvbGxlciA9IChmdW5jdGlvbiAoQ29udHJvbGxlciwgZG9tLCBjb21tb24pIHtcblxuICAvKipcbiAgICogQGNsYXNzIFByb3ZpZGVzIGEgY2hlY2tib3ggaW5wdXQgdG8gYWx0ZXIgdGhlIGJvb2xlYW4gcHJvcGVydHkgb2YgYW4gb2JqZWN0LlxuICAgKiBAZXh0ZW5kcyBkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBtYW5pcHVsYXRlZFxuICAgKlxuICAgKiBAbWVtYmVyIGRhdC5jb250cm9sbGVyc1xuICAgKi9cbiAgdmFyIEJvb2xlYW5Db250cm9sbGVyID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXG4gICAgQm9vbGVhbkNvbnRyb2xsZXIuc3VwZXJjbGFzcy5jYWxsKHRoaXMsIG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB0aGlzLl9fcHJldiA9IHRoaXMuZ2V0VmFsdWUoKTtcblxuICAgIHRoaXMuX19jaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdGhpcy5fX2NoZWNrYm94LnNldEF0dHJpYnV0ZSgndHlwZScsICdjaGVja2JveCcpO1xuXG5cbiAgICBkb20uYmluZCh0aGlzLl9fY2hlY2tib3gsICdjaGFuZ2UnLCBvbkNoYW5nZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX19jaGVja2JveCk7XG5cbiAgICAvLyBNYXRjaCBvcmlnaW5hbCB2YWx1ZVxuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuXG4gICAgZnVuY3Rpb24gb25DaGFuZ2UoKSB7XG4gICAgICBfdGhpcy5zZXRWYWx1ZSghX3RoaXMuX19wcmV2KTtcbiAgICB9XG5cbiAgfTtcblxuICBCb29sZWFuQ29udHJvbGxlci5zdXBlcmNsYXNzID0gQ29udHJvbGxlcjtcblxuICBjb21tb24uZXh0ZW5kKFxuXG4gICAgICBCb29sZWFuQ29udHJvbGxlci5wcm90b3R5cGUsXG4gICAgICBDb250cm9sbGVyLnByb3RvdHlwZSxcblxuICAgICAge1xuXG4gICAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgdmFyIHRvUmV0dXJuID0gQm9vbGVhbkNvbnRyb2xsZXIuc3VwZXJjbGFzcy5wcm90b3R5cGUuc2V0VmFsdWUuY2FsbCh0aGlzLCB2KTtcbiAgICAgICAgICBpZiAodGhpcy5fX29uRmluaXNoQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9fb25GaW5pc2hDaGFuZ2UuY2FsbCh0aGlzLCB0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9fcHJldiA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlRGlzcGxheTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0VmFsdWUoKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5fX2NoZWNrYm94LnNldEF0dHJpYnV0ZSgnY2hlY2tlZCcsICdjaGVja2VkJyk7XG4gICAgICAgICAgICB0aGlzLl9fY2hlY2tib3guY2hlY2tlZCA9IHRydWU7ICAgIFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX19jaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIEJvb2xlYW5Db250cm9sbGVyLnN1cGVyY2xhc3MucHJvdG90eXBlLnVwZGF0ZURpc3BsYXkuY2FsbCh0aGlzKTtcblxuICAgICAgICB9XG5cblxuICAgICAgfVxuXG4gICk7XG5cbiAgcmV0dXJuIEJvb2xlYW5Db250cm9sbGVyO1xuXG59KShkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcixcbmRhdC5kb20uZG9tLFxuZGF0LnV0aWxzLmNvbW1vbik7XG5cblxuZGF0LmNvbG9yLnRvU3RyaW5nID0gKGZ1bmN0aW9uIChjb21tb24pIHtcblxuICByZXR1cm4gZnVuY3Rpb24oY29sb3IpIHtcblxuICAgIGlmIChjb2xvci5hID09IDEgfHwgY29tbW9uLmlzVW5kZWZpbmVkKGNvbG9yLmEpKSB7XG5cbiAgICAgIHZhciBzID0gY29sb3IuaGV4LnRvU3RyaW5nKDE2KTtcbiAgICAgIHdoaWxlIChzLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgcyA9ICcwJyArIHM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnIycgKyBzO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgcmV0dXJuICdyZ2JhKCcgKyBNYXRoLnJvdW5kKGNvbG9yLnIpICsgJywnICsgTWF0aC5yb3VuZChjb2xvci5nKSArICcsJyArIE1hdGgucm91bmQoY29sb3IuYikgKyAnLCcgKyBjb2xvci5hICsgJyknO1xuXG4gICAgfVxuXG4gIH1cblxufSkoZGF0LnV0aWxzLmNvbW1vbik7XG5cblxuZGF0LmNvbG9yLmludGVycHJldCA9IChmdW5jdGlvbiAodG9TdHJpbmcsIGNvbW1vbikge1xuXG4gIHZhciByZXN1bHQsIHRvUmV0dXJuO1xuXG4gIHZhciBpbnRlcnByZXQgPSBmdW5jdGlvbigpIHtcblxuICAgIHRvUmV0dXJuID0gZmFsc2U7XG5cbiAgICB2YXIgb3JpZ2luYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvbW1vbi50b0FycmF5KGFyZ3VtZW50cykgOiBhcmd1bWVudHNbMF07XG5cbiAgICBjb21tb24uZWFjaChJTlRFUlBSRVRBVElPTlMsIGZ1bmN0aW9uKGZhbWlseSkge1xuXG4gICAgICBpZiAoZmFtaWx5LmxpdG11cyhvcmlnaW5hbCkpIHtcblxuICAgICAgICBjb21tb24uZWFjaChmYW1pbHkuY29udmVyc2lvbnMsIGZ1bmN0aW9uKGNvbnZlcnNpb24sIGNvbnZlcnNpb25OYW1lKSB7XG5cbiAgICAgICAgICByZXN1bHQgPSBjb252ZXJzaW9uLnJlYWQob3JpZ2luYWwpO1xuXG4gICAgICAgICAgaWYgKHRvUmV0dXJuID09PSBmYWxzZSAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0b1JldHVybiA9IHJlc3VsdDtcbiAgICAgICAgICAgIHJlc3VsdC5jb252ZXJzaW9uTmFtZSA9IGNvbnZlcnNpb25OYW1lO1xuICAgICAgICAgICAgcmVzdWx0LmNvbnZlcnNpb24gPSBjb252ZXJzaW9uO1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5CUkVBSztcblxuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29tbW9uLkJSRUFLO1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICAgIHJldHVybiB0b1JldHVybjtcblxuICB9O1xuXG4gIHZhciBJTlRFUlBSRVRBVElPTlMgPSBbXG5cbiAgICAvLyBTdHJpbmdzXG4gICAge1xuXG4gICAgICBsaXRtdXM6IGNvbW1vbi5pc1N0cmluZyxcblxuICAgICAgY29udmVyc2lvbnM6IHtcblxuICAgICAgICBUSFJFRV9DSEFSX0hFWDoge1xuXG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcblxuICAgICAgICAgICAgdmFyIHRlc3QgPSBvcmlnaW5hbC5tYXRjaCgvXiMoW0EtRjAtOV0pKFtBLUYwLTldKShbQS1GMC05XSkkL2kpO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3BhY2U6ICdIRVgnLFxuICAgICAgICAgICAgICBoZXg6IHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgJzB4JyArXG4gICAgICAgICAgICAgICAgICAgICAgdGVzdFsxXS50b1N0cmluZygpICsgdGVzdFsxXS50b1N0cmluZygpICtcbiAgICAgICAgICAgICAgICAgICAgICB0ZXN0WzJdLnRvU3RyaW5nKCkgKyB0ZXN0WzJdLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgICAgICAgICAgIHRlc3RbM10udG9TdHJpbmcoKSArIHRlc3RbM10udG9TdHJpbmcoKSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IHRvU3RyaW5nXG5cbiAgICAgICAgfSxcblxuICAgICAgICBTSVhfQ0hBUl9IRVg6IHtcblxuICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKG9yaWdpbmFsKSB7XG5cbiAgICAgICAgICAgIHZhciB0ZXN0ID0gb3JpZ2luYWwubWF0Y2goL14jKFtBLUYwLTldezZ9KSQvaSk7XG4gICAgICAgICAgICBpZiAodGVzdCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzcGFjZTogJ0hFWCcsXG4gICAgICAgICAgICAgIGhleDogcGFyc2VJbnQoJzB4JyArIHRlc3RbMV0udG9TdHJpbmcoKSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IHRvU3RyaW5nXG5cbiAgICAgICAgfSxcblxuICAgICAgICBDU1NfUkdCOiB7XG5cbiAgICAgICAgICByZWFkOiBmdW5jdGlvbihvcmlnaW5hbCkge1xuXG4gICAgICAgICAgICB2YXIgdGVzdCA9IG9yaWdpbmFsLm1hdGNoKC9ecmdiXFwoXFxzKiguKylcXHMqLFxccyooLispXFxzKixcXHMqKC4rKVxccypcXCkvKTtcbiAgICAgICAgICAgIGlmICh0ZXN0ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAnUkdCJyxcbiAgICAgICAgICAgICAgcjogcGFyc2VGbG9hdCh0ZXN0WzFdKSxcbiAgICAgICAgICAgICAgZzogcGFyc2VGbG9hdCh0ZXN0WzJdKSxcbiAgICAgICAgICAgICAgYjogcGFyc2VGbG9hdCh0ZXN0WzNdKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICB3cml0ZTogdG9TdHJpbmdcblxuICAgICAgICB9LFxuXG4gICAgICAgIENTU19SR0JBOiB7XG5cbiAgICAgICAgICByZWFkOiBmdW5jdGlvbihvcmlnaW5hbCkge1xuXG4gICAgICAgICAgICB2YXIgdGVzdCA9IG9yaWdpbmFsLm1hdGNoKC9ecmdiYVxcKFxccyooLispXFxzKixcXHMqKC4rKVxccyosXFxzKiguKylcXHMqXFwsXFxzKiguKylcXHMqXFwpLyk7XG4gICAgICAgICAgICBpZiAodGVzdCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzcGFjZTogJ1JHQicsXG4gICAgICAgICAgICAgIHI6IHBhcnNlRmxvYXQodGVzdFsxXSksXG4gICAgICAgICAgICAgIGc6IHBhcnNlRmxvYXQodGVzdFsyXSksXG4gICAgICAgICAgICAgIGI6IHBhcnNlRmxvYXQodGVzdFszXSksXG4gICAgICAgICAgICAgIGE6IHBhcnNlRmxvYXQodGVzdFs0XSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IHRvU3RyaW5nXG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gTnVtYmVyc1xuICAgIHtcblxuICAgICAgbGl0bXVzOiBjb21tb24uaXNOdW1iZXIsXG5cbiAgICAgIGNvbnZlcnNpb25zOiB7XG5cbiAgICAgICAgSEVYOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAnSEVYJyxcbiAgICAgICAgICAgICAgaGV4OiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgY29udmVyc2lvbk5hbWU6ICdIRVgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbG9yLmhleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEFycmF5c1xuICAgIHtcblxuICAgICAgbGl0bXVzOiBjb21tb24uaXNBcnJheSxcblxuICAgICAgY29udmVyc2lvbnM6IHtcblxuICAgICAgICBSR0JfQVJSQVk6IHtcbiAgICAgICAgICByZWFkOiBmdW5jdGlvbihvcmlnaW5hbCkge1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsLmxlbmd0aCAhPSAzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzcGFjZTogJ1JHQicsXG4gICAgICAgICAgICAgIHI6IG9yaWdpbmFsWzBdLFxuICAgICAgICAgICAgICBnOiBvcmlnaW5hbFsxXSxcbiAgICAgICAgICAgICAgYjogb3JpZ2luYWxbMl1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIFtjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBSR0JBX0FSUkFZOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbC5sZW5ndGggIT0gNCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3BhY2U6ICdSR0InLFxuICAgICAgICAgICAgICByOiBvcmlnaW5hbFswXSxcbiAgICAgICAgICAgICAgZzogb3JpZ2luYWxbMV0sXG4gICAgICAgICAgICAgIGI6IG9yaWdpbmFsWzJdLFxuICAgICAgICAgICAgICBhOiBvcmlnaW5hbFszXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gW2NvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGNvbG9yLmFdO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvLyBPYmplY3RzXG4gICAge1xuXG4gICAgICBsaXRtdXM6IGNvbW1vbi5pc09iamVjdCxcblxuICAgICAgY29udmVyc2lvbnM6IHtcblxuICAgICAgICBSR0JBX09CSjoge1xuICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICBpZiAoY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLnIpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmcpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmIpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3BhY2U6ICdSR0InLFxuICAgICAgICAgICAgICAgIHI6IG9yaWdpbmFsLnIsXG4gICAgICAgICAgICAgICAgZzogb3JpZ2luYWwuZyxcbiAgICAgICAgICAgICAgICBiOiBvcmlnaW5hbC5iLFxuICAgICAgICAgICAgICAgIGE6IG9yaWdpbmFsLmFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHI6IGNvbG9yLnIsXG4gICAgICAgICAgICAgIGc6IGNvbG9yLmcsXG4gICAgICAgICAgICAgIGI6IGNvbG9yLmIsXG4gICAgICAgICAgICAgIGE6IGNvbG9yLmFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgUkdCX09CSjoge1xuICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICBpZiAoY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLnIpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmcpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3BhY2U6ICdSR0InLFxuICAgICAgICAgICAgICAgIHI6IG9yaWdpbmFsLnIsXG4gICAgICAgICAgICAgICAgZzogb3JpZ2luYWwuZyxcbiAgICAgICAgICAgICAgICBiOiBvcmlnaW5hbC5iXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICByOiBjb2xvci5yLFxuICAgICAgICAgICAgICBnOiBjb2xvci5nLFxuICAgICAgICAgICAgICBiOiBjb2xvci5iXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIEhTVkFfT0JKOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGlmIChjb21tb24uaXNOdW1iZXIob3JpZ2luYWwuaCkgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwucykgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwudikgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwuYSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcGFjZTogJ0hTVicsXG4gICAgICAgICAgICAgICAgaDogb3JpZ2luYWwuaCxcbiAgICAgICAgICAgICAgICBzOiBvcmlnaW5hbC5zLFxuICAgICAgICAgICAgICAgIHY6IG9yaWdpbmFsLnYsXG4gICAgICAgICAgICAgICAgYTogb3JpZ2luYWwuYVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaDogY29sb3IuaCxcbiAgICAgICAgICAgICAgczogY29sb3IucyxcbiAgICAgICAgICAgICAgdjogY29sb3IudixcbiAgICAgICAgICAgICAgYTogY29sb3IuYVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBIU1ZfT0JKOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGlmIChjb21tb24uaXNOdW1iZXIob3JpZ2luYWwuaCkgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwucykgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwudikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcGFjZTogJ0hTVicsXG4gICAgICAgICAgICAgICAgaDogb3JpZ2luYWwuaCxcbiAgICAgICAgICAgICAgICBzOiBvcmlnaW5hbC5zLFxuICAgICAgICAgICAgICAgIHY6IG9yaWdpbmFsLnZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGg6IGNvbG9yLmgsXG4gICAgICAgICAgICAgIHM6IGNvbG9yLnMsXG4gICAgICAgICAgICAgIHY6IGNvbG9yLnZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9XG5cblxuICBdO1xuXG4gIHJldHVybiBpbnRlcnByZXQ7XG5cblxufSkoZGF0LmNvbG9yLnRvU3RyaW5nLFxuZGF0LnV0aWxzLmNvbW1vbik7XG5cblxuZGF0LkdVSSA9IGRhdC5ndWkuR1VJID0gKGZ1bmN0aW9uIChjc3MsIHNhdmVEaWFsb2d1ZUNvbnRlbnRzLCBzdHlsZVNoZWV0LCBjb250cm9sbGVyRmFjdG9yeSwgQ29udHJvbGxlciwgQm9vbGVhbkNvbnRyb2xsZXIsIEZ1bmN0aW9uQ29udHJvbGxlciwgTnVtYmVyQ29udHJvbGxlckJveCwgTnVtYmVyQ29udHJvbGxlclNsaWRlciwgT3B0aW9uQ29udHJvbGxlciwgQ29sb3JDb250cm9sbGVyLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIENlbnRlcmVkRGl2LCBkb20sIGNvbW1vbikge1xuXG4gIGNzcy5pbmplY3Qoc3R5bGVTaGVldCk7XG5cbiAgLyoqIE91dGVyLW1vc3QgY2xhc3NOYW1lIGZvciBHVUkncyAqL1xuICB2YXIgQ1NTX05BTUVTUEFDRSA9ICdkZyc7XG5cbiAgdmFyIEhJREVfS0VZX0NPREUgPSA3MjtcblxuICAvKiogVGhlIG9ubHkgdmFsdWUgc2hhcmVkIGJldHdlZW4gdGhlIEpTIGFuZCBTQ1NTLiBVc2UgY2F1dGlvbi4gKi9cbiAgdmFyIENMT1NFX0JVVFRPTl9IRUlHSFQgPSAyMDtcblxuICB2YXIgREVGQVVMVF9ERUZBVUxUX1BSRVNFVF9OQU1FID0gJ0RlZmF1bHQnO1xuXG4gIHZhciBTVVBQT1JUU19MT0NBTF9TVE9SQUdFID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gJ2xvY2FsU3RvcmFnZScgaW4gd2luZG93ICYmIHdpbmRvd1snbG9jYWxTdG9yYWdlJ10gIT09IG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSkoKTtcblxuICB2YXIgU0FWRV9ESUFMT0dVRTtcblxuICAvKiogSGF2ZSB3ZSB5ZXQgdG8gY3JlYXRlIGFuIGF1dG9QbGFjZSBHVUk/ICovXG4gIHZhciBhdXRvX3BsYWNlX3ZpcmdpbiA9IHRydWU7XG5cbiAgLyoqIEZpeGVkIHBvc2l0aW9uIGRpdiB0aGF0IGF1dG8gcGxhY2UgR1VJJ3MgZ28gaW5zaWRlICovXG4gIHZhciBhdXRvX3BsYWNlX2NvbnRhaW5lcjtcblxuICAvKiogQXJlIHdlIGhpZGluZyB0aGUgR1VJJ3MgPyAqL1xuICB2YXIgaGlkZSA9IGZhbHNlO1xuXG4gIC8qKiBHVUkncyB3aGljaCBzaG91bGQgYmUgaGlkZGVuICovXG4gIHZhciBoaWRlYWJsZV9ndWlzID0gW107XG5cbiAgLyoqXG4gICAqIEEgbGlnaHR3ZWlnaHQgY29udHJvbGxlciBsaWJyYXJ5IGZvciBKYXZhU2NyaXB0LiBJdCBhbGxvd3MgeW91IHRvIGVhc2lseVxuICAgKiBtYW5pcHVsYXRlIHZhcmlhYmxlcyBhbmQgZmlyZSBmdW5jdGlvbnMgb24gdGhlIGZseS5cbiAgICogQGNsYXNzXG4gICAqXG4gICAqIEBtZW1iZXIgZGF0Lmd1aVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMubmFtZV0gVGhlIG5hbWUgb2YgdGhpcyBHVUkuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmxvYWRdIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2F2ZWQgc3RhdGUgb2ZcbiAgICogdGhpcyBHVUkuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hdXRvPXRydWVdXG4gICAqIEBwYXJhbSB7ZGF0Lmd1aS5HVUl9IFtwYXJhbXMucGFyZW50XSBUaGUgR1VJIEknbSBuZXN0ZWQgaW4uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5jbG9zZWRdIElmIHRydWUsIHN0YXJ0cyBjbG9zZWRcbiAgICovXG4gIHZhciBHVUkgPSBmdW5jdGlvbihwYXJhbXMpIHtcblxuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBPdXRlcm1vc3QgRE9NIEVsZW1lbnRcbiAgICAgKiBAdHlwZSBET01FbGVtZW50XG4gICAgICovXG4gICAgdGhpcy5kb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fX3VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fX3VsKTtcblxuICAgIGRvbS5hZGRDbGFzcyh0aGlzLmRvbUVsZW1lbnQsIENTU19OQU1FU1BBQ0UpO1xuXG4gICAgLyoqXG4gICAgICogTmVzdGVkIEdVSSdzIGJ5IG5hbWVcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgdGhpcy5fX2ZvbGRlcnMgPSB7fTtcblxuICAgIHRoaXMuX19jb250cm9sbGVycyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBvYmplY3RzIEknbSByZW1lbWJlcmluZyBmb3Igc2F2ZSwgb25seSB1c2VkIGluIHRvcCBsZXZlbCBHVUlcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgdGhpcy5fX3JlbWVtYmVyZWRPYmplY3RzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIHRoZSBpbmRleCBvZiByZW1lbWJlcmVkIG9iamVjdHMgdG8gYSBtYXAgb2YgY29udHJvbGxlcnMsIG9ubHkgdXNlZFxuICAgICAqIGluIHRvcCBsZXZlbCBHVUkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogW1xuICAgICAqICB7XG4gICAgICogICAgcHJvcGVydHlOYW1lOiBDb250cm9sbGVyLFxuICAgICAqICAgIGFub3RoZXJQcm9wZXJ0eU5hbWU6IENvbnRyb2xsZXJcbiAgICAgKiAgfSxcbiAgICAgKiAge1xuICAgICAqICAgIHByb3BlcnR5TmFtZTogQ29udHJvbGxlclxuICAgICAqICB9XG4gICAgICogXVxuICAgICAqL1xuICAgIHRoaXMuX19yZW1lbWJlcmVkT2JqZWN0SW5kZWNlc1RvQ29udHJvbGxlcnMgPSBbXTtcblxuICAgIHRoaXMuX19saXN0ZW5pbmcgPSBbXTtcblxuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcblxuICAgIC8vIERlZmF1bHQgcGFyYW1ldGVyc1xuICAgIHBhcmFtcyA9IGNvbW1vbi5kZWZhdWx0cyhwYXJhbXMsIHtcbiAgICAgIGF1dG9QbGFjZTogdHJ1ZSxcbiAgICAgIHdpZHRoOiBHVUkuREVGQVVMVF9XSURUSFxuICAgIH0pO1xuXG4gICAgcGFyYW1zID0gY29tbW9uLmRlZmF1bHRzKHBhcmFtcywge1xuICAgICAgcmVzaXphYmxlOiBwYXJhbXMuYXV0b1BsYWNlLFxuICAgICAgaGlkZWFibGU6IHBhcmFtcy5hdXRvUGxhY2VcbiAgICB9KTtcblxuXG4gICAgaWYgKCFjb21tb24uaXNVbmRlZmluZWQocGFyYW1zLmxvYWQpKSB7XG5cbiAgICAgIC8vIEV4cGxpY2l0IHByZXNldFxuICAgICAgaWYgKHBhcmFtcy5wcmVzZXQpIHBhcmFtcy5sb2FkLnByZXNldCA9IHBhcmFtcy5wcmVzZXQ7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICBwYXJhbXMubG9hZCA9IHsgcHJlc2V0OiBERUZBVUxUX0RFRkFVTFRfUFJFU0VUX05BTUUgfTtcblxuICAgIH1cblxuICAgIGlmIChjb21tb24uaXNVbmRlZmluZWQocGFyYW1zLnBhcmVudCkgJiYgcGFyYW1zLmhpZGVhYmxlKSB7XG4gICAgICBoaWRlYWJsZV9ndWlzLnB1c2godGhpcyk7XG4gICAgfVxuXG4gICAgLy8gT25seSByb290IGxldmVsIEdVSSdzIGFyZSByZXNpemFibGUuXG4gICAgcGFyYW1zLnJlc2l6YWJsZSA9IGNvbW1vbi5pc1VuZGVmaW5lZChwYXJhbXMucGFyZW50KSAmJiBwYXJhbXMucmVzaXphYmxlO1xuXG5cbiAgICBpZiAocGFyYW1zLmF1dG9QbGFjZSAmJiBjb21tb24uaXNVbmRlZmluZWQocGFyYW1zLnNjcm9sbGFibGUpKSB7XG4gICAgICBwYXJhbXMuc2Nyb2xsYWJsZSA9IHRydWU7XG4gICAgfVxuLy8gICAgcGFyYW1zLnNjcm9sbGFibGUgPSBjb21tb24uaXNVbmRlZmluZWQocGFyYW1zLnBhcmVudCkgJiYgcGFyYW1zLnNjcm9sbGFibGUgPT09IHRydWU7XG5cbiAgICAvLyBOb3QgcGFydCBvZiBwYXJhbXMgYmVjYXVzZSBJIGRvbid0IHdhbnQgcGVvcGxlIHBhc3NpbmcgdGhpcyBpbiB2aWFcbiAgICAvLyBjb25zdHJ1Y3Rvci4gU2hvdWxkIGJlIGEgJ3JlbWVtYmVyZWQnIHZhbHVlLlxuICAgIHZhciB1c2VfbG9jYWxfc3RvcmFnZSA9XG4gICAgICAgIFNVUFBPUlRTX0xPQ0FMX1NUT1JBR0UgJiZcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldExvY2FsU3RvcmFnZUhhc2godGhpcywgJ2lzTG9jYWwnKSkgPT09ICd0cnVlJztcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsXG5cbiAgICAgICAgLyoqIEBsZW5kcyBkYXQuZ3VpLkdVSS5wcm90b3R5cGUgKi9cbiAgICAgICAge1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIHBhcmVudCA8Y29kZT5HVUk8L2NvZGU+XG4gICAgICAgICAgICogQHR5cGUgZGF0Lmd1aS5HVUlcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJhbXMucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBzY3JvbGxhYmxlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLnNjcm9sbGFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEhhbmRsZXMgPGNvZGU+R1VJPC9jb2RlPidzIGVsZW1lbnQgcGxhY2VtZW50IGZvciB5b3VcbiAgICAgICAgICAgKiBAdHlwZSBCb29sZWFuXG4gICAgICAgICAgICovXG4gICAgICAgICAgYXV0b1BsYWNlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLmF1dG9QbGFjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIGlkZW50aWZpZXIgZm9yIGEgc2V0IG9mIHNhdmVkIHZhbHVlc1xuICAgICAgICAgICAqIEB0eXBlIFN0cmluZ1xuICAgICAgICAgICAqL1xuICAgICAgICAgIHByZXNldDoge1xuXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoX3RoaXMucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmdldFJvb3QoKS5wcmVzZXQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5sb2FkLnByZXNldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5nZXRSb290KCkucHJlc2V0ID0gdjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubG9hZC5wcmVzZXQgPSB2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNldFByZXNldFNlbGVjdEluZGV4KHRoaXMpO1xuICAgICAgICAgICAgICBfdGhpcy5yZXZlcnQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgd2lkdGggb2YgPGNvZGU+R1VJPC9jb2RlPiBlbGVtZW50XG4gICAgICAgICAgICogQHR5cGUgTnVtYmVyXG4gICAgICAgICAgICovXG4gICAgICAgICAgd2lkdGg6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJhbXMud2lkdGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IHY7XG4gICAgICAgICAgICAgIHNldFdpZHRoKF90aGlzLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIG5hbWUgb2YgPGNvZGU+R1VJPC9jb2RlPi4gVXNlZCBmb3IgZm9sZGVycy4gaS5lXG4gICAgICAgICAgICogYSBmb2xkZXIncyBuYW1lXG4gICAgICAgICAgICogQHR5cGUgU3RyaW5nXG4gICAgICAgICAgICovXG4gICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5uYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odikge1xuICAgICAgICAgICAgICAvLyBUT0RPIENoZWNrIGZvciBjb2xsaXNpb25zIGFtb25nIHNpYmxpbmcgZm9sZGVyc1xuICAgICAgICAgICAgICBwYXJhbXMubmFtZSA9IHY7XG4gICAgICAgICAgICAgIGlmICh0aXRsZV9yb3dfbmFtZSkge1xuICAgICAgICAgICAgICAgIHRpdGxlX3Jvd19uYW1lLmlubmVySFRNTCA9IHBhcmFtcy5uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFdoZXRoZXIgdGhlIDxjb2RlPkdVSTwvY29kZT4gaXMgY29sbGFwc2VkIG9yIG5vdFxuICAgICAgICAgICAqIEB0eXBlIEJvb2xlYW5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjbG9zZWQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJhbXMuY2xvc2VkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24odikge1xuICAgICAgICAgICAgICBwYXJhbXMuY2xvc2VkID0gdjtcbiAgICAgICAgICAgICAgaWYgKHBhcmFtcy5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBkb20uYWRkQ2xhc3MoX3RoaXMuX191bCwgR1VJLkNMQVNTX0NMT1NFRCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUNsYXNzKF90aGlzLl9fdWwsIEdVSS5DTEFTU19DTE9TRUQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEZvciBicm93c2VycyB0aGF0IGFyZW4ndCBnb2luZyB0byByZXNwZWN0IHRoZSBDU1MgdHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgLy8gTGV0cyBqdXN0IGNoZWNrIG91ciBoZWlnaHQgYWdhaW5zdCB0aGUgd2luZG93IGhlaWdodCByaWdodCBvZmZcbiAgICAgICAgICAgICAgLy8gdGhlIGJhdC5cbiAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuXG4gICAgICAgICAgICAgIGlmIChfdGhpcy5fX2Nsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX19jbG9zZUJ1dHRvbi5pbm5lckhUTUwgPSB2ID8gR1VJLlRFWFRfT1BFTiA6IEdVSS5URVhUX0NMT1NFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDb250YWlucyBhbGwgcHJlc2V0c1xuICAgICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJhbXMubG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgPGEgaHJlZj1cImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS9TdG9yYWdlI2xvY2FsU3RvcmFnZVwiPmxvY2FsU3RvcmFnZTwvYT4gYXMgdGhlIG1lYW5zIGZvclxuICAgICAgICAgICAqIDxjb2RlPnJlbWVtYmVyPC9jb2RlPmluZ1xuICAgICAgICAgICAqIEB0eXBlIEJvb2xlYW5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB1c2VMb2NhbFN0b3JhZ2U6IHtcblxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVzZV9sb2NhbF9zdG9yYWdlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24oYm9vbCkge1xuICAgICAgICAgICAgICBpZiAoU1VQUE9SVFNfTE9DQUxfU1RPUkFHRSkge1xuICAgICAgICAgICAgICAgIHVzZV9sb2NhbF9zdG9yYWdlID0gYm9vbDtcbiAgICAgICAgICAgICAgICBpZiAoYm9vbCkge1xuICAgICAgICAgICAgICAgICAgZG9tLmJpbmQod2luZG93LCAndW5sb2FkJywgc2F2ZVRvTG9jYWxTdG9yYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZG9tLnVuYmluZCh3aW5kb3csICd1bmxvYWQnLCBzYXZlVG9Mb2NhbFN0b3JhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShnZXRMb2NhbFN0b3JhZ2VIYXNoKF90aGlzLCAnaXNMb2NhbCcpLCBib29sKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgLy8gQXJlIHdlIGEgcm9vdCBsZXZlbCBHVUk/XG4gICAgaWYgKGNvbW1vbi5pc1VuZGVmaW5lZChwYXJhbXMucGFyZW50KSkge1xuXG4gICAgICBwYXJhbXMuY2xvc2VkID0gZmFsc2U7XG5cbiAgICAgIGRvbS5hZGRDbGFzcyh0aGlzLmRvbUVsZW1lbnQsIEdVSS5DTEFTU19NQUlOKTtcbiAgICAgIGRvbS5tYWtlU2VsZWN0YWJsZSh0aGlzLmRvbUVsZW1lbnQsIGZhbHNlKTtcblxuICAgICAgLy8gQXJlIHdlIHN1cHBvc2VkIHRvIGJlIGxvYWRpbmcgbG9jYWxseT9cbiAgICAgIGlmIChTVVBQT1JUU19MT0NBTF9TVE9SQUdFKSB7XG5cbiAgICAgICAgaWYgKHVzZV9sb2NhbF9zdG9yYWdlKSB7XG5cbiAgICAgICAgICBfdGhpcy51c2VMb2NhbFN0b3JhZ2UgPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHNhdmVkX2d1aSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldExvY2FsU3RvcmFnZUhhc2godGhpcywgJ2d1aScpKTtcblxuICAgICAgICAgIGlmIChzYXZlZF9ndWkpIHtcbiAgICAgICAgICAgIHBhcmFtcy5sb2FkID0gSlNPTi5wYXJzZShzYXZlZF9ndWkpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fX2Nsb3NlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLl9fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gR1VJLlRFWFRfQ0xPU0VEO1xuICAgICAgZG9tLmFkZENsYXNzKHRoaXMuX19jbG9zZUJ1dHRvbiwgR1VJLkNMQVNTX0NMT1NFX0JVVFRPTik7XG4gICAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fX2Nsb3NlQnV0dG9uKTtcblxuICAgICAgZG9tLmJpbmQodGhpcy5fX2Nsb3NlQnV0dG9uLCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblxuICAgICAgICBfdGhpcy5jbG9zZWQgPSAhX3RoaXMuY2xvc2VkO1xuXG5cbiAgICAgIH0pO1xuXG5cbiAgICAgIC8vIE9oLCB5b3UncmUgYSBuZXN0ZWQgR1VJIVxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGlmIChwYXJhbXMuY2xvc2VkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1zLmNsb3NlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB0aXRsZV9yb3dfbmFtZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmFtcy5uYW1lKTtcbiAgICAgIGRvbS5hZGRDbGFzcyh0aXRsZV9yb3dfbmFtZSwgJ2NvbnRyb2xsZXItbmFtZScpO1xuXG4gICAgICB2YXIgdGl0bGVfcm93ID0gYWRkUm93KF90aGlzLCB0aXRsZV9yb3dfbmFtZSk7XG5cbiAgICAgIHZhciBvbl9jbGlja190aXRsZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBfdGhpcy5jbG9zZWQgPSAhX3RoaXMuY2xvc2VkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBkb20uYWRkQ2xhc3ModGhpcy5fX3VsLCBHVUkuQ0xBU1NfQ0xPU0VEKTtcblxuICAgICAgZG9tLmFkZENsYXNzKHRpdGxlX3JvdywgJ3RpdGxlJyk7XG4gICAgICBkb20uYmluZCh0aXRsZV9yb3csICdjbGljaycsIG9uX2NsaWNrX3RpdGxlKTtcblxuICAgICAgaWYgKCFwYXJhbXMuY2xvc2VkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmF1dG9QbGFjZSkge1xuXG4gICAgICBpZiAoY29tbW9uLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXJlbnQpKSB7XG5cbiAgICAgICAgaWYgKGF1dG9fcGxhY2VfdmlyZ2luKSB7XG4gICAgICAgICAgYXV0b19wbGFjZV9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBkb20uYWRkQ2xhc3MoYXV0b19wbGFjZV9jb250YWluZXIsIENTU19OQU1FU1BBQ0UpO1xuICAgICAgICAgIGRvbS5hZGRDbGFzcyhhdXRvX3BsYWNlX2NvbnRhaW5lciwgR1VJLkNMQVNTX0FVVE9fUExBQ0VfQ09OVEFJTkVSKTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGF1dG9fcGxhY2VfY29udGFpbmVyKTtcbiAgICAgICAgICBhdXRvX3BsYWNlX3ZpcmdpbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHV0IGl0IGluIHRoZSBkb20gZm9yIHlvdS5cbiAgICAgICAgYXV0b19wbGFjZV9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb21FbGVtZW50KTtcblxuICAgICAgICAvLyBBcHBseSB0aGUgYXV0byBzdHlsZXNcbiAgICAgICAgZG9tLmFkZENsYXNzKHRoaXMuZG9tRWxlbWVudCwgR1VJLkNMQVNTX0FVVE9fUExBQ0UpO1xuXG4gICAgICB9XG5cblxuICAgICAgLy8gTWFrZSBpdCBub3QgZWxhc3RpYy5cbiAgICAgIGlmICghdGhpcy5wYXJlbnQpIHNldFdpZHRoKF90aGlzLCBwYXJhbXMud2lkdGgpO1xuXG4gICAgfVxuXG4gICAgZG9tLmJpbmQod2luZG93LCAncmVzaXplJywgZnVuY3Rpb24oKSB7IF90aGlzLm9uUmVzaXplKCkgfSk7XG4gICAgZG9tLmJpbmQodGhpcy5fX3VsLCAnd2Via2l0VHJhbnNpdGlvbkVuZCcsIGZ1bmN0aW9uKCkgeyBfdGhpcy5vblJlc2l6ZSgpOyB9KTtcbiAgICBkb20uYmluZCh0aGlzLl9fdWwsICd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7IF90aGlzLm9uUmVzaXplKCkgfSk7XG4gICAgZG9tLmJpbmQodGhpcy5fX3VsLCAnb1RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbigpIHsgX3RoaXMub25SZXNpemUoKSB9KTtcbiAgICB0aGlzLm9uUmVzaXplKCk7XG5cblxuICAgIGlmIChwYXJhbXMucmVzaXphYmxlKSB7XG4gICAgICBhZGRSZXNpemVIYW5kbGUodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2F2ZVRvTG9jYWxTdG9yYWdlKCkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0TG9jYWxTdG9yYWdlSGFzaChfdGhpcywgJ2d1aScpLCBKU09OLnN0cmluZ2lmeShfdGhpcy5nZXRTYXZlT2JqZWN0KCkpKTtcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IF90aGlzLmdldFJvb3QoKTtcbiAgICBmdW5jdGlvbiByZXNldFdpZHRoKCkge1xuICAgICAgICB2YXIgcm9vdCA9IF90aGlzLmdldFJvb3QoKTtcbiAgICAgICAgcm9vdC53aWR0aCArPSAxO1xuICAgICAgICBjb21tb24uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcm9vdC53aWR0aCAtPSAxO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJhbXMucGFyZW50KSB7XG4gICAgICAgIHJlc2V0V2lkdGgoKTtcbiAgICAgIH1cblxuICB9O1xuXG4gIEdVSS50b2dnbGVIaWRlID0gZnVuY3Rpb24oKSB7XG5cbiAgICBoaWRlID0gIWhpZGU7XG4gICAgY29tbW9uLmVhY2goaGlkZWFibGVfZ3VpcywgZnVuY3Rpb24oZ3VpKSB7XG4gICAgICBndWkuZG9tRWxlbWVudC5zdHlsZS56SW5kZXggPSBoaWRlID8gLTk5OSA6IDk5OTtcbiAgICAgIGd1aS5kb21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSBoaWRlID8gMCA6IDE7XG4gICAgfSk7XG4gIH07XG5cbiAgR1VJLkNMQVNTX0FVVE9fUExBQ0UgPSAnYSc7XG4gIEdVSS5DTEFTU19BVVRPX1BMQUNFX0NPTlRBSU5FUiA9ICdhYyc7XG4gIEdVSS5DTEFTU19NQUlOID0gJ21haW4nO1xuICBHVUkuQ0xBU1NfQ09OVFJPTExFUl9ST1cgPSAnY3InO1xuICBHVUkuQ0xBU1NfVE9PX1RBTEwgPSAndGFsbGVyLXRoYW4td2luZG93JztcbiAgR1VJLkNMQVNTX0NMT1NFRCA9ICdjbG9zZWQnO1xuICBHVUkuQ0xBU1NfQ0xPU0VfQlVUVE9OID0gJ2Nsb3NlLWJ1dHRvbic7XG4gIEdVSS5DTEFTU19EUkFHID0gJ2RyYWcnO1xuXG4gIEdVSS5ERUZBVUxUX1dJRFRIID0gMjQ1O1xuICBHVUkuVEVYVF9DTE9TRUQgPSAnQ2xvc2UgQ29udHJvbHMnO1xuICBHVUkuVEVYVF9PUEVOID0gJ09wZW4gQ29udHJvbHMnO1xuXG4gIGRvbS5iaW5kKHdpbmRvdywgJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50eXBlICE9PSAndGV4dCcgJiZcbiAgICAgICAgKGUud2hpY2ggPT09IEhJREVfS0VZX0NPREUgfHwgZS5rZXlDb2RlID09IEhJREVfS0VZX0NPREUpKSB7XG4gICAgICBHVUkudG9nZ2xlSGlkZSgpO1xuICAgIH1cblxuICB9LCBmYWxzZSk7XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgR1VJLnByb3RvdHlwZSxcblxuICAgICAgLyoqIEBsZW5kcyBkYXQuZ3VpLkdVSSAqL1xuICAgICAge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gb2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eVxuICAgICAgICAgKiBAcmV0dXJucyB7ZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXJ9IFRoZSBuZXcgY29udHJvbGxlciB0aGF0IHdhcyBhZGRlZC5cbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqL1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHtcblxuICAgICAgICAgIHJldHVybiBhZGQoXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5QXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gb2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eVxuICAgICAgICAgKiBAcmV0dXJucyB7ZGF0LmNvbnRyb2xsZXJzLkNvbG9yQ29udHJvbGxlcn0gVGhlIG5ldyBjb250cm9sbGVyIHRoYXQgd2FzIGFkZGVkLlxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICovXG4gICAgICAgIGFkZENvbG9yOiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7XG5cbiAgICAgICAgICByZXR1cm4gYWRkKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29sb3I6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIGNvbnRyb2xsZXJcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqL1xuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHtcblxuICAgICAgICAgIC8vIFRPRE8gbGlzdGVuaW5nP1xuICAgICAgICAgIHRoaXMuX191bC5yZW1vdmVDaGlsZChjb250cm9sbGVyLl9fbGkpO1xuICAgICAgICAgIHRoaXMuX19jb250cm9sbGVycy5zbGljZSh0aGlzLl9fY29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKSwgMSk7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBjb21tb24uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBfdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICBpZiAodGhpcy5hdXRvUGxhY2UpIHtcbiAgICAgICAgICAgIGF1dG9fcGxhY2VfY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tRWxlbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICAgICAqIEByZXR1cm5zIHtkYXQuZ3VpLkdVSX0gVGhlIG5ldyBmb2xkZXIuXG4gICAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGlzIEdVSSBhbHJlYWR5IGhhcyBhIGZvbGRlciBieSB0aGUgc3BlY2lmaWVkXG4gICAgICAgICAqIG5hbWVcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqL1xuICAgICAgICBhZGRGb2xkZXI6IGZ1bmN0aW9uKG5hbWUpIHtcblxuICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcHJldmVudCBjb2xsaXNpb25zIG9uIG5hbWVzIGluIG9yZGVyIHRvIGhhdmUgYSBrZXlcbiAgICAgICAgICAvLyBieSB3aGljaCB0byByZW1lbWJlciBzYXZlZCB2YWx1ZXNcbiAgICAgICAgICBpZiAodGhpcy5fX2ZvbGRlcnNbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgYWxyZWFkeSBoYXZlIGEgZm9sZGVyIGluIHRoaXMgR1VJIGJ5IHRoZScgK1xuICAgICAgICAgICAgICAgICcgbmFtZSBcIicgKyBuYW1lICsgJ1wiJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5ld19ndWlfcGFyYW1zID0geyBuYW1lOiBuYW1lLCBwYXJlbnQ6IHRoaXMgfTtcblxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcGFzcyBkb3duIHRoZSBhdXRvUGxhY2UgdHJhaXQgc28gdGhhdCB3ZSBjYW5cbiAgICAgICAgICAvLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIHRvIG9wZW4vY2xvc2UgZm9sZGVyIGFjdGlvbnMgdG9cbiAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBhIHNjcm9sbGJhciBhcHBlYXJzIGlmIHRoZSB3aW5kb3cgaXMgdG9vIHNob3J0LlxuICAgICAgICAgIG5ld19ndWlfcGFyYW1zLmF1dG9QbGFjZSA9IHRoaXMuYXV0b1BsYWNlO1xuXG4gICAgICAgICAgLy8gRG8gd2UgaGF2ZSBzYXZlZCBhcHBlYXJhbmNlIGRhdGEgZm9yIHRoaXMgZm9sZGVyP1xuXG4gICAgICAgICAgaWYgKHRoaXMubG9hZCAmJiAvLyBBbnl0aGluZyBsb2FkZWQ/XG4gICAgICAgICAgICAgIHRoaXMubG9hZC5mb2xkZXJzICYmIC8vIFdhcyBteSBwYXJlbnQgYSBkZWFkLWVuZD9cbiAgICAgICAgICAgICAgdGhpcy5sb2FkLmZvbGRlcnNbbmFtZV0pIHsgLy8gRGlkIGRhZGR5IHJlbWVtYmVyIG1lP1xuXG4gICAgICAgICAgICAvLyBTdGFydCBtZSBjbG9zZWQgaWYgSSB3YXMgY2xvc2VkXG4gICAgICAgICAgICBuZXdfZ3VpX3BhcmFtcy5jbG9zZWQgPSB0aGlzLmxvYWQuZm9sZGVyc1tuYW1lXS5jbG9zZWQ7XG5cbiAgICAgICAgICAgIC8vIFBhc3MgZG93biB0aGUgbG9hZGVkIGRhdGFcbiAgICAgICAgICAgIG5ld19ndWlfcGFyYW1zLmxvYWQgPSB0aGlzLmxvYWQuZm9sZGVyc1tuYW1lXTtcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBndWkgPSBuZXcgR1VJKG5ld19ndWlfcGFyYW1zKTtcbiAgICAgICAgICB0aGlzLl9fZm9sZGVyc1tuYW1lXSA9IGd1aTtcblxuICAgICAgICAgIHZhciBsaSA9IGFkZFJvdyh0aGlzLCBndWkuZG9tRWxlbWVudCk7XG4gICAgICAgICAgZG9tLmFkZENsYXNzKGxpLCAnZm9sZGVyJyk7XG4gICAgICAgICAgcmV0dXJuIGd1aTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICB2YXIgcm9vdCA9IHRoaXMuZ2V0Um9vdCgpO1xuXG4gICAgICAgICAgaWYgKHJvb3Quc2Nyb2xsYWJsZSkge1xuXG4gICAgICAgICAgICB2YXIgdG9wID0gZG9tLmdldE9mZnNldChyb290Ll9fdWwpLnRvcDtcbiAgICAgICAgICAgIHZhciBoID0gMDtcblxuICAgICAgICAgICAgY29tbW9uLmVhY2gocm9vdC5fX3VsLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgaWYgKCEgKHJvb3QuYXV0b1BsYWNlICYmIG5vZGUgPT09IHJvb3QuX19zYXZlX3JvdykpXG4gICAgICAgICAgICAgICAgaCArPSBkb20uZ2V0SGVpZ2h0KG5vZGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJIZWlnaHQgLSB0b3AgLSBDTE9TRV9CVVRUT05fSEVJR0hUIDwgaCkge1xuICAgICAgICAgICAgICBkb20uYWRkQ2xhc3Mocm9vdC5kb21FbGVtZW50LCBHVUkuQ0xBU1NfVE9PX1RBTEwpO1xuICAgICAgICAgICAgICByb290Ll9fdWwuc3R5bGUuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IC0gdG9wIC0gQ0xPU0VfQlVUVE9OX0hFSUdIVCArICdweCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkb20ucmVtb3ZlQ2xhc3Mocm9vdC5kb21FbGVtZW50LCBHVUkuQ0xBU1NfVE9PX1RBTEwpO1xuICAgICAgICAgICAgICByb290Ll9fdWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJvb3QuX19yZXNpemVfaGFuZGxlKSB7XG4gICAgICAgICAgICBjb21tb24uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJvb3QuX19yZXNpemVfaGFuZGxlLnN0eWxlLmhlaWdodCA9IHJvb3QuX191bC5vZmZzZXRIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJvb3QuX19jbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgcm9vdC5fX2Nsb3NlQnV0dG9uLnN0eWxlLndpZHRoID0gcm9vdC53aWR0aCArICdweCc7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcmsgb2JqZWN0cyBmb3Igc2F2aW5nLiBUaGUgb3JkZXIgb2YgdGhlc2Ugb2JqZWN0cyBjYW5ub3QgY2hhbmdlIGFzXG4gICAgICAgICAqIHRoZSBHVUkgZ3Jvd3MuIFdoZW4gcmVtZW1iZXJpbmcgbmV3IG9iamVjdHMsIGFwcGVuZCB0aGVtIHRvIHRoZSBlbmRcbiAgICAgICAgICogb2YgdGhlIGxpc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0Li4ufSBvYmplY3RzXG4gICAgICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBub3QgY2FsbGVkIG9uIGEgdG9wIGxldmVsIEdVSS5cbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqL1xuICAgICAgICByZW1lbWJlcjogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICBpZiAoY29tbW9uLmlzVW5kZWZpbmVkKFNBVkVfRElBTE9HVUUpKSB7XG4gICAgICAgICAgICBTQVZFX0RJQUxPR1VFID0gbmV3IENlbnRlcmVkRGl2KCk7XG4gICAgICAgICAgICBTQVZFX0RJQUxPR1VFLmRvbUVsZW1lbnQuaW5uZXJIVE1MID0gc2F2ZURpYWxvZ3VlQ29udGVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2FuIG9ubHkgY2FsbCByZW1lbWJlciBvbiBhIHRvcCBsZXZlbCBHVUkuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICBjb21tb24uZWFjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5fX3JlbWVtYmVyZWRPYmplY3RzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIGFkZFNhdmVNZW51KF90aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5fX3JlbWVtYmVyZWRPYmplY3RzLmluZGV4T2Yob2JqZWN0KSA9PSAtMSkge1xuICAgICAgICAgICAgICBfdGhpcy5fX3JlbWVtYmVyZWRPYmplY3RzLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0aGlzLmF1dG9QbGFjZSkge1xuICAgICAgICAgICAgLy8gU2V0IHNhdmUgcm93IHdpZHRoXG4gICAgICAgICAgICBzZXRXaWR0aCh0aGlzLCB0aGlzLndpZHRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMge2RhdC5ndWkuR1VJfSB0aGUgdG9wbW9zdCBwYXJlbnQgR1VJIG9mIGEgbmVzdGVkIEdVSS5cbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqL1xuICAgICAgICBnZXRSb290OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgZ3VpID0gdGhpcztcbiAgICAgICAgICB3aGlsZSAoZ3VpLnBhcmVudCkge1xuICAgICAgICAgICAgZ3VpID0gZ3VpLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGd1aTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gYSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2ZcbiAgICAgICAgICogdGhpcyBHVUkgYXMgd2VsbCBhcyBpdHMgcmVtZW1iZXJlZCBwcm9wZXJ0aWVzLlxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICovXG4gICAgICAgIGdldFNhdmVPYmplY3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgdmFyIHRvUmV0dXJuID0gdGhpcy5sb2FkO1xuXG4gICAgICAgICAgdG9SZXR1cm4uY2xvc2VkID0gdGhpcy5jbG9zZWQ7XG5cbiAgICAgICAgICAvLyBBbSBJIHJlbWVtYmVyaW5nIGFueSB2YWx1ZXM/XG4gICAgICAgICAgaWYgKHRoaXMuX19yZW1lbWJlcmVkT2JqZWN0cy5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIHRvUmV0dXJuLnByZXNldCA9IHRoaXMucHJlc2V0O1xuXG4gICAgICAgICAgICBpZiAoIXRvUmV0dXJuLnJlbWVtYmVyZWQpIHtcbiAgICAgICAgICAgICAgdG9SZXR1cm4ucmVtZW1iZXJlZCA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0b1JldHVybi5yZW1lbWJlcmVkW3RoaXMucHJlc2V0XSA9IGdldEN1cnJlbnRQcmVzZXQodGhpcyk7XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0b1JldHVybi5mb2xkZXJzID0ge307XG4gICAgICAgICAgY29tbW9uLmVhY2godGhpcy5fX2ZvbGRlcnMsIGZ1bmN0aW9uKGVsZW1lbnQsIGtleSkge1xuICAgICAgICAgICAgdG9SZXR1cm4uZm9sZGVyc1trZXldID0gZWxlbWVudC5nZXRTYXZlT2JqZWN0KCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdG9SZXR1cm47XG5cbiAgICAgICAgfSxcblxuICAgICAgICBzYXZlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgIGlmICghdGhpcy5sb2FkLnJlbWVtYmVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZC5yZW1lbWJlcmVkID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sb2FkLnJlbWVtYmVyZWRbdGhpcy5wcmVzZXRdID0gZ2V0Q3VycmVudFByZXNldCh0aGlzKTtcbiAgICAgICAgICBtYXJrUHJlc2V0TW9kaWZpZWQodGhpcywgZmFsc2UpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2F2ZUFzOiBmdW5jdGlvbihwcmVzZXROYW1lKSB7XG5cbiAgICAgICAgICBpZiAoIXRoaXMubG9hZC5yZW1lbWJlcmVkKSB7XG5cbiAgICAgICAgICAgIC8vIFJldGFpbiBkZWZhdWx0IHZhbHVlcyB1cG9uIGZpcnN0IHNhdmVcbiAgICAgICAgICAgIHRoaXMubG9hZC5yZW1lbWJlcmVkID0ge307XG4gICAgICAgICAgICB0aGlzLmxvYWQucmVtZW1iZXJlZFtERUZBVUxUX0RFRkFVTFRfUFJFU0VUX05BTUVdID0gZ2V0Q3VycmVudFByZXNldCh0aGlzLCB0cnVlKTtcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9hZC5yZW1lbWJlcmVkW3ByZXNldE5hbWVdID0gZ2V0Q3VycmVudFByZXNldCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnByZXNldCA9IHByZXNldE5hbWU7XG4gICAgICAgICAgYWRkUHJlc2V0T3B0aW9uKHRoaXMsIHByZXNldE5hbWUsIHRydWUpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmV2ZXJ0OiBmdW5jdGlvbihndWkpIHtcblxuICAgICAgICAgIGNvbW1vbi5lYWNoKHRoaXMuX19jb250cm9sbGVycywgZnVuY3Rpb24oY29udHJvbGxlcikge1xuICAgICAgICAgICAgLy8gTWFrZSByZXZlcnQgd29yayBvbiBEZWZhdWx0LlxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldFJvb3QoKS5sb2FkLnJlbWVtYmVyZWQpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRWYWx1ZShjb250cm9sbGVyLmluaXRpYWxWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWNhbGxTYXZlZFZhbHVlKGd1aSB8fCB0aGlzLmdldFJvb3QoKSwgY29udHJvbGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICBjb21tb24uZWFjaCh0aGlzLl9fZm9sZGVycywgZnVuY3Rpb24oZm9sZGVyKSB7XG4gICAgICAgICAgICBmb2xkZXIucmV2ZXJ0KGZvbGRlcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIWd1aSkge1xuICAgICAgICAgICAgbWFya1ByZXNldE1vZGlmaWVkKHRoaXMuZ2V0Um9vdCgpLCBmYWxzZSk7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgfSxcblxuICAgICAgICBsaXN0ZW46IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHtcblxuICAgICAgICAgIHZhciBpbml0ID0gdGhpcy5fX2xpc3RlbmluZy5sZW5ndGggPT0gMDtcbiAgICAgICAgICB0aGlzLl9fbGlzdGVuaW5nLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgICAgaWYgKGluaXQpIHVwZGF0ZURpc3BsYXlzKHRoaXMuX19saXN0ZW5pbmcpO1xuXG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICk7XG5cbiAgZnVuY3Rpb24gYWRkKGd1aSwgb2JqZWN0LCBwcm9wZXJ0eSwgcGFyYW1zKSB7XG5cbiAgICBpZiAob2JqZWN0W3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3QgXCIgKyBvYmplY3QgKyBcIiBoYXMgbm8gcHJvcGVydHkgXFxcIlwiICsgcHJvcGVydHkgKyBcIlxcXCJcIik7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRyb2xsZXI7XG5cbiAgICBpZiAocGFyYW1zLmNvbG9yKSB7XG5cbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQ29sb3JDb250cm9sbGVyKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIGZhY3RvcnlBcmdzID0gW29iamVjdCxwcm9wZXJ0eV0uY29uY2F0KHBhcmFtcy5mYWN0b3J5QXJncyk7XG4gICAgICBjb250cm9sbGVyID0gY29udHJvbGxlckZhY3RvcnkuYXBwbHkoZ3VpLCBmYWN0b3J5QXJncyk7XG5cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmJlZm9yZSBpbnN0YW5jZW9mIENvbnRyb2xsZXIpIHtcbiAgICAgIHBhcmFtcy5iZWZvcmUgPSBwYXJhbXMuYmVmb3JlLl9fbGk7XG4gICAgfVxuXG4gICAgcmVjYWxsU2F2ZWRWYWx1ZShndWksIGNvbnRyb2xsZXIpO1xuXG4gICAgZG9tLmFkZENsYXNzKGNvbnRyb2xsZXIuZG9tRWxlbWVudCwgJ2MnKTtcblxuICAgIHZhciBuYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGRvbS5hZGRDbGFzcyhuYW1lLCAncHJvcGVydHktbmFtZScpO1xuICAgIG5hbWUuaW5uZXJIVE1MID0gY29udHJvbGxlci5wcm9wZXJ0eTtcblxuICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobmFtZSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRyb2xsZXIuZG9tRWxlbWVudCk7XG5cbiAgICB2YXIgbGkgPSBhZGRSb3coZ3VpLCBjb250YWluZXIsIHBhcmFtcy5iZWZvcmUpO1xuXG4gICAgZG9tLmFkZENsYXNzKGxpLCBHVUkuQ0xBU1NfQ09OVFJPTExFUl9ST1cpO1xuICAgIGRvbS5hZGRDbGFzcyhsaSwgdHlwZW9mIGNvbnRyb2xsZXIuZ2V0VmFsdWUoKSk7XG5cbiAgICBhdWdtZW50Q29udHJvbGxlcihndWksIGxpLCBjb250cm9sbGVyKTtcblxuICAgIGd1aS5fX2NvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gY29udHJvbGxlcjtcblxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHJvdyB0byB0aGUgZW5kIG9mIHRoZSBHVUkgb3IgYmVmb3JlIGFub3RoZXIgcm93LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpXG4gICAqIEBwYXJhbSBbZG9tXSBJZiBzcGVjaWZpZWQsIGluc2VydHMgdGhlIGRvbSBjb250ZW50IGluIHRoZSBuZXcgcm93XG4gICAqIEBwYXJhbSBbbGlCZWZvcmVdIElmIHNwZWNpZmllZCwgcGxhY2VzIHRoZSBuZXcgcm93IGJlZm9yZSBhbm90aGVyIHJvd1xuICAgKi9cbiAgZnVuY3Rpb24gYWRkUm93KGd1aSwgZG9tLCBsaUJlZm9yZSkge1xuICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgaWYgKGRvbSkgbGkuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICBpZiAobGlCZWZvcmUpIHtcbiAgICAgIGd1aS5fX3VsLmluc2VydEJlZm9yZShsaSwgcGFyYW1zLmJlZm9yZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGd1aS5fX3VsLmFwcGVuZENoaWxkKGxpKTtcbiAgICB9XG4gICAgZ3VpLm9uUmVzaXplKCk7XG4gICAgcmV0dXJuIGxpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXVnbWVudENvbnRyb2xsZXIoZ3VpLCBsaSwgY29udHJvbGxlcikge1xuXG4gICAgY29udHJvbGxlci5fX2xpID0gbGk7XG4gICAgY29udHJvbGxlci5fX2d1aSA9IGd1aTtcblxuICAgIGNvbW1vbi5leHRlbmQoY29udHJvbGxlciwge1xuXG4gICAgICBvcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29udHJvbGxlci5yZW1vdmUoKTtcblxuICAgICAgICAgIHJldHVybiBhZGQoXG4gICAgICAgICAgICAgIGd1aSxcbiAgICAgICAgICAgICAgY29udHJvbGxlci5vYmplY3QsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIucHJvcGVydHksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWZvcmU6IGNvbnRyb2xsZXIuX19saS5uZXh0RWxlbWVudFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgZmFjdG9yeUFyZ3M6IFtjb21tb24udG9BcnJheShhcmd1bWVudHMpXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1vbi5pc0FycmF5KG9wdGlvbnMpIHx8IGNvbW1vbi5pc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICAgIGNvbnRyb2xsZXIucmVtb3ZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gYWRkKFxuICAgICAgICAgICAgICBndWksXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIub2JqZWN0LFxuICAgICAgICAgICAgICBjb250cm9sbGVyLnByb3BlcnR5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVmb3JlOiBjb250cm9sbGVyLl9fbGkubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIGZhY3RvcnlBcmdzOiBbb3B0aW9uc11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG5cbiAgICAgICAgfVxuXG4gICAgICB9LFxuXG4gICAgICBuYW1lOiBmdW5jdGlvbih2KSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX19saS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZC5pbm5lckhUTUwgPSB2O1xuICAgICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICAgIH0sXG5cbiAgICAgIGxpc3RlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX19ndWkubGlzdGVuKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuX19ndWkucmVtb3ZlKGNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgLy8gQWxsIHNsaWRlcnMgc2hvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IGEgYm94LlxuICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgTnVtYmVyQ29udHJvbGxlclNsaWRlcikge1xuXG4gICAgICB2YXIgYm94ID0gbmV3IE51bWJlckNvbnRyb2xsZXJCb3goY29udHJvbGxlci5vYmplY3QsIGNvbnRyb2xsZXIucHJvcGVydHksXG4gICAgICAgICAgeyBtaW46IGNvbnRyb2xsZXIuX19taW4sIG1heDogY29udHJvbGxlci5fX21heCwgc3RlcDogY29udHJvbGxlci5fX3N0ZXAgfSk7XG5cbiAgICAgIGNvbW1vbi5lYWNoKFsndXBkYXRlRGlzcGxheScsICdvbkNoYW5nZScsICdvbkZpbmlzaENoYW5nZSddLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgdmFyIHBjID0gY29udHJvbGxlclttZXRob2RdO1xuICAgICAgICB2YXIgcGIgPSBib3hbbWV0aG9kXTtcbiAgICAgICAgY29udHJvbGxlclttZXRob2RdID0gYm94W21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgcGMuYXBwbHkoY29udHJvbGxlciwgYXJncyk7XG4gICAgICAgICAgcmV0dXJuIHBiLmFwcGx5KGJveCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBkb20uYWRkQ2xhc3MobGksICdoYXMtc2xpZGVyJyk7XG4gICAgICBjb250cm9sbGVyLmRvbUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGJveC5kb21FbGVtZW50LCBjb250cm9sbGVyLmRvbUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuXG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBOdW1iZXJDb250cm9sbGVyQm94KSB7XG5cbiAgICAgIHZhciByID0gZnVuY3Rpb24ocmV0dXJuZWQpIHtcblxuICAgICAgICAvLyBIYXZlIHdlIGRlZmluZWQgYm90aCBib3VuZGFyaWVzP1xuICAgICAgICBpZiAoY29tbW9uLmlzTnVtYmVyKGNvbnRyb2xsZXIuX19taW4pICYmIGNvbW1vbi5pc051bWJlcihjb250cm9sbGVyLl9fbWF4KSkge1xuXG4gICAgICAgICAgLy8gV2VsbCwgdGhlbiBsZXRzIGp1c3QgcmVwbGFjZSB0aGlzIHdpdGggYSBzbGlkZXIuXG4gICAgICAgICAgY29udHJvbGxlci5yZW1vdmUoKTtcbiAgICAgICAgICByZXR1cm4gYWRkKFxuICAgICAgICAgICAgICBndWksXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIub2JqZWN0LFxuICAgICAgICAgICAgICBjb250cm9sbGVyLnByb3BlcnR5LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVmb3JlOiBjb250cm9sbGVyLl9fbGkubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIGZhY3RvcnlBcmdzOiBbY29udHJvbGxlci5fX21pbiwgY29udHJvbGxlci5fX21heCwgY29udHJvbGxlci5fX3N0ZXBdXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0dXJuZWQ7XG5cbiAgICAgIH07XG5cbiAgICAgIGNvbnRyb2xsZXIubWluID0gY29tbW9uLmNvbXBvc2UociwgY29udHJvbGxlci5taW4pO1xuICAgICAgY29udHJvbGxlci5tYXggPSBjb21tb24uY29tcG9zZShyLCBjb250cm9sbGVyLm1heCk7XG5cbiAgICB9XG4gICAgZWxzZSBpZiAoY29udHJvbGxlciBpbnN0YW5jZW9mIEJvb2xlYW5Db250cm9sbGVyKSB7XG5cbiAgICAgIGRvbS5iaW5kKGxpLCAnY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9tLmZha2VFdmVudChjb250cm9sbGVyLl9fY2hlY2tib3gsICdjbGljaycpO1xuICAgICAgfSk7XG5cbiAgICAgIGRvbS5iaW5kKGNvbnRyb2xsZXIuX19jaGVja2JveCwgJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBQcmV2ZW50cyBkb3VibGUtdG9nZ2xlXG4gICAgICB9KVxuXG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBGdW5jdGlvbkNvbnRyb2xsZXIpIHtcblxuICAgICAgZG9tLmJpbmQobGksICdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBkb20uZmFrZUV2ZW50KGNvbnRyb2xsZXIuX19idXR0b24sICdjbGljaycpO1xuICAgICAgfSk7XG5cbiAgICAgIGRvbS5iaW5kKGxpLCAnbW91c2VvdmVyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGRvbS5hZGRDbGFzcyhjb250cm9sbGVyLl9fYnV0dG9uLCAnaG92ZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICBkb20uYmluZChsaSwgJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGRvbS5yZW1vdmVDbGFzcyhjb250cm9sbGVyLl9fYnV0dG9uLCAnaG92ZXInKTtcbiAgICAgIH0pO1xuXG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xsZXIpIHtcblxuICAgICAgZG9tLmFkZENsYXNzKGxpLCAnY29sb3InKTtcbiAgICAgIGNvbnRyb2xsZXIudXBkYXRlRGlzcGxheSA9IGNvbW1vbi5jb21wb3NlKGZ1bmN0aW9uKHIpIHtcbiAgICAgICAgbGkuc3R5bGUuYm9yZGVyTGVmdENvbG9yID0gY29udHJvbGxlci5fX2NvbG9yLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSwgY29udHJvbGxlci51cGRhdGVEaXNwbGF5KTtcblxuICAgICAgY29udHJvbGxlci51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICB9XG5cbiAgICBjb250cm9sbGVyLnNldFZhbHVlID0gY29tbW9uLmNvbXBvc2UoZnVuY3Rpb24ocikge1xuICAgICAgaWYgKGd1aS5nZXRSb290KCkuX19wcmVzZXRfc2VsZWN0ICYmIGNvbnRyb2xsZXIuaXNNb2RpZmllZCgpKSB7XG4gICAgICAgIG1hcmtQcmVzZXRNb2RpZmllZChndWkuZ2V0Um9vdCgpLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByO1xuICAgIH0sIGNvbnRyb2xsZXIuc2V0VmFsdWUpO1xuXG4gIH1cblxuICBmdW5jdGlvbiByZWNhbGxTYXZlZFZhbHVlKGd1aSwgY29udHJvbGxlcikge1xuXG4gICAgLy8gRmluZCB0aGUgdG9wbW9zdCBHVUksIHRoYXQncyB3aGVyZSByZW1lbWJlcmVkIG9iamVjdHMgbGl2ZS5cbiAgICB2YXIgcm9vdCA9IGd1aS5nZXRSb290KCk7XG5cbiAgICAvLyBEb2VzIHRoZSBvYmplY3Qgd2UncmUgY29udHJvbGxpbmcgbWF0Y2ggYW55dGhpbmcgd2UndmUgYmVlbiB0b2xkIHRvXG4gICAgLy8gcmVtZW1iZXI/XG4gICAgdmFyIG1hdGNoZWRfaW5kZXggPSByb290Ll9fcmVtZW1iZXJlZE9iamVjdHMuaW5kZXhPZihjb250cm9sbGVyLm9iamVjdCk7XG5cbiAgICAvLyBXaHkgeWVzLCBpdCBkb2VzIVxuICAgIGlmIChtYXRjaGVkX2luZGV4ICE9IC0xKSB7XG5cbiAgICAgIC8vIExldCBtZSBmZXRjaCBhIG1hcCBvZiBjb250cm9sbGVycyBmb3IgdGhjb21tb24uaXNPYmplY3QuXG4gICAgICB2YXIgY29udHJvbGxlcl9tYXAgPVxuICAgICAgICAgIHJvb3QuX19yZW1lbWJlcmVkT2JqZWN0SW5kZWNlc1RvQ29udHJvbGxlcnNbbWF0Y2hlZF9pbmRleF07XG5cbiAgICAgIC8vIE9ocCwgSSBiZWxpZXZlIHRoaXMgaXMgdGhlIGZpcnN0IGNvbnRyb2xsZXIgd2UndmUgY3JlYXRlZCBmb3IgdGhpc1xuICAgICAgLy8gb2JqZWN0LiBMZXRzIG1ha2UgdGhlIG1hcCBmcmVzaC5cbiAgICAgIGlmIChjb250cm9sbGVyX21hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRyb2xsZXJfbWFwID0ge307XG4gICAgICAgIHJvb3QuX19yZW1lbWJlcmVkT2JqZWN0SW5kZWNlc1RvQ29udHJvbGxlcnNbbWF0Y2hlZF9pbmRleF0gPVxuICAgICAgICAgICAgY29udHJvbGxlcl9tYXA7XG4gICAgICB9XG5cbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhpcyBjb250cm9sbGVyXG4gICAgICBjb250cm9sbGVyX21hcFtjb250cm9sbGVyLnByb3BlcnR5XSA9IGNvbnRyb2xsZXI7XG5cbiAgICAgIC8vIE9rYXksIG5vdyBoYXZlIHdlIHNhdmVkIGFueSB2YWx1ZXMgZm9yIHRoaXMgY29udHJvbGxlcj9cbiAgICAgIGlmIChyb290LmxvYWQgJiYgcm9vdC5sb2FkLnJlbWVtYmVyZWQpIHtcblxuICAgICAgICB2YXIgcHJlc2V0X21hcCA9IHJvb3QubG9hZC5yZW1lbWJlcmVkO1xuXG4gICAgICAgIC8vIFdoaWNoIHByZXNldCBhcmUgd2UgdHJ5aW5nIHRvIGxvYWQ/XG4gICAgICAgIHZhciBwcmVzZXQ7XG5cbiAgICAgICAgaWYgKHByZXNldF9tYXBbZ3VpLnByZXNldF0pIHtcblxuICAgICAgICAgIHByZXNldCA9IHByZXNldF9tYXBbZ3VpLnByZXNldF07XG5cbiAgICAgICAgfSBlbHNlIGlmIChwcmVzZXRfbWFwW0RFRkFVTFRfREVGQVVMVF9QUkVTRVRfTkFNRV0pIHtcblxuICAgICAgICAgIC8vIFVoaCwgeW91IGNhbiBoYXZlIHRoZSBkZWZhdWx0IGluc3RlYWQ/XG4gICAgICAgICAgcHJlc2V0ID0gcHJlc2V0X21hcFtERUZBVUxUX0RFRkFVTFRfUFJFU0VUX05BTUVdO1xuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAvLyBOYWRhLlxuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIERpZCB0aGUgbG9hZGVkIG9iamVjdCByZW1lbWJlciB0aGNvbW1vbi5pc09iamVjdD9cbiAgICAgICAgaWYgKHByZXNldFttYXRjaGVkX2luZGV4XSAmJlxuXG4gICAgICAgICAgLy8gRGlkIHdlIHJlbWVtYmVyIHRoaXMgcGFydGljdWxhciBwcm9wZXJ0eT9cbiAgICAgICAgICAgIHByZXNldFttYXRjaGVkX2luZGV4XVtjb250cm9sbGVyLnByb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAvLyBXZSBkaWQgcmVtZW1iZXIgc29tZXRoaW5nIGZvciB0aGlzIGd1eSAuLi5cbiAgICAgICAgICB2YXIgdmFsdWUgPSBwcmVzZXRbbWF0Y2hlZF9pbmRleF1bY29udHJvbGxlci5wcm9wZXJ0eV07XG5cbiAgICAgICAgICAvLyBBbmQgdGhhdCdzIHdoYXQgaXQgaXMuXG4gICAgICAgICAgY29udHJvbGxlci5pbml0aWFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBjb250cm9sbGVyLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TG9jYWxTdG9yYWdlSGFzaChndWksIGtleSkge1xuICAgIC8vIFRPRE8gaG93IGRvZXMgdGhpcyBkZWFsIHdpdGggbXVsdGlwbGUgR1VJJ3M/XG4gICAgcmV0dXJuIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgKyAnLicgKyBrZXk7XG5cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNhdmVNZW51KGd1aSkge1xuXG4gICAgdmFyIGRpdiA9IGd1aS5fX3NhdmVfcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgIGRvbS5hZGRDbGFzcyhndWkuZG9tRWxlbWVudCwgJ2hhcy1zYXZlJyk7XG5cbiAgICBndWkuX191bC5pbnNlcnRCZWZvcmUoZGl2LCBndWkuX191bC5maXJzdENoaWxkKTtcblxuICAgIGRvbS5hZGRDbGFzcyhkaXYsICdzYXZlLXJvdycpO1xuXG4gICAgdmFyIGdlYXJzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGdlYXJzLmlubmVySFRNTCA9ICcmbmJzcDsnO1xuICAgIGRvbS5hZGRDbGFzcyhnZWFycywgJ2J1dHRvbiBnZWFycycpO1xuXG4gICAgLy8gVE9ETyByZXBsYWNlIHdpdGggRnVuY3Rpb25Db250cm9sbGVyXG4gICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBidXR0b24uaW5uZXJIVE1MID0gJ1NhdmUnO1xuICAgIGRvbS5hZGRDbGFzcyhidXR0b24sICdidXR0b24nKTtcbiAgICBkb20uYWRkQ2xhc3MoYnV0dG9uLCAnc2F2ZScpO1xuXG4gICAgdmFyIGJ1dHRvbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgYnV0dG9uMi5pbm5lckhUTUwgPSAnTmV3JztcbiAgICBkb20uYWRkQ2xhc3MoYnV0dG9uMiwgJ2J1dHRvbicpO1xuICAgIGRvbS5hZGRDbGFzcyhidXR0b24yLCAnc2F2ZS1hcycpO1xuXG4gICAgdmFyIGJ1dHRvbjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgYnV0dG9uMy5pbm5lckhUTUwgPSAnUmV2ZXJ0JztcbiAgICBkb20uYWRkQ2xhc3MoYnV0dG9uMywgJ2J1dHRvbicpO1xuICAgIGRvbS5hZGRDbGFzcyhidXR0b24zLCAncmV2ZXJ0Jyk7XG5cbiAgICB2YXIgc2VsZWN0ID0gZ3VpLl9fcHJlc2V0X3NlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuXG4gICAgaWYgKGd1aS5sb2FkICYmIGd1aS5sb2FkLnJlbWVtYmVyZWQpIHtcblxuICAgICAgY29tbW9uLmVhY2goZ3VpLmxvYWQucmVtZW1iZXJlZCwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBhZGRQcmVzZXRPcHRpb24oZ3VpLCBrZXksIGtleSA9PSBndWkucHJlc2V0KTtcbiAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFByZXNldE9wdGlvbihndWksIERFRkFVTFRfREVGQVVMVF9QUkVTRVRfTkFNRSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGRvbS5iaW5kKHNlbGVjdCwgJ2NoYW5nZScsIGZ1bmN0aW9uKCkge1xuXG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBndWkuX19wcmVzZXRfc2VsZWN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBndWkuX19wcmVzZXRfc2VsZWN0W2luZGV4XS5pbm5lckhUTUwgPSBndWkuX19wcmVzZXRfc2VsZWN0W2luZGV4XS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgZ3VpLnByZXNldCA9IHRoaXMudmFsdWU7XG5cbiAgICB9KTtcblxuICAgIGRpdi5hcHBlbmRDaGlsZChzZWxlY3QpO1xuICAgIGRpdi5hcHBlbmRDaGlsZChnZWFycyk7XG4gICAgZGl2LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gICAgZGl2LmFwcGVuZENoaWxkKGJ1dHRvbjIpO1xuICAgIGRpdi5hcHBlbmRDaGlsZChidXR0b24zKTtcblxuICAgIGlmIChTVVBQT1JUU19MT0NBTF9TVE9SQUdFKSB7XG5cbiAgICAgIHZhciBzYXZlTG9jYWxseSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZy1zYXZlLWxvY2FsbHknKTtcbiAgICAgIHZhciBleHBsYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RnLWxvY2FsLWV4cGxhaW4nKTtcblxuICAgICAgc2F2ZUxvY2FsbHkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgIHZhciBsb2NhbFN0b3JhZ2VDaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZy1sb2NhbC1zdG9yYWdlJyk7XG5cbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShnZXRMb2NhbFN0b3JhZ2VIYXNoKGd1aSwgJ2lzTG9jYWwnKSkgPT09ICd0cnVlJykge1xuICAgICAgICBsb2NhbFN0b3JhZ2VDaGVja0JveC5zZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnLCAnY2hlY2tlZCcpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG93SGlkZUV4cGxhaW4oKSB7XG4gICAgICAgIGV4cGxhaW4uc3R5bGUuZGlzcGxheSA9IGd1aS51c2VMb2NhbFN0b3JhZ2UgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBzaG93SGlkZUV4cGxhaW4oKTtcblxuICAgICAgLy8gVE9ETzogVXNlIGEgYm9vbGVhbiBjb250cm9sbGVyLCBmb29sIVxuICAgICAgZG9tLmJpbmQobG9jYWxTdG9yYWdlQ2hlY2tCb3gsICdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZ3VpLnVzZUxvY2FsU3RvcmFnZSA9ICFndWkudXNlTG9jYWxTdG9yYWdlO1xuICAgICAgICBzaG93SGlkZUV4cGxhaW4oKTtcbiAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgdmFyIG5ld0NvbnN0cnVjdG9yVGV4dEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGctbmV3LWNvbnN0cnVjdG9yJyk7XG5cbiAgICBkb20uYmluZChuZXdDb25zdHJ1Y3RvclRleHRBcmVhLCAna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChlLm1ldGFLZXkgJiYgKGUud2hpY2ggPT09IDY3IHx8IGUua2V5Q29kZSA9PSA2NykpIHtcbiAgICAgICAgU0FWRV9ESUFMT0dVRS5oaWRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkb20uYmluZChnZWFycywgJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICBuZXdDb25zdHJ1Y3RvclRleHRBcmVhLmlubmVySFRNTCA9IEpTT04uc3RyaW5naWZ5KGd1aS5nZXRTYXZlT2JqZWN0KCksIHVuZGVmaW5lZCwgMik7XG4gICAgICBTQVZFX0RJQUxPR1VFLnNob3coKTtcbiAgICAgIG5ld0NvbnN0cnVjdG9yVGV4dEFyZWEuZm9jdXMoKTtcbiAgICAgIG5ld0NvbnN0cnVjdG9yVGV4dEFyZWEuc2VsZWN0KCk7XG4gICAgfSk7XG5cbiAgICBkb20uYmluZChidXR0b24sICdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgZ3VpLnNhdmUoKTtcbiAgICB9KTtcblxuICAgIGRvbS5iaW5kKGJ1dHRvbjIsICdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHByZXNldE5hbWUgPSBwcm9tcHQoJ0VudGVyIGEgbmV3IHByZXNldCBuYW1lLicpO1xuICAgICAgaWYgKHByZXNldE5hbWUpIGd1aS5zYXZlQXMocHJlc2V0TmFtZSk7XG4gICAgfSk7XG5cbiAgICBkb20uYmluZChidXR0b24zLCAnY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgIGd1aS5yZXZlcnQoKTtcbiAgICB9KTtcblxuLy8gICAgZGl2LmFwcGVuZENoaWxkKGJ1dHRvbjIpO1xuXG4gIH1cblxuICBmdW5jdGlvbiBhZGRSZXNpemVIYW5kbGUoZ3VpKSB7XG5cbiAgICBndWkuX19yZXNpemVfaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb21tb24uZXh0ZW5kKGd1aS5fX3Jlc2l6ZV9oYW5kbGUuc3R5bGUsIHtcblxuICAgICAgd2lkdGg6ICc2cHgnLFxuICAgICAgbWFyZ2luTGVmdDogJy0zcHgnLFxuICAgICAgaGVpZ2h0OiAnMjAwcHgnLFxuICAgICAgY3Vyc29yOiAnZXctcmVzaXplJyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4vLyAgICAgIGJvcmRlcjogJzFweCBzb2xpZCBibHVlJ1xuXG4gICAgfSk7XG5cbiAgICB2YXIgcG1vdXNlWDtcblxuICAgIGRvbS5iaW5kKGd1aS5fX3Jlc2l6ZV9oYW5kbGUsICdtb3VzZWRvd24nLCBkcmFnU3RhcnQpO1xuICAgIGRvbS5iaW5kKGd1aS5fX2Nsb3NlQnV0dG9uLCAnbW91c2Vkb3duJywgZHJhZ1N0YXJ0KTtcblxuICAgIGd1aS5kb21FbGVtZW50Lmluc2VydEJlZm9yZShndWkuX19yZXNpemVfaGFuZGxlLCBndWkuZG9tRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCk7XG5cbiAgICBmdW5jdGlvbiBkcmFnU3RhcnQoZSkge1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHBtb3VzZVggPSBlLmNsaWVudFg7XG5cbiAgICAgIGRvbS5hZGRDbGFzcyhndWkuX19jbG9zZUJ1dHRvbiwgR1VJLkNMQVNTX0RSQUcpO1xuICAgICAgZG9tLmJpbmQod2luZG93LCAnbW91c2Vtb3ZlJywgZHJhZyk7XG4gICAgICBkb20uYmluZCh3aW5kb3csICdtb3VzZXVwJywgZHJhZ1N0b3ApO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcmFnKGUpIHtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBndWkud2lkdGggKz0gcG1vdXNlWCAtIGUuY2xpZW50WDtcbiAgICAgIGd1aS5vblJlc2l6ZSgpO1xuICAgICAgcG1vdXNlWCA9IGUuY2xpZW50WDtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhZ1N0b3AoKSB7XG5cbiAgICAgIGRvbS5yZW1vdmVDbGFzcyhndWkuX19jbG9zZUJ1dHRvbiwgR1VJLkNMQVNTX0RSQUcpO1xuICAgICAgZG9tLnVuYmluZCh3aW5kb3csICdtb3VzZW1vdmUnLCBkcmFnKTtcbiAgICAgIGRvbS51bmJpbmQod2luZG93LCAnbW91c2V1cCcsIGRyYWdTdG9wKTtcblxuICAgIH1cblxuICB9XG5cbiAgZnVuY3Rpb24gc2V0V2lkdGgoZ3VpLCB3KSB7XG4gICAgZ3VpLmRvbUVsZW1lbnQuc3R5bGUud2lkdGggPSB3ICsgJ3B4JztcbiAgICAvLyBBdXRvIHBsYWNlZCBzYXZlLXJvd3MgYXJlIHBvc2l0aW9uIGZpeGVkLCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gc2V0IHRoZSB3aWR0aCBtYW51YWxseSBpZiB3ZSB3YW50IGl0IHRvIGJsZWVkIHRvIHRoZSBlZGdlXG4gICAgaWYgKGd1aS5fX3NhdmVfcm93ICYmIGd1aS5hdXRvUGxhY2UpIHtcbiAgICAgIGd1aS5fX3NhdmVfcm93LnN0eWxlLndpZHRoID0gdyArICdweCc7XG4gICAgfWlmIChndWkuX19jbG9zZUJ1dHRvbikge1xuICAgICAgZ3VpLl9fY2xvc2VCdXR0b24uc3R5bGUud2lkdGggPSB3ICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDdXJyZW50UHJlc2V0KGd1aSwgdXNlSW5pdGlhbFZhbHVlcykge1xuXG4gICAgdmFyIHRvUmV0dXJuID0ge307XG5cbiAgICAvLyBGb3IgZWFjaCBvYmplY3QgSSdtIHJlbWVtYmVyaW5nXG4gICAgY29tbW9uLmVhY2goZ3VpLl9fcmVtZW1iZXJlZE9iamVjdHMsIGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcblxuICAgICAgdmFyIHNhdmVkX3ZhbHVlcyA9IHt9O1xuXG4gICAgICAvLyBUaGUgY29udHJvbGxlcnMgSSd2ZSBtYWRlIGZvciB0aGNvbW1vbi5pc09iamVjdCBieSBwcm9wZXJ0eVxuICAgICAgdmFyIGNvbnRyb2xsZXJfbWFwID1cbiAgICAgICAgICBndWkuX19yZW1lbWJlcmVkT2JqZWN0SW5kZWNlc1RvQ29udHJvbGxlcnNbaW5kZXhdO1xuXG4gICAgICAvLyBSZW1lbWJlciBlYWNoIHZhbHVlIGZvciBlYWNoIHByb3BlcnR5XG4gICAgICBjb21tb24uZWFjaChjb250cm9sbGVyX21hcCwgZnVuY3Rpb24oY29udHJvbGxlciwgcHJvcGVydHkpIHtcbiAgICAgICAgc2F2ZWRfdmFsdWVzW3Byb3BlcnR5XSA9IHVzZUluaXRpYWxWYWx1ZXMgPyBjb250cm9sbGVyLmluaXRpYWxWYWx1ZSA6IGNvbnRyb2xsZXIuZ2V0VmFsdWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYXZlIHRoZSB2YWx1ZXMgZm9yIHRoY29tbW9uLmlzT2JqZWN0XG4gICAgICB0b1JldHVybltpbmRleF0gPSBzYXZlZF92YWx1ZXM7XG5cbiAgICB9KTtcblxuICAgIHJldHVybiB0b1JldHVybjtcblxuICB9XG5cbiAgZnVuY3Rpb24gYWRkUHJlc2V0T3B0aW9uKGd1aSwgbmFtZSwgc2V0U2VsZWN0ZWQpIHtcbiAgICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0LmlubmVySFRNTCA9IG5hbWU7XG4gICAgb3B0LnZhbHVlID0gbmFtZTtcbiAgICBndWkuX19wcmVzZXRfc2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgaWYgKHNldFNlbGVjdGVkKSB7XG4gICAgICBndWkuX19wcmVzZXRfc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBndWkuX19wcmVzZXRfc2VsZWN0Lmxlbmd0aCAtIDE7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0UHJlc2V0U2VsZWN0SW5kZXgoZ3VpKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGd1aS5fX3ByZXNldF9zZWxlY3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZ3VpLl9fcHJlc2V0X3NlbGVjdFtpbmRleF0udmFsdWUgPT0gZ3VpLnByZXNldCkge1xuICAgICAgICBndWkuX19wcmVzZXRfc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYXJrUHJlc2V0TW9kaWZpZWQoZ3VpLCBtb2RpZmllZCkge1xuICAgIHZhciBvcHQgPSBndWkuX19wcmVzZXRfc2VsZWN0W2d1aS5fX3ByZXNldF9zZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4vLyAgICBjb25zb2xlLmxvZygnbWFyaycsIG1vZGlmaWVkLCBvcHQpO1xuICAgIGlmIChtb2RpZmllZCkge1xuICAgICAgb3B0LmlubmVySFRNTCA9IG9wdC52YWx1ZSArIFwiKlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHQuaW5uZXJIVE1MID0gb3B0LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlzKGNvbnRyb2xsZXJBcnJheSkge1xuXG5cbiAgICBpZiAoY29udHJvbGxlckFycmF5Lmxlbmd0aCAhPSAwKSB7XG5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgdXBkYXRlRGlzcGxheXMoY29udHJvbGxlckFycmF5KTtcbiAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgY29tbW9uLmVhY2goY29udHJvbGxlckFycmF5LCBmdW5jdGlvbihjKSB7XG4gICAgICBjLnVwZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcblxuICB9XG5cbiAgcmV0dXJuIEdVSTtcblxufSkoZGF0LnV0aWxzLmNzcyxcblwiPGRpdiBpZD1cXFwiZGctc2F2ZVxcXCIgY2xhc3M9XFxcImRnIGRpYWxvZ3VlXFxcIj5cXG5cXG4gIEhlcmUncyB0aGUgbmV3IGxvYWQgcGFyYW1ldGVyIGZvciB5b3VyIDxjb2RlPkdVSTwvY29kZT4ncyBjb25zdHJ1Y3RvcjpcXG5cXG4gIDx0ZXh0YXJlYSBpZD1cXFwiZGctbmV3LWNvbnN0cnVjdG9yXFxcIj48L3RleHRhcmVhPlxcblxcbiAgPGRpdiBpZD1cXFwiZGctc2F2ZS1sb2NhbGx5XFxcIj5cXG5cXG4gICAgPGlucHV0IGlkPVxcXCJkZy1sb2NhbC1zdG9yYWdlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIvPiBBdXRvbWF0aWNhbGx5IHNhdmVcXG4gICAgdmFsdWVzIHRvIDxjb2RlPmxvY2FsU3RvcmFnZTwvY29kZT4gb24gZXhpdC5cXG5cXG4gICAgPGRpdiBpZD1cXFwiZGctbG9jYWwtZXhwbGFpblxcXCI+VGhlIHZhbHVlcyBzYXZlZCB0byA8Y29kZT5sb2NhbFN0b3JhZ2U8L2NvZGU+IHdpbGxcXG4gICAgICBvdmVycmlkZSB0aG9zZSBwYXNzZWQgdG8gPGNvZGU+ZGF0LkdVSTwvY29kZT4ncyBjb25zdHJ1Y3Rvci4gVGhpcyBtYWtlcyBpdFxcbiAgICAgIGVhc2llciB0byB3b3JrIGluY3JlbWVudGFsbHksIGJ1dCA8Y29kZT5sb2NhbFN0b3JhZ2U8L2NvZGU+IGlzIGZyYWdpbGUsXFxuICAgICAgYW5kIHlvdXIgZnJpZW5kcyBtYXkgbm90IHNlZSB0aGUgc2FtZSB2YWx1ZXMgeW91IGRvLlxcbiAgICAgIFxcbiAgICA8L2Rpdj5cXG4gICAgXFxuICA8L2Rpdj5cXG5cXG48L2Rpdj5cIixcblwiLmRnIHVse2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJTtjbGVhcjpib3RofS5kZy5hY3twb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtoZWlnaHQ6MDt6LWluZGV4OjB9LmRnOm5vdCguYWMpIC5tYWlue292ZXJmbG93OmhpZGRlbn0uZGcubWFpbnstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAwLjFzIGxpbmVhcjstby10cmFuc2l0aW9uOm9wYWNpdHkgMC4xcyBsaW5lYXI7LW1vei10cmFuc2l0aW9uOm9wYWNpdHkgMC4xcyBsaW5lYXI7dHJhbnNpdGlvbjpvcGFjaXR5IDAuMXMgbGluZWFyfS5kZy5tYWluLnRhbGxlci10aGFuLXdpbmRvd3tvdmVyZmxvdy15OmF1dG99LmRnLm1haW4udGFsbGVyLXRoYW4td2luZG93IC5jbG9zZS1idXR0b257b3BhY2l0eToxO21hcmdpbi10b3A6LTFweDtib3JkZXItdG9wOjFweCBzb2xpZCAjMmMyYzJjfS5kZy5tYWluIHVsLmNsb3NlZCAuY2xvc2UtYnV0dG9ue29wYWNpdHk6MSAhaW1wb3J0YW50fS5kZy5tYWluOmhvdmVyIC5jbG9zZS1idXR0b24sLmRnLm1haW4gLmNsb3NlLWJ1dHRvbi5kcmFne29wYWNpdHk6MX0uZGcubWFpbiAuY2xvc2UtYnV0dG9uey13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IDAuMXMgbGluZWFyOy1vLXRyYW5zaXRpb246b3BhY2l0eSAwLjFzIGxpbmVhcjstbW96LXRyYW5zaXRpb246b3BhY2l0eSAwLjFzIGxpbmVhcjt0cmFuc2l0aW9uOm9wYWNpdHkgMC4xcyBsaW5lYXI7Ym9yZGVyOjA7cG9zaXRpb246YWJzb2x1dGU7bGluZS1oZWlnaHQ6MTlweDtoZWlnaHQ6MjBweDtjdXJzb3I6cG9pbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9LmRnLm1haW4gLmNsb3NlLWJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMxMTF9LmRnLmF7ZmxvYXQ6cmlnaHQ7bWFyZ2luLXJpZ2h0OjE1cHg7b3ZlcmZsb3cteDpoaWRkZW59LmRnLmEuaGFzLXNhdmUgdWx7bWFyZ2luLXRvcDoyN3B4fS5kZy5hLmhhcy1zYXZlIHVsLmNsb3NlZHttYXJnaW4tdG9wOjB9LmRnLmEgLnNhdmUtcm93e3Bvc2l0aW9uOmZpeGVkO3RvcDowO3otaW5kZXg6MTAwMn0uZGcgbGl7LXdlYmtpdC10cmFuc2l0aW9uOmhlaWdodCAwLjFzIGVhc2Utb3V0Oy1vLXRyYW5zaXRpb246aGVpZ2h0IDAuMXMgZWFzZS1vdXQ7LW1vei10cmFuc2l0aW9uOmhlaWdodCAwLjFzIGVhc2Utb3V0O3RyYW5zaXRpb246aGVpZ2h0IDAuMXMgZWFzZS1vdXR9LmRnIGxpOm5vdCguZm9sZGVyKXtjdXJzb3I6YXV0bztoZWlnaHQ6MjdweDtsaW5lLWhlaWdodDoyN3B4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjAgNHB4IDAgNXB4fS5kZyBsaS5mb2xkZXJ7cGFkZGluZzowO2JvcmRlci1sZWZ0OjRweCBzb2xpZCByZ2JhKDAsMCwwLDApfS5kZyBsaS50aXRsZXtjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDotNHB4fS5kZyAuY2xvc2VkIGxpOm5vdCgudGl0bGUpLC5kZyAuY2xvc2VkIHVsIGxpLC5kZyAuY2xvc2VkIHVsIGxpID4gKntoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyOjB9LmRnIC5jcntjbGVhcjpib3RoO3BhZGRpbmctbGVmdDozcHg7aGVpZ2h0OjI3cHh9LmRnIC5wcm9wZXJ0eS1uYW1le2N1cnNvcjpkZWZhdWx0O2Zsb2F0OmxlZnQ7Y2xlYXI6bGVmdDt3aWR0aDo0MCU7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LmRnIC5je2Zsb2F0OmxlZnQ7d2lkdGg6NjAlfS5kZyAuYyBpbnB1dFt0eXBlPXRleHRde2JvcmRlcjowO21hcmdpbi10b3A6NHB4O3BhZGRpbmc6M3B4O3dpZHRoOjEwMCU7ZmxvYXQ6cmlnaHR9LmRnIC5oYXMtc2xpZGVyIGlucHV0W3R5cGU9dGV4dF17d2lkdGg6MzAlO21hcmdpbi1sZWZ0OjB9LmRnIC5zbGlkZXJ7ZmxvYXQ6bGVmdDt3aWR0aDo2NiU7bWFyZ2luLWxlZnQ6LTVweDttYXJnaW4tcmlnaHQ6MDtoZWlnaHQ6MTlweDttYXJnaW4tdG9wOjRweH0uZGcgLnNsaWRlci1mZ3toZWlnaHQ6MTAwJX0uZGcgLmMgaW5wdXRbdHlwZT1jaGVja2JveF17bWFyZ2luLXRvcDo5cHh9LmRnIC5jIHNlbGVjdHttYXJnaW4tdG9wOjVweH0uZGcgLmNyLmZ1bmN0aW9uLC5kZyAuY3IuZnVuY3Rpb24gLnByb3BlcnR5LW5hbWUsLmRnIC5jci5mdW5jdGlvbiAqLC5kZyAuY3IuYm9vbGVhbiwuZGcgLmNyLmJvb2xlYW4gKntjdXJzb3I6cG9pbnRlcn0uZGcgLnNlbGVjdG9ye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDotOXB4O21hcmdpbi10b3A6MjNweDt6LWluZGV4OjEwfS5kZyAuYzpob3ZlciAuc2VsZWN0b3IsLmRnIC5zZWxlY3Rvci5kcmFne2Rpc3BsYXk6YmxvY2t9LmRnIGxpLnNhdmUtcm93e3BhZGRpbmc6MH0uZGcgbGkuc2F2ZS1yb3cgLmJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjBweCA2cHh9LmRnLmRpYWxvZ3Vle2JhY2tncm91bmQtY29sb3I6IzIyMjt3aWR0aDo0NjBweDtwYWRkaW5nOjE1cHg7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MTVweH0jZGctbmV3LWNvbnN0cnVjdG9ye3BhZGRpbmc6MTBweDtjb2xvcjojMjIyO2ZvbnQtZmFtaWx5Ok1vbmFjbywgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB4O2JvcmRlcjowO3Jlc2l6ZTpub25lO2JveC1zaGFkb3c6aW5zZXQgMXB4IDFweCAxcHggIzg4ODt3b3JkLXdyYXA6YnJlYWstd29yZDttYXJnaW46MTJweCAwO2Rpc3BsYXk6YmxvY2s7d2lkdGg6NDQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7aGVpZ2h0OjEwMHB4O3Bvc2l0aW9uOnJlbGF0aXZlfSNkZy1sb2NhbC1leHBsYWlue2Rpc3BsYXk6bm9uZTtmb250LXNpemU6MTFweDtsaW5lLWhlaWdodDoxN3B4O2JvcmRlci1yYWRpdXM6M3B4O2JhY2tncm91bmQtY29sb3I6IzMzMztwYWRkaW5nOjhweDttYXJnaW4tdG9wOjEwcHh9I2RnLWxvY2FsLWV4cGxhaW4gY29kZXtmb250LXNpemU6MTBweH0jZGF0LWd1aS1zYXZlLWxvY2FsbHl7ZGlzcGxheTpub25lfS5kZ3tjb2xvcjojZWVlO2ZvbnQ6MTFweCAnTHVjaWRhIEdyYW5kZScsIHNhbnMtc2VyaWY7dGV4dC1zaGFkb3c6MCAtMXB4IDAgIzExMX0uZGcubWFpbjo6LXdlYmtpdC1zY3JvbGxiYXJ7d2lkdGg6NXB4O2JhY2tncm91bmQ6IzFhMWExYX0uZGcubWFpbjo6LXdlYmtpdC1zY3JvbGxiYXItY29ybmVye2hlaWdodDowO2Rpc3BsYXk6bm9uZX0uZGcubWFpbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojNjc2NzY3fS5kZyBsaTpub3QoLmZvbGRlcil7YmFja2dyb3VuZDojMWExYTFhO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMyYzJjMmN9LmRnIGxpLnNhdmUtcm93e2xpbmUtaGVpZ2h0OjI1cHg7YmFja2dyb3VuZDojZGFkNWNiO2JvcmRlcjowfS5kZyBsaS5zYXZlLXJvdyBzZWxlY3R7bWFyZ2luLWxlZnQ6NXB4O3dpZHRoOjEwOHB4fS5kZyBsaS5zYXZlLXJvdyAuYnV0dG9ue21hcmdpbi1sZWZ0OjVweDttYXJnaW4tdG9wOjFweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6OXB4O2xpbmUtaGVpZ2h0OjdweDtwYWRkaW5nOjRweCA0cHggNXB4IDRweDtiYWNrZ3JvdW5kOiNjNWJkYWQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIDFweCAwICNiMGE1OGY7Ym94LXNoYWRvdzowIC0xcHggMCAjYjBhNThmO2N1cnNvcjpwb2ludGVyfS5kZyBsaS5zYXZlLXJvdyAuYnV0dG9uLmdlYXJze2JhY2tncm91bmQ6I2M1YmRhZCB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFOQ0FZQUFBQi85WlE3QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFRSkpSRUZVZU5waVlLQVUvUC8vUHdHSUMvQXBDQUJpQlNBVytJOEFDbEFjZ0t4UTRUOWhvTUFFVXJ4eDJRU0dONitlZ0RYKy92V1Q0ZTdOODJBTVlvUEF4L2V2d1dvWW9TWWJBQ1gyczdLeEN4emNzZXpEaDNldkZvREVCWVRFRXF5Y2dnV0F6QTlBdVVTUVFnZVlQYTlmUHY2L1lXbS9BY3g1SVBiN3R5L2Z3K1FaYmx3Njd2RHM4UjBZSHlRaGdPYngreUFKa0JxbUc1ZFBQRGgxYVBPR1IvZXVnVzBHNHZsSW9USWZ5RmNBK1Fla2hoSEpoUGRReGJpQUlndU1CVFFaclBENzEwOE02cm9XWURGUWlJQUF2NkFvdy8xYkZ3WGdpcytmMkxVQXlud29JYU5jejhYTngzRGw3TUVKVURHUXB4OWd0UThZQ3VlQitEMjZPRUNBQVFEYWR0N2U0NkQ0MlFBQUFBQkpSVTVFcmtKZ2dnPT0pIDJweCAxcHggbm8tcmVwZWF0O2hlaWdodDo3cHg7d2lkdGg6OHB4fS5kZyBsaS5zYXZlLXJvdyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2JhYjE5ZTtib3gtc2hhZG93OjAgLTFweCAwICNiMGE1OGZ9LmRnIGxpLmZvbGRlcntib3JkZXItYm90dG9tOjB9LmRnIGxpLnRpdGxle3BhZGRpbmctbGVmdDoxNnB4O2JhY2tncm91bmQ6IzAwMCB1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQlFBRkFKRUFBUC8vLy9QejgvLy8vLy8vL3lINUJBRUFBQUlBTEFBQUFBQUZBQVVBQUFJSWxJK2hLZ0Z4b0NnQU93PT0pIDZweCAxMHB4IG5vLXJlcGVhdDtjdXJzb3I6cG9pbnRlcjtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMil9LmRnIC5jbG9zZWQgbGkudGl0bGV7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQlFBRkFKRUFBUC8vLy9QejgvLy8vLy8vL3lINUJBRUFBQUlBTEFBQUFBQUZBQVVBQUFJSWxHSVdxTUNiV0FFQU93PT0pfS5kZyAuY3IuYm9vbGVhbntib3JkZXItbGVmdDozcHggc29saWQgIzgwNjc4N30uZGcgLmNyLmZ1bmN0aW9ue2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZTYxZDVmfS5kZyAuY3IubnVtYmVye2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjMmZhMWQ2fS5kZyAuY3IubnVtYmVyIGlucHV0W3R5cGU9dGV4dF17Y29sb3I6IzJmYTFkNn0uZGcgLmNyLnN0cmluZ3tib3JkZXItbGVmdDozcHggc29saWQgIzFlZDM2Zn0uZGcgLmNyLnN0cmluZyBpbnB1dFt0eXBlPXRleHRde2NvbG9yOiMxZWQzNmZ9LmRnIC5jci5mdW5jdGlvbjpob3ZlciwuZGcgLmNyLmJvb2xlYW46aG92ZXJ7YmFja2dyb3VuZDojMTExfS5kZyAuYyBpbnB1dFt0eXBlPXRleHRde2JhY2tncm91bmQ6IzMwMzAzMDtvdXRsaW5lOm5vbmV9LmRnIC5jIGlucHV0W3R5cGU9dGV4dF06aG92ZXJ7YmFja2dyb3VuZDojM2MzYzNjfS5kZyAuYyBpbnB1dFt0eXBlPXRleHRdOmZvY3Vze2JhY2tncm91bmQ6IzQ5NDk0OTtjb2xvcjojZmZmfS5kZyAuYyAuc2xpZGVye2JhY2tncm91bmQ6IzMwMzAzMDtjdXJzb3I6ZXctcmVzaXplfS5kZyAuYyAuc2xpZGVyLWZne2JhY2tncm91bmQ6IzJmYTFkNn0uZGcgLmMgLnNsaWRlcjpob3ZlcntiYWNrZ3JvdW5kOiMzYzNjM2N9LmRnIC5jIC5zbGlkZXI6aG92ZXIgLnNsaWRlci1mZ3tiYWNrZ3JvdW5kOiM0NGFiZGF9XFxuXCIsXG5kYXQuY29udHJvbGxlcnMuZmFjdG9yeSA9IChmdW5jdGlvbiAoT3B0aW9uQ29udHJvbGxlciwgTnVtYmVyQ29udHJvbGxlckJveCwgTnVtYmVyQ29udHJvbGxlclNsaWRlciwgU3RyaW5nQ29udHJvbGxlciwgRnVuY3Rpb25Db250cm9sbGVyLCBCb29sZWFuQ29udHJvbGxlciwgY29tbW9uKSB7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7XG5cbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IG9iamVjdFtwcm9wZXJ0eV07XG5cbiAgICAgICAgLy8gUHJvdmlkaW5nIG9wdGlvbnM/XG4gICAgICAgIGlmIChjb21tb24uaXNBcnJheShhcmd1bWVudHNbMl0pIHx8IGNvbW1vbi5pc09iamVjdChhcmd1bWVudHNbMl0pKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPcHRpb25Db250cm9sbGVyKG9iamVjdCwgcHJvcGVydHksIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm92aWRpbmcgYSBtYXA/XG5cbiAgICAgICAgaWYgKGNvbW1vbi5pc051bWJlcihpbml0aWFsVmFsdWUpKSB7XG5cbiAgICAgICAgICBpZiAoY29tbW9uLmlzTnVtYmVyKGFyZ3VtZW50c1syXSkgJiYgY29tbW9uLmlzTnVtYmVyKGFyZ3VtZW50c1szXSkpIHtcblxuICAgICAgICAgICAgLy8gSGFzIG1pbiBhbmQgbWF4LlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJDb250cm9sbGVyU2xpZGVyKG9iamVjdCwgcHJvcGVydHksIGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdKTtcblxuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyQ29udHJvbGxlckJveChvYmplY3QsIHByb3BlcnR5LCB7IG1pbjogYXJndW1lbnRzWzJdLCBtYXg6IGFyZ3VtZW50c1szXSB9KTtcblxuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1vbi5pc1N0cmluZyhpbml0aWFsVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb250cm9sbGVyKG9iamVjdCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1vbi5pc0Z1bmN0aW9uKGluaXRpYWxWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uQ29udHJvbGxlcihvYmplY3QsIHByb3BlcnR5LCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbW9uLmlzQm9vbGVhbihpbml0aWFsVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuQ29udHJvbGxlcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9KShkYXQuY29udHJvbGxlcnMuT3B0aW9uQ29udHJvbGxlcixcbmRhdC5jb250cm9sbGVycy5OdW1iZXJDb250cm9sbGVyQm94LFxuZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJTbGlkZXIsXG5kYXQuY29udHJvbGxlcnMuU3RyaW5nQ29udHJvbGxlciA9IChmdW5jdGlvbiAoQ29udHJvbGxlciwgZG9tLCBjb21tb24pIHtcblxuICAvKipcbiAgICogQGNsYXNzIFByb3ZpZGVzIGEgdGV4dCBpbnB1dCB0byBhbHRlciB0aGUgc3RyaW5nIHByb3BlcnR5IG9mIGFuIG9iamVjdC5cbiAgICpcbiAgICogQGV4dGVuZHMgZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXJcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgbWFuaXB1bGF0ZWRcbiAgICpcbiAgICogQG1lbWJlciBkYXQuY29udHJvbGxlcnNcbiAgICovXG4gIHZhciBTdHJpbmdDb250cm9sbGVyID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXG4gICAgU3RyaW5nQ29udHJvbGxlci5zdXBlcmNsYXNzLmNhbGwodGhpcywgb2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5fX2lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLl9faW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcblxuICAgIGRvbS5iaW5kKHRoaXMuX19pbnB1dCwgJ2tleXVwJywgb25DaGFuZ2UpO1xuICAgIGRvbS5iaW5kKHRoaXMuX19pbnB1dCwgJ2NoYW5nZScsIG9uQ2hhbmdlKTtcbiAgICBkb20uYmluZCh0aGlzLl9faW5wdXQsICdibHVyJywgb25CbHVyKTtcbiAgICBkb20uYmluZCh0aGlzLl9faW5wdXQsICdrZXlkb3duJywgZnVuY3Rpb24oZSkge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG5cbiAgICBmdW5jdGlvbiBvbkNoYW5nZSgpIHtcbiAgICAgIF90aGlzLnNldFZhbHVlKF90aGlzLl9faW5wdXQudmFsdWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICAgIGlmIChfdGhpcy5fX29uRmluaXNoQ2hhbmdlKSB7XG4gICAgICAgIF90aGlzLl9fb25GaW5pc2hDaGFuZ2UuY2FsbChfdGhpcywgX3RoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fX2lucHV0KTtcblxuICB9O1xuXG4gIFN0cmluZ0NvbnRyb2xsZXIuc3VwZXJjbGFzcyA9IENvbnRyb2xsZXI7XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgU3RyaW5nQ29udHJvbGxlci5wcm90b3R5cGUsXG4gICAgICBDb250cm9sbGVyLnByb3RvdHlwZSxcblxuICAgICAge1xuXG4gICAgICAgIHVwZGF0ZURpc3BsYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIFN0b3BzIHRoZSBjYXJldCBmcm9tIG1vdmluZyBvbiBhY2NvdW50IG9mOlxuICAgICAgICAgIC8vIGtleXVwIC0+IHNldFZhbHVlIC0+IHVwZGF0ZURpc3BsYXlcbiAgICAgICAgICBpZiAoIWRvbS5pc0FjdGl2ZSh0aGlzLl9faW5wdXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9faW5wdXQudmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBTdHJpbmdDb250cm9sbGVyLnN1cGVyY2xhc3MucHJvdG90eXBlLnVwZGF0ZURpc3BsYXkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgKTtcblxuICByZXR1cm4gU3RyaW5nQ29udHJvbGxlcjtcblxufSkoZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXIsXG5kYXQuZG9tLmRvbSxcbmRhdC51dGlscy5jb21tb24pLFxuZGF0LmNvbnRyb2xsZXJzLkZ1bmN0aW9uQ29udHJvbGxlcixcbmRhdC5jb250cm9sbGVycy5Cb29sZWFuQ29udHJvbGxlcixcbmRhdC51dGlscy5jb21tb24pLFxuZGF0LmNvbnRyb2xsZXJzLkNvbnRyb2xsZXIsXG5kYXQuY29udHJvbGxlcnMuQm9vbGVhbkNvbnRyb2xsZXIsXG5kYXQuY29udHJvbGxlcnMuRnVuY3Rpb25Db250cm9sbGVyLFxuZGF0LmNvbnRyb2xsZXJzLk51bWJlckNvbnRyb2xsZXJCb3gsXG5kYXQuY29udHJvbGxlcnMuTnVtYmVyQ29udHJvbGxlclNsaWRlcixcbmRhdC5jb250cm9sbGVycy5PcHRpb25Db250cm9sbGVyLFxuZGF0LmNvbnRyb2xsZXJzLkNvbG9yQ29udHJvbGxlciA9IChmdW5jdGlvbiAoQ29udHJvbGxlciwgZG9tLCBDb2xvciwgaW50ZXJwcmV0LCBjb21tb24pIHtcblxuICB2YXIgQ29sb3JDb250cm9sbGVyID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXG4gICAgQ29sb3JDb250cm9sbGVyLnN1cGVyY2xhc3MuY2FsbCh0aGlzLCBvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIHRoaXMuX19jb2xvciA9IG5ldyBDb2xvcih0aGlzLmdldFZhbHVlKCkpO1xuICAgIHRoaXMuX190ZW1wID0gbmV3IENvbG9yKDApO1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZG9tLm1ha2VTZWxlY3RhYmxlKHRoaXMuZG9tRWxlbWVudCwgZmFsc2UpO1xuXG4gICAgdGhpcy5fX3NlbGVjdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fX3NlbGVjdG9yLmNsYXNzTmFtZSA9ICdzZWxlY3Rvcic7XG5cbiAgICB0aGlzLl9fc2F0dXJhdGlvbl9maWVsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX19zYXR1cmF0aW9uX2ZpZWxkLmNsYXNzTmFtZSA9ICdzYXR1cmF0aW9uLWZpZWxkJztcblxuICAgIHRoaXMuX19maWVsZF9rbm9iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fX2ZpZWxkX2tub2IuY2xhc3NOYW1lID0gJ2ZpZWxkLWtub2InO1xuICAgIHRoaXMuX19maWVsZF9rbm9iX2JvcmRlciA9ICcycHggc29saWQgJztcblxuICAgIHRoaXMuX19odWVfa25vYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX19odWVfa25vYi5jbGFzc05hbWUgPSAnaHVlLWtub2InO1xuXG4gICAgdGhpcy5fX2h1ZV9maWVsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX19odWVfZmllbGQuY2xhc3NOYW1lID0gJ2h1ZS1maWVsZCc7XG5cbiAgICB0aGlzLl9faW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRoaXMuX19pbnB1dC50eXBlID0gJ3RleHQnO1xuICAgIHRoaXMuX19pbnB1dF90ZXh0U2hhZG93ID0gJzAgMXB4IDFweCAnO1xuXG4gICAgZG9tLmJpbmQodGhpcy5fX2lucHV0LCAna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7IC8vIG9uIGVudGVyXG4gICAgICAgIG9uQmx1ci5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZG9tLmJpbmQodGhpcy5fX2lucHV0LCAnYmx1cicsIG9uQmx1cik7XG5cbiAgICBkb20uYmluZCh0aGlzLl9fc2VsZWN0b3IsICdtb3VzZWRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgIGRvbVxuICAgICAgICAuYWRkQ2xhc3ModGhpcywgJ2RyYWcnKVxuICAgICAgICAuYmluZCh3aW5kb3csICdtb3VzZXVwJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgIGRvbS5yZW1vdmVDbGFzcyhfdGhpcy5fX3NlbGVjdG9yLCAnZHJhZycpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgdmFyIHZhbHVlX2ZpZWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb21tb24uZXh0ZW5kKHRoaXMuX19zZWxlY3Rvci5zdHlsZSwge1xuICAgICAgd2lkdGg6ICcxMjJweCcsXG4gICAgICBoZWlnaHQ6ICcxMDJweCcsXG4gICAgICBwYWRkaW5nOiAnM3B4JyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMyMjInLFxuICAgICAgYm94U2hhZG93OiAnMHB4IDFweCAzcHggcmdiYSgwLDAsMCwwLjMpJ1xuICAgIH0pO1xuXG4gICAgY29tbW9uLmV4dGVuZCh0aGlzLl9fZmllbGRfa25vYi5zdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB3aWR0aDogJzEycHgnLFxuICAgICAgaGVpZ2h0OiAnMTJweCcsXG4gICAgICBib3JkZXI6IHRoaXMuX19maWVsZF9rbm9iX2JvcmRlciArICh0aGlzLl9fY29sb3IudiA8IC41ID8gJyNmZmYnIDogJyMwMDAnKSxcbiAgICAgIGJveFNoYWRvdzogJzBweCAxcHggM3B4IHJnYmEoMCwwLDAsMC41KScsXG4gICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgIHpJbmRleDogMVxuICAgIH0pO1xuICAgIFxuICAgIGNvbW1vbi5leHRlbmQodGhpcy5fX2h1ZV9rbm9iLnN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHdpZHRoOiAnMTVweCcsXG4gICAgICBoZWlnaHQ6ICcycHgnLFxuICAgICAgYm9yZGVyUmlnaHQ6ICc0cHggc29saWQgI2ZmZicsXG4gICAgICB6SW5kZXg6IDFcbiAgICB9KTtcblxuICAgIGNvbW1vbi5leHRlbmQodGhpcy5fX3NhdHVyYXRpb25fZmllbGQuc3R5bGUsIHtcbiAgICAgIHdpZHRoOiAnMTAwcHgnLFxuICAgICAgaGVpZ2h0OiAnMTAwcHgnLFxuICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICM1NTUnLFxuICAgICAgbWFyZ2luUmlnaHQ6ICczcHgnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgIH0pO1xuXG4gICAgY29tbW9uLmV4dGVuZCh2YWx1ZV9maWVsZC5zdHlsZSwge1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgYmFja2dyb3VuZDogJ25vbmUnXG4gICAgfSk7XG4gICAgXG4gICAgbGluZWFyR3JhZGllbnQodmFsdWVfZmllbGQsICd0b3AnLCAncmdiYSgwLDAsMCwwKScsICcjMDAwJyk7XG5cbiAgICBjb21tb24uZXh0ZW5kKHRoaXMuX19odWVfZmllbGQuc3R5bGUsIHtcbiAgICAgIHdpZHRoOiAnMTVweCcsXG4gICAgICBoZWlnaHQ6ICcxMDBweCcsXG4gICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjNTU1JyxcbiAgICAgIGN1cnNvcjogJ25zLXJlc2l6ZSdcbiAgICB9KTtcblxuICAgIGh1ZUdyYWRpZW50KHRoaXMuX19odWVfZmllbGQpO1xuXG4gICAgY29tbW9uLmV4dGVuZCh0aGlzLl9faW5wdXQuc3R5bGUsIHtcbiAgICAgIG91dGxpbmU6ICdub25lJyxcbi8vICAgICAgd2lkdGg6ICcxMjBweCcsXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuLy8gICAgICBwYWRkaW5nOiAnNHB4Jyxcbi8vICAgICAgbWFyZ2luQm90dG9tOiAnNnB4JyxcbiAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICBib3JkZXI6IDAsXG4gICAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgICB0ZXh0U2hhZG93OiB0aGlzLl9faW5wdXRfdGV4dFNoYWRvdyArICdyZ2JhKDAsMCwwLDAuNyknXG4gICAgfSk7XG5cbiAgICBkb20uYmluZCh0aGlzLl9fc2F0dXJhdGlvbl9maWVsZCwgJ21vdXNlZG93bicsIGZpZWxkRG93bik7XG4gICAgZG9tLmJpbmQodGhpcy5fX2ZpZWxkX2tub2IsICdtb3VzZWRvd24nLCBmaWVsZERvd24pO1xuXG4gICAgZG9tLmJpbmQodGhpcy5fX2h1ZV9maWVsZCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHNldEgoZSk7XG4gICAgICBkb20uYmluZCh3aW5kb3csICdtb3VzZW1vdmUnLCBzZXRIKTtcbiAgICAgIGRvbS5iaW5kKHdpbmRvdywgJ21vdXNldXAnLCB1bmJpbmRIKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGZpZWxkRG93bihlKSB7XG4gICAgICBzZXRTVihlKTtcbiAgICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ25vbmUnO1xuICAgICAgZG9tLmJpbmQod2luZG93LCAnbW91c2Vtb3ZlJywgc2V0U1YpO1xuICAgICAgZG9tLmJpbmQod2luZG93LCAnbW91c2V1cCcsIHVuYmluZFNWKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bmJpbmRTVigpIHtcbiAgICAgIGRvbS51bmJpbmQod2luZG93LCAnbW91c2Vtb3ZlJywgc2V0U1YpO1xuICAgICAgZG9tLnVuYmluZCh3aW5kb3csICdtb3VzZXVwJywgdW5iaW5kU1YpO1xuICAgICAgLy8gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xuICAgICAgdmFyIGkgPSBpbnRlcnByZXQodGhpcy52YWx1ZSk7XG4gICAgICBpZiAoaSAhPT0gZmFsc2UpIHtcbiAgICAgICAgX3RoaXMuX19jb2xvci5fX3N0YXRlID0gaTtcbiAgICAgICAgX3RoaXMuc2V0VmFsdWUoX3RoaXMuX19jb2xvci50b09yaWdpbmFsKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IF90aGlzLl9fY29sb3IudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bmJpbmRIKCkge1xuICAgICAgZG9tLnVuYmluZCh3aW5kb3csICdtb3VzZW1vdmUnLCBzZXRIKTtcbiAgICAgIGRvbS51bmJpbmQod2luZG93LCAnbW91c2V1cCcsIHVuYmluZEgpO1xuICAgIH1cblxuICAgIHRoaXMuX19zYXR1cmF0aW9uX2ZpZWxkLmFwcGVuZENoaWxkKHZhbHVlX2ZpZWxkKTtcbiAgICB0aGlzLl9fc2VsZWN0b3IuYXBwZW5kQ2hpbGQodGhpcy5fX2ZpZWxkX2tub2IpO1xuICAgIHRoaXMuX19zZWxlY3Rvci5hcHBlbmRDaGlsZCh0aGlzLl9fc2F0dXJhdGlvbl9maWVsZCk7XG4gICAgdGhpcy5fX3NlbGVjdG9yLmFwcGVuZENoaWxkKHRoaXMuX19odWVfZmllbGQpO1xuICAgIHRoaXMuX19odWVfZmllbGQuYXBwZW5kQ2hpbGQodGhpcy5fX2h1ZV9rbm9iKTtcblxuICAgIHRoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9faW5wdXQpO1xuICAgIHRoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9fc2VsZWN0b3IpO1xuXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG5cbiAgICBmdW5jdGlvbiBzZXRTVihlKSB7XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdmFyIHcgPSBkb20uZ2V0V2lkdGgoX3RoaXMuX19zYXR1cmF0aW9uX2ZpZWxkKTtcbiAgICAgIHZhciBvID0gZG9tLmdldE9mZnNldChfdGhpcy5fX3NhdHVyYXRpb25fZmllbGQpO1xuICAgICAgdmFyIHMgPSAoZS5jbGllbnRYIC0gby5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSAvIHc7XG4gICAgICB2YXIgdiA9IDEgLSAoZS5jbGllbnRZIC0gby50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCkgLyB3O1xuXG4gICAgICBpZiAodiA+IDEpIHYgPSAxO1xuICAgICAgZWxzZSBpZiAodiA8IDApIHYgPSAwO1xuXG4gICAgICBpZiAocyA+IDEpIHMgPSAxO1xuICAgICAgZWxzZSBpZiAocyA8IDApIHMgPSAwO1xuXG4gICAgICBfdGhpcy5fX2NvbG9yLnYgPSB2O1xuICAgICAgX3RoaXMuX19jb2xvci5zID0gcztcblxuICAgICAgX3RoaXMuc2V0VmFsdWUoX3RoaXMuX19jb2xvci50b09yaWdpbmFsKCkpO1xuXG5cbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEgoZSkge1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHZhciBzID0gZG9tLmdldEhlaWdodChfdGhpcy5fX2h1ZV9maWVsZCk7XG4gICAgICB2YXIgbyA9IGRvbS5nZXRPZmZzZXQoX3RoaXMuX19odWVfZmllbGQpO1xuICAgICAgdmFyIGggPSAxIC0gKGUuY2xpZW50WSAtIG8udG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApIC8gcztcblxuICAgICAgaWYgKGggPiAxKSBoID0gMTtcbiAgICAgIGVsc2UgaWYgKGggPCAwKSBoID0gMDtcblxuICAgICAgX3RoaXMuX19jb2xvci5oID0gaCAqIDM2MDtcblxuICAgICAgX3RoaXMuc2V0VmFsdWUoX3RoaXMuX19jb2xvci50b09yaWdpbmFsKCkpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB9XG5cbiAgfTtcblxuICBDb2xvckNvbnRyb2xsZXIuc3VwZXJjbGFzcyA9IENvbnRyb2xsZXI7XG5cbiAgY29tbW9uLmV4dGVuZChcblxuICAgICAgQ29sb3JDb250cm9sbGVyLnByb3RvdHlwZSxcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLFxuXG4gICAgICB7XG5cbiAgICAgICAgdXBkYXRlRGlzcGxheTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICB2YXIgaSA9IGludGVycHJldCh0aGlzLmdldFZhbHVlKCkpO1xuXG4gICAgICAgICAgaWYgKGkgIT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgIHZhciBtaXNtYXRjaCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgbWlzbWF0Y2ggb24gdGhlIGludGVycHJldGVkIHZhbHVlLlxuXG4gICAgICAgICAgICBjb21tb24uZWFjaChDb2xvci5DT01QT05FTlRTLCBmdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgaWYgKCFjb21tb24uaXNVbmRlZmluZWQoaVtjb21wb25lbnRdKSAmJlxuICAgICAgICAgICAgICAgICAgIWNvbW1vbi5pc1VuZGVmaW5lZCh0aGlzLl9fY29sb3IuX19zdGF0ZVtjb21wb25lbnRdKSAmJlxuICAgICAgICAgICAgICAgICAgaVtjb21wb25lbnRdICE9PSB0aGlzLl9fY29sb3IuX19zdGF0ZVtjb21wb25lbnRdKSB7XG4gICAgICAgICAgICAgICAgbWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTsgLy8gYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgZGl2ZXJnZXMsIHdlIGtlZXAgb3VyIHByZXZpb3VzIHZhbHVlc1xuICAgICAgICAgICAgLy8gZm9yIHN0YXRlZnVsbmVzcywgb3RoZXJ3aXNlIHdlIHJlY2FsY3VsYXRlIGZyZXNoXG4gICAgICAgICAgICBpZiAobWlzbWF0Y2gpIHtcbiAgICAgICAgICAgICAgY29tbW9uLmV4dGVuZCh0aGlzLl9fY29sb3IuX19zdGF0ZSwgaSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb21tb24uZXh0ZW5kKHRoaXMuX190ZW1wLl9fc3RhdGUsIHRoaXMuX19jb2xvci5fX3N0YXRlKTtcblxuICAgICAgICAgIHRoaXMuX190ZW1wLmEgPSAxO1xuXG4gICAgICAgICAgdmFyIGZsaXAgPSAodGhpcy5fX2NvbG9yLnYgPCAuNSB8fCB0aGlzLl9fY29sb3IucyA+IC41KSA/IDI1NSA6IDA7XG4gICAgICAgICAgdmFyIF9mbGlwID0gMjU1IC0gZmxpcDtcblxuICAgICAgICAgIGNvbW1vbi5leHRlbmQodGhpcy5fX2ZpZWxkX2tub2Iuc3R5bGUsIHtcbiAgICAgICAgICAgIG1hcmdpbkxlZnQ6IDEwMCAqIHRoaXMuX19jb2xvci5zIC0gNyArICdweCcsXG4gICAgICAgICAgICBtYXJnaW5Ub3A6IDEwMCAqICgxIC0gdGhpcy5fX2NvbG9yLnYpIC0gNyArICdweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuX190ZW1wLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBib3JkZXI6IHRoaXMuX19maWVsZF9rbm9iX2JvcmRlciArICdyZ2IoJyArIGZsaXAgKyAnLCcgKyBmbGlwICsgJywnICsgZmxpcCArJyknXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLl9faHVlX2tub2Iuc3R5bGUubWFyZ2luVG9wID0gKDEgLSB0aGlzLl9fY29sb3IuaCAvIDM2MCkgKiAxMDAgKyAncHgnXG5cbiAgICAgICAgICB0aGlzLl9fdGVtcC5zID0gMTtcbiAgICAgICAgICB0aGlzLl9fdGVtcC52ID0gMTtcblxuICAgICAgICAgIGxpbmVhckdyYWRpZW50KHRoaXMuX19zYXR1cmF0aW9uX2ZpZWxkLCAnbGVmdCcsICcjZmZmJywgdGhpcy5fX3RlbXAudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICBjb21tb24uZXh0ZW5kKHRoaXMuX19pbnB1dC5zdHlsZSwge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLl9faW5wdXQudmFsdWUgPSB0aGlzLl9fY29sb3IudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbG9yOiAncmdiKCcgKyBmbGlwICsgJywnICsgZmxpcCArICcsJyArIGZsaXAgKycpJyxcbiAgICAgICAgICAgIHRleHRTaGFkb3c6IHRoaXMuX19pbnB1dF90ZXh0U2hhZG93ICsgJ3JnYmEoJyArIF9mbGlwICsgJywnICsgX2ZsaXAgKyAnLCcgKyBfZmxpcCArJywuNyknXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgKTtcbiAgXG4gIHZhciB2ZW5kb3JzID0gWyctbW96LScsJy1vLScsJy13ZWJraXQtJywnLW1zLScsJyddO1xuICBcbiAgZnVuY3Rpb24gbGluZWFyR3JhZGllbnQoZWxlbSwgeCwgYSwgYikge1xuICAgIGVsZW0uc3R5bGUuYmFja2dyb3VuZCA9ICcnO1xuICAgIGNvbW1vbi5lYWNoKHZlbmRvcnMsIGZ1bmN0aW9uKHZlbmRvcikge1xuICAgICAgZWxlbS5zdHlsZS5jc3NUZXh0ICs9ICdiYWNrZ3JvdW5kOiAnICsgdmVuZG9yICsgJ2xpbmVhci1ncmFkaWVudCgnK3grJywgJythKycgMCUsICcgKyBiICsgJyAxMDAlKTsgJztcbiAgICB9KTtcbiAgfVxuICBcbiAgZnVuY3Rpb24gaHVlR3JhZGllbnQoZWxlbSkge1xuICAgIGVsZW0uc3R5bGUuYmFja2dyb3VuZCA9ICcnO1xuICAgIGVsZW0uc3R5bGUuY3NzVGV4dCArPSAnYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ZmMDAwMCAwJSwgI2ZmMDBmZiAxNyUsICMwMDAwZmYgMzQlLCAjMDBmZmZmIDUwJSwgIzAwZmYwMCA2NyUsICNmZmZmMDAgODQlLCAjZmYwMDAwIDEwMCUpOydcbiAgICBlbGVtLnN0eWxlLmNzc1RleHQgKz0gJ2JhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgICNmZjAwMDAgMCUsI2ZmMDBmZiAxNyUsIzAwMDBmZiAzNCUsIzAwZmZmZiA1MCUsIzAwZmYwMCA2NyUsI2ZmZmYwMCA4NCUsI2ZmMDAwMCAxMDAlKTsnXG4gICAgZWxlbS5zdHlsZS5jc3NUZXh0ICs9ICdiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ZmMDAwMCAwJSwjZmYwMGZmIDE3JSwjMDAwMGZmIDM0JSwjMDBmZmZmIDUwJSwjMDBmZjAwIDY3JSwjZmZmZjAwIDg0JSwjZmYwMDAwIDEwMCUpOydcbiAgICBlbGVtLnN0eWxlLmNzc1RleHQgKz0gJ2JhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ZmMDAwMCAwJSwjZmYwMGZmIDE3JSwjMDAwMGZmIDM0JSwjMDBmZmZmIDUwJSwjMDBmZjAwIDY3JSwjZmZmZjAwIDg0JSwjZmYwMDAwIDEwMCUpOydcbiAgICBlbGVtLnN0eWxlLmNzc1RleHQgKz0gJ2JhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICAjZmYwMDAwIDAlLCNmZjAwZmYgMTclLCMwMDAwZmYgMzQlLCMwMGZmZmYgNTAlLCMwMGZmMDAgNjclLCNmZmZmMDAgODQlLCNmZjAwMDAgMTAwJSk7J1xuICB9XG5cblxuICByZXR1cm4gQ29sb3JDb250cm9sbGVyO1xuXG59KShkYXQuY29udHJvbGxlcnMuQ29udHJvbGxlcixcbmRhdC5kb20uZG9tLFxuZGF0LmNvbG9yLkNvbG9yID0gKGZ1bmN0aW9uIChpbnRlcnByZXQsIG1hdGgsIHRvU3RyaW5nLCBjb21tb24pIHtcblxuICB2YXIgQ29sb3IgPSBmdW5jdGlvbigpIHtcblxuICAgIHRoaXMuX19zdGF0ZSA9IGludGVycHJldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93ICdGYWlsZWQgdG8gaW50ZXJwcmV0IGNvbG9yIGFyZ3VtZW50cyc7XG4gICAgfVxuXG4gICAgdGhpcy5fX3N0YXRlLmEgPSB0aGlzLl9fc3RhdGUuYSB8fCAxO1xuXG5cbiAgfTtcblxuICBDb2xvci5DT01QT05FTlRTID0gWydyJywnZycsJ2InLCdoJywncycsJ3YnLCdoZXgnLCdhJ107XG5cbiAgY29tbW9uLmV4dGVuZChDb2xvci5wcm90b3R5cGUsIHtcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9PcmlnaW5hbDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3N0YXRlLmNvbnZlcnNpb24ud3JpdGUodGhpcyk7XG4gICAgfVxuXG4gIH0pO1xuXG4gIGRlZmluZVJHQkNvbXBvbmVudChDb2xvci5wcm90b3R5cGUsICdyJywgMik7XG4gIGRlZmluZVJHQkNvbXBvbmVudChDb2xvci5wcm90b3R5cGUsICdnJywgMSk7XG4gIGRlZmluZVJHQkNvbXBvbmVudChDb2xvci5wcm90b3R5cGUsICdiJywgMCk7XG5cbiAgZGVmaW5lSFNWQ29tcG9uZW50KENvbG9yLnByb3RvdHlwZSwgJ2gnKTtcbiAgZGVmaW5lSFNWQ29tcG9uZW50KENvbG9yLnByb3RvdHlwZSwgJ3MnKTtcbiAgZGVmaW5lSFNWQ29tcG9uZW50KENvbG9yLnByb3RvdHlwZSwgJ3YnKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3IucHJvdG90eXBlLCAnYScsIHtcblxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3N0YXRlLmE7XG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24odikge1xuICAgICAgdGhpcy5fX3N0YXRlLmEgPSB2O1xuICAgIH1cblxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3IucHJvdG90eXBlLCAnaGV4Jywge1xuXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcblxuICAgICAgaWYgKCF0aGlzLl9fc3RhdGUuc3BhY2UgIT09ICdIRVgnKSB7XG4gICAgICAgIHRoaXMuX19zdGF0ZS5oZXggPSBtYXRoLnJnYl90b19oZXgodGhpcy5yLCB0aGlzLmcsIHRoaXMuYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9fc3RhdGUuaGV4O1xuXG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24odikge1xuXG4gICAgICB0aGlzLl9fc3RhdGUuc3BhY2UgPSAnSEVYJztcbiAgICAgIHRoaXMuX19zdGF0ZS5oZXggPSB2O1xuXG4gICAgfVxuXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRlZmluZVJHQkNvbXBvbmVudCh0YXJnZXQsIGNvbXBvbmVudCwgY29tcG9uZW50SGV4SW5kZXgpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbXBvbmVudCwge1xuXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGlmICh0aGlzLl9fc3RhdGUuc3BhY2UgPT09ICdSR0InKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19zdGF0ZVtjb21wb25lbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVjYWxjdWxhdGVSR0IodGhpcywgY29tcG9uZW50LCBjb21wb25lbnRIZXhJbmRleCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdGF0ZVtjb21wb25lbnRdO1xuXG4gICAgICB9LFxuXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcblxuICAgICAgICBpZiAodGhpcy5fX3N0YXRlLnNwYWNlICE9PSAnUkdCJykge1xuICAgICAgICAgIHJlY2FsY3VsYXRlUkdCKHRoaXMsIGNvbXBvbmVudCwgY29tcG9uZW50SGV4SW5kZXgpO1xuICAgICAgICAgIHRoaXMuX19zdGF0ZS5zcGFjZSA9ICdSR0InO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX3N0YXRlW2NvbXBvbmVudF0gPSB2O1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5lSFNWQ29tcG9uZW50KHRhcmdldCwgY29tcG9uZW50KSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb21wb25lbnQsIHtcblxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICBpZiAodGhpcy5fX3N0YXRlLnNwYWNlID09PSAnSFNWJylcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX3N0YXRlW2NvbXBvbmVudF07XG5cbiAgICAgICAgcmVjYWxjdWxhdGVIU1YodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdGF0ZVtjb21wb25lbnRdO1xuXG4gICAgICB9LFxuXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcblxuICAgICAgICBpZiAodGhpcy5fX3N0YXRlLnNwYWNlICE9PSAnSFNWJykge1xuICAgICAgICAgIHJlY2FsY3VsYXRlSFNWKHRoaXMpO1xuICAgICAgICAgIHRoaXMuX19zdGF0ZS5zcGFjZSA9ICdIU1YnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX3N0YXRlW2NvbXBvbmVudF0gPSB2O1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgZnVuY3Rpb24gcmVjYWxjdWxhdGVSR0IoY29sb3IsIGNvbXBvbmVudCwgY29tcG9uZW50SGV4SW5kZXgpIHtcblxuICAgIGlmIChjb2xvci5fX3N0YXRlLnNwYWNlID09PSAnSEVYJykge1xuXG4gICAgICBjb2xvci5fX3N0YXRlW2NvbXBvbmVudF0gPSBtYXRoLmNvbXBvbmVudF9mcm9tX2hleChjb2xvci5fX3N0YXRlLmhleCwgY29tcG9uZW50SGV4SW5kZXgpO1xuXG4gICAgfSBlbHNlIGlmIChjb2xvci5fX3N0YXRlLnNwYWNlID09PSAnSFNWJykge1xuXG4gICAgICBjb21tb24uZXh0ZW5kKGNvbG9yLl9fc3RhdGUsIG1hdGguaHN2X3RvX3JnYihjb2xvci5fX3N0YXRlLmgsIGNvbG9yLl9fc3RhdGUucywgY29sb3IuX19zdGF0ZS52KSk7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aHJvdyAnQ29ycnVwdGVkIGNvbG9yIHN0YXRlJztcblxuICAgIH1cblxuICB9XG5cbiAgZnVuY3Rpb24gcmVjYWxjdWxhdGVIU1YoY29sb3IpIHtcblxuICAgIHZhciByZXN1bHQgPSBtYXRoLnJnYl90b19oc3YoY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7XG5cbiAgICBjb21tb24uZXh0ZW5kKGNvbG9yLl9fc3RhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICBzOiByZXN1bHQucyxcbiAgICAgICAgICB2OiByZXN1bHQudlxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGlmICghY29tbW9uLmlzTmFOKHJlc3VsdC5oKSkge1xuICAgICAgY29sb3IuX19zdGF0ZS5oID0gcmVzdWx0Lmg7XG4gICAgfSBlbHNlIGlmIChjb21tb24uaXNVbmRlZmluZWQoY29sb3IuX19zdGF0ZS5oKSkge1xuICAgICAgY29sb3IuX19zdGF0ZS5oID0gMDtcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiBDb2xvcjtcblxufSkoZGF0LmNvbG9yLmludGVycHJldCxcbmRhdC5jb2xvci5tYXRoID0gKGZ1bmN0aW9uICgpIHtcblxuICB2YXIgdG1wQ29tcG9uZW50O1xuXG4gIHJldHVybiB7XG5cbiAgICBoc3ZfdG9fcmdiOiBmdW5jdGlvbihoLCBzLCB2KSB7XG5cbiAgICAgIHZhciBoaSA9IE1hdGguZmxvb3IoaCAvIDYwKSAlIDY7XG5cbiAgICAgIHZhciBmID0gaCAvIDYwIC0gTWF0aC5mbG9vcihoIC8gNjApO1xuICAgICAgdmFyIHAgPSB2ICogKDEuMCAtIHMpO1xuICAgICAgdmFyIHEgPSB2ICogKDEuMCAtIChmICogcykpO1xuICAgICAgdmFyIHQgPSB2ICogKDEuMCAtICgoMS4wIC0gZikgKiBzKSk7XG4gICAgICB2YXIgYyA9IFtcbiAgICAgICAgW3YsIHQsIHBdLFxuICAgICAgICBbcSwgdiwgcF0sXG4gICAgICAgIFtwLCB2LCB0XSxcbiAgICAgICAgW3AsIHEsIHZdLFxuICAgICAgICBbdCwgcCwgdl0sXG4gICAgICAgIFt2LCBwLCBxXVxuICAgICAgXVtoaV07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHI6IGNbMF0gKiAyNTUsXG4gICAgICAgIGc6IGNbMV0gKiAyNTUsXG4gICAgICAgIGI6IGNbMl0gKiAyNTVcbiAgICAgIH07XG5cbiAgICB9LFxuXG4gICAgcmdiX3RvX2hzdjogZnVuY3Rpb24ociwgZywgYikge1xuXG4gICAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICAgICAgZGVsdGEgPSBtYXggLSBtaW4sXG4gICAgICAgICAgaCwgcztcblxuICAgICAgaWYgKG1heCAhPSAwKSB7XG4gICAgICAgIHMgPSBkZWx0YSAvIG1heDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaDogTmFOLFxuICAgICAgICAgIHM6IDAsXG4gICAgICAgICAgdjogMFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAociA9PSBtYXgpIHtcbiAgICAgICAgaCA9IChnIC0gYikgLyBkZWx0YTtcbiAgICAgIH0gZWxzZSBpZiAoZyA9PSBtYXgpIHtcbiAgICAgICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoID0gNCArIChyIC0gZykgLyBkZWx0YTtcbiAgICAgIH1cbiAgICAgIGggLz0gNjtcbiAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICBoICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGg6IGggKiAzNjAsXG4gICAgICAgIHM6IHMsXG4gICAgICAgIHY6IG1heCAvIDI1NVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgcmdiX3RvX2hleDogZnVuY3Rpb24ociwgZywgYikge1xuICAgICAgdmFyIGhleCA9IHRoaXMuaGV4X3dpdGhfY29tcG9uZW50KDAsIDIsIHIpO1xuICAgICAgaGV4ID0gdGhpcy5oZXhfd2l0aF9jb21wb25lbnQoaGV4LCAxLCBnKTtcbiAgICAgIGhleCA9IHRoaXMuaGV4X3dpdGhfY29tcG9uZW50KGhleCwgMCwgYik7XG4gICAgICByZXR1cm4gaGV4O1xuICAgIH0sXG5cbiAgICBjb21wb25lbnRfZnJvbV9oZXg6IGZ1bmN0aW9uKGhleCwgY29tcG9uZW50SW5kZXgpIHtcbiAgICAgIHJldHVybiAoaGV4ID4+IChjb21wb25lbnRJbmRleCAqIDgpKSAmIDB4RkY7XG4gICAgfSxcblxuICAgIGhleF93aXRoX2NvbXBvbmVudDogZnVuY3Rpb24oaGV4LCBjb21wb25lbnRJbmRleCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PCAodG1wQ29tcG9uZW50ID0gY29tcG9uZW50SW5kZXggKiA4KSB8IChoZXggJiB+ICgweEZGIDw8IHRtcENvbXBvbmVudCkpO1xuICAgIH1cblxuICB9XG5cbn0pKCksXG5kYXQuY29sb3IudG9TdHJpbmcsXG5kYXQudXRpbHMuY29tbW9uKSxcbmRhdC5jb2xvci5pbnRlcnByZXQsXG5kYXQudXRpbHMuY29tbW9uKSxcbmRhdC51dGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiByZXF1aXJlanMgdmVyc2lvbiBvZiBQYXVsIElyaXNoJ3MgUmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAqIGh0dHA6Ly9wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXG4gICAqL1xuXG4gIHJldHVybiB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICBmdW5jdGlvbihjYWxsYmFjaywgZWxlbWVudCkge1xuXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuXG4gICAgICB9O1xufSkoKSxcbmRhdC5kb20uQ2VudGVyZWREaXYgPSAoZnVuY3Rpb24gKGRvbSwgY29tbW9uKSB7XG5cblxuICB2YXIgQ2VudGVyZWREaXYgPSBmdW5jdGlvbigpIHtcblxuICAgIHRoaXMuYmFja2dyb3VuZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb21tb24uZXh0ZW5kKHRoaXMuYmFja2dyb3VuZEVsZW1lbnQuc3R5bGUsIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsMC44KScsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgekluZGV4OiAnMTAwMCcsXG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgV2Via2l0VHJhbnNpdGlvbjogJ29wYWNpdHkgMC4ycyBsaW5lYXInXG4gICAgfSk7XG5cbiAgICBkb20ubWFrZUZ1bGxzY3JlZW4odGhpcy5iYWNrZ3JvdW5kRWxlbWVudCk7XG4gICAgdGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb21tb24uZXh0ZW5kKHRoaXMuZG9tRWxlbWVudC5zdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICB6SW5kZXg6ICcxMDAxJyxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBXZWJraXRUcmFuc2l0aW9uOiAnLXdlYmtpdC10cmFuc2Zvcm0gMC4ycyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzIGxpbmVhcidcbiAgICB9KTtcblxuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmJhY2tncm91bmRFbGVtZW50KTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZG9tRWxlbWVudCk7XG5cbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGRvbS5iaW5kKHRoaXMuYmFja2dyb3VuZEVsZW1lbnQsICdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMuaGlkZSgpO1xuICAgIH0pO1xuXG5cbiAgfTtcblxuICBDZW50ZXJlZERpdi5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBcblxuXG4gICAgdGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHRoaXMuZG9tRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmRvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IDA7XG4vLyAgICB0aGlzLmRvbUVsZW1lbnQuc3R5bGUudG9wID0gJzUyJSc7XG4gICAgdGhpcy5kb21FbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdzY2FsZSgxLjEpJztcblxuICAgIHRoaXMubGF5b3V0KCk7XG5cbiAgICBjb21tb24uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgIF90aGlzLmRvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IDE7XG4gICAgICBfdGhpcy5kb21FbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdzY2FsZSgxKSc7XG4gICAgfSk7XG5cbiAgfTtcblxuICBDZW50ZXJlZERpdi5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBoaWRlID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgIF90aGlzLmRvbUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIF90aGlzLmJhY2tncm91bmRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgIGRvbS51bmJpbmQoX3RoaXMuZG9tRWxlbWVudCwgJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCBoaWRlKTtcbiAgICAgIGRvbS51bmJpbmQoX3RoaXMuZG9tRWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnLCBoaWRlKTtcbiAgICAgIGRvbS51bmJpbmQoX3RoaXMuZG9tRWxlbWVudCwgJ29UcmFuc2l0aW9uRW5kJywgaGlkZSk7XG5cbiAgICB9O1xuXG4gICAgZG9tLmJpbmQodGhpcy5kb21FbGVtZW50LCAnd2Via2l0VHJhbnNpdGlvbkVuZCcsIGhpZGUpO1xuICAgIGRvbS5iaW5kKHRoaXMuZG9tRWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnLCBoaWRlKTtcbiAgICBkb20uYmluZCh0aGlzLmRvbUVsZW1lbnQsICdvVHJhbnNpdGlvbkVuZCcsIGhpZGUpO1xuXG4gICAgdGhpcy5iYWNrZ3JvdW5kRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gMDtcbi8vICAgIHRoaXMuZG9tRWxlbWVudC5zdHlsZS50b3AgPSAnNDglJztcbiAgICB0aGlzLmRvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgdGhpcy5kb21FbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICdzY2FsZSgxLjEpJztcblxuICB9O1xuXG4gIENlbnRlcmVkRGl2LnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmRvbUVsZW1lbnQuc3R5bGUubGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoLzIgLSBkb20uZ2V0V2lkdGgodGhpcy5kb21FbGVtZW50KSAvIDIgKyAncHgnO1xuICAgIHRoaXMuZG9tRWxlbWVudC5zdHlsZS50b3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQvMiAtIGRvbS5nZXRIZWlnaHQodGhpcy5kb21FbGVtZW50KSAvIDIgKyAncHgnO1xuICB9O1xuICBcbiAgZnVuY3Rpb24gbG9ja1Njcm9sbChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cblxuICByZXR1cm4gQ2VudGVyZWREaXY7XG5cbn0pKGRhdC5kb20uZG9tLFxuZGF0LnV0aWxzLmNvbW1vbiksXG5kYXQuZG9tLmRvbSxcbmRhdC51dGlscy5jb21tb24pOyIsIi8qKlxuICogZGF0LWd1aSBKYXZhU2NyaXB0IENvbnRyb2xsZXIgTGlicmFyeVxuICogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhdC1ndWlcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSBEYXRhIEFydHMgVGVhbSwgR29vZ2xlIENyZWF0aXZlIExhYlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqL1xuXG4vKiogQG5hbWVzcGFjZSAqL1xudmFyIGRhdCA9IG1vZHVsZS5leHBvcnRzID0gZGF0IHx8IHt9O1xuXG4vKiogQG5hbWVzcGFjZSAqL1xuZGF0LmNvbG9yID0gZGF0LmNvbG9yIHx8IHt9O1xuXG4vKiogQG5hbWVzcGFjZSAqL1xuZGF0LnV0aWxzID0gZGF0LnV0aWxzIHx8IHt9O1xuXG5kYXQudXRpbHMuY29tbW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgXG4gIHZhciBBUlJfRUFDSCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoO1xuICB2YXIgQVJSX1NMSUNFID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4gIC8qKlxuICAgKiBCYW5kLWFpZCBtZXRob2RzIGZvciB0aGluZ3MgdGhhdCBzaG91bGQgYmUgYSBsb3QgZWFzaWVyIGluIEphdmFTY3JpcHQuXG4gICAqIEltcGxlbWVudGF0aW9uIGFuZCBzdHJ1Y3R1cmUgaW5zcGlyZWQgYnkgdW5kZXJzY29yZS5qc1xuICAgKiBodHRwOi8vZG9jdW1lbnRjbG91ZC5naXRodWIuY29tL3VuZGVyc2NvcmUvXG4gICAqL1xuXG4gIHJldHVybiB7IFxuICAgIFxuICAgIEJSRUFLOiB7fSxcbiAgXG4gICAgZXh0ZW5kOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgIFxuICAgICAgdGhpcy5lYWNoKEFSUl9TTElDRS5jYWxsKGFyZ3VtZW50cywgMSksIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgICBpZiAoIXRoaXMuaXNVbmRlZmluZWQob2JqW2tleV0pKSBcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIFxuICAgICAgfSwgdGhpcyk7XG4gICAgICBcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICBcbiAgICB9LFxuICAgIFxuICAgIGRlZmF1bHRzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgIFxuICAgICAgdGhpcy5lYWNoKEFSUl9TTElDRS5jYWxsKGFyZ3VtZW50cywgMSksIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iailcbiAgICAgICAgICBpZiAodGhpcy5pc1VuZGVmaW5lZCh0YXJnZXRba2V5XSkpIFxuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgXG4gICAgICB9LCB0aGlzKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICBcbiAgICB9LFxuICAgIFxuICAgIGNvbXBvc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHRvQ2FsbCA9IEFSUl9TTElDRS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBhcmdzID0gQVJSX1NMSUNFLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRvQ2FsbC5sZW5ndGggLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IFt0b0NhbGxbaV0uYXBwbHkodGhpcywgYXJncyldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBhcmdzWzBdO1xuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgZWFjaDogZnVuY3Rpb24ob2JqLCBpdHIsIHNjb3BlKSB7XG5cbiAgICAgIFxuICAgICAgaWYgKEFSUl9FQUNIICYmIG9iai5mb3JFYWNoID09PSBBUlJfRUFDSCkgeyBcbiAgICAgICAgXG4gICAgICAgIG9iai5mb3JFYWNoKGl0ciwgc2NvcGUpO1xuICAgICAgICBcbiAgICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA9PT0gb2JqLmxlbmd0aCArIDApIHsgLy8gSXMgbnVtYmVyIGJ1dCBub3QgTmFOXG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciBrZXkgPSAwLCBsID0gb2JqLmxlbmd0aDsga2V5IDwgbDsga2V5KyspXG4gICAgICAgICAgaWYgKGtleSBpbiBvYmogJiYgaXRyLmNhbGwoc2NvcGUsIG9ialtrZXldLCBrZXkpID09PSB0aGlzLkJSRUFLKSBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBcbiAgICAgICAgICBpZiAoaXRyLmNhbGwoc2NvcGUsIG9ialtrZXldLCBrZXkpID09PSB0aGlzLkJSRUFLKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICB9XG4gICAgICAgICAgICBcbiAgICB9LFxuICAgIFxuICAgIGRlZmVyOiBmdW5jdGlvbihmbmMpIHtcbiAgICAgIHNldFRpbWVvdXQoZm5jLCAwKTtcbiAgICB9LFxuICAgIFxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgaWYgKG9iai50b0FycmF5KSByZXR1cm4gb2JqLnRvQXJyYXkoKTtcbiAgICAgIHJldHVybiBBUlJfU0xJQ0UuY2FsbChvYmopO1xuICAgIH0sXG5cbiAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBcbiAgICBpc051bGw6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbiAgICB9LFxuICAgIFxuICAgIGlzTmFOOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogIT09IG9iajtcbiAgICB9LFxuICAgIFxuICAgIGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqLmNvbnN0cnVjdG9yID09PSBBcnJheTtcbiAgICB9LFxuICAgIFxuICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogPT09IE9iamVjdChvYmopO1xuICAgIH0sXG4gICAgXG4gICAgaXNOdW1iZXI6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb2JqKzA7XG4gICAgfSxcbiAgICBcbiAgICBpc1N0cmluZzogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09PSBvYmorJyc7XG4gICAgfSxcbiAgICBcbiAgICBpc0Jvb2xlYW46IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gZmFsc2UgfHwgb2JqID09PSB0cnVlO1xuICAgIH0sXG4gICAgXG4gICAgaXNGdW5jdGlvbjogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICBcbiAgfTtcbiAgICBcbn0pKCk7XG5cblxuZGF0LmNvbG9yLnRvU3RyaW5nID0gKGZ1bmN0aW9uIChjb21tb24pIHtcblxuICByZXR1cm4gZnVuY3Rpb24oY29sb3IpIHtcblxuICAgIGlmIChjb2xvci5hID09IDEgfHwgY29tbW9uLmlzVW5kZWZpbmVkKGNvbG9yLmEpKSB7XG5cbiAgICAgIHZhciBzID0gY29sb3IuaGV4LnRvU3RyaW5nKDE2KTtcbiAgICAgIHdoaWxlIChzLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgcyA9ICcwJyArIHM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnIycgKyBzO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgcmV0dXJuICdyZ2JhKCcgKyBNYXRoLnJvdW5kKGNvbG9yLnIpICsgJywnICsgTWF0aC5yb3VuZChjb2xvci5nKSArICcsJyArIE1hdGgucm91bmQoY29sb3IuYikgKyAnLCcgKyBjb2xvci5hICsgJyknO1xuXG4gICAgfVxuXG4gIH1cblxufSkoZGF0LnV0aWxzLmNvbW1vbik7XG5cblxuZGF0LkNvbG9yID0gZGF0LmNvbG9yLkNvbG9yID0gKGZ1bmN0aW9uIChpbnRlcnByZXQsIG1hdGgsIHRvU3RyaW5nLCBjb21tb24pIHtcblxuICB2YXIgQ29sb3IgPSBmdW5jdGlvbigpIHtcblxuICAgIHRoaXMuX19zdGF0ZSA9IGludGVycHJldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93ICdGYWlsZWQgdG8gaW50ZXJwcmV0IGNvbG9yIGFyZ3VtZW50cyc7XG4gICAgfVxuXG4gICAgdGhpcy5fX3N0YXRlLmEgPSB0aGlzLl9fc3RhdGUuYSB8fCAxO1xuXG5cbiAgfTtcblxuICBDb2xvci5DT01QT05FTlRTID0gWydyJywnZycsJ2InLCdoJywncycsJ3YnLCdoZXgnLCdhJ107XG5cbiAgY29tbW9uLmV4dGVuZChDb2xvci5wcm90b3R5cGUsIHtcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9PcmlnaW5hbDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3N0YXRlLmNvbnZlcnNpb24ud3JpdGUodGhpcyk7XG4gICAgfVxuXG4gIH0pO1xuXG4gIGRlZmluZVJHQkNvbXBvbmVudChDb2xvci5wcm90b3R5cGUsICdyJywgMik7XG4gIGRlZmluZVJHQkNvbXBvbmVudChDb2xvci5wcm90b3R5cGUsICdnJywgMSk7XG4gIGRlZmluZVJHQkNvbXBvbmVudChDb2xvci5wcm90b3R5cGUsICdiJywgMCk7XG5cbiAgZGVmaW5lSFNWQ29tcG9uZW50KENvbG9yLnByb3RvdHlwZSwgJ2gnKTtcbiAgZGVmaW5lSFNWQ29tcG9uZW50KENvbG9yLnByb3RvdHlwZSwgJ3MnKTtcbiAgZGVmaW5lSFNWQ29tcG9uZW50KENvbG9yLnByb3RvdHlwZSwgJ3YnKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3IucHJvdG90eXBlLCAnYScsIHtcblxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3N0YXRlLmE7XG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24odikge1xuICAgICAgdGhpcy5fX3N0YXRlLmEgPSB2O1xuICAgIH1cblxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3IucHJvdG90eXBlLCAnaGV4Jywge1xuXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcblxuICAgICAgaWYgKCF0aGlzLl9fc3RhdGUuc3BhY2UgIT09ICdIRVgnKSB7XG4gICAgICAgIHRoaXMuX19zdGF0ZS5oZXggPSBtYXRoLnJnYl90b19oZXgodGhpcy5yLCB0aGlzLmcsIHRoaXMuYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9fc3RhdGUuaGV4O1xuXG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24odikge1xuXG4gICAgICB0aGlzLl9fc3RhdGUuc3BhY2UgPSAnSEVYJztcbiAgICAgIHRoaXMuX19zdGF0ZS5oZXggPSB2O1xuXG4gICAgfVxuXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGRlZmluZVJHQkNvbXBvbmVudCh0YXJnZXQsIGNvbXBvbmVudCwgY29tcG9uZW50SGV4SW5kZXgpIHtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbXBvbmVudCwge1xuXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGlmICh0aGlzLl9fc3RhdGUuc3BhY2UgPT09ICdSR0InKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX19zdGF0ZVtjb21wb25lbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVjYWxjdWxhdGVSR0IodGhpcywgY29tcG9uZW50LCBjb21wb25lbnRIZXhJbmRleCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdGF0ZVtjb21wb25lbnRdO1xuXG4gICAgICB9LFxuXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcblxuICAgICAgICBpZiAodGhpcy5fX3N0YXRlLnNwYWNlICE9PSAnUkdCJykge1xuICAgICAgICAgIHJlY2FsY3VsYXRlUkdCKHRoaXMsIGNvbXBvbmVudCwgY29tcG9uZW50SGV4SW5kZXgpO1xuICAgICAgICAgIHRoaXMuX19zdGF0ZS5zcGFjZSA9ICdSR0InO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX3N0YXRlW2NvbXBvbmVudF0gPSB2O1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgZnVuY3Rpb24gZGVmaW5lSFNWQ29tcG9uZW50KHRhcmdldCwgY29tcG9uZW50KSB7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb21wb25lbnQsIHtcblxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICBpZiAodGhpcy5fX3N0YXRlLnNwYWNlID09PSAnSFNWJylcbiAgICAgICAgICByZXR1cm4gdGhpcy5fX3N0YXRlW2NvbXBvbmVudF07XG5cbiAgICAgICAgcmVjYWxjdWxhdGVIU1YodGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdGF0ZVtjb21wb25lbnRdO1xuXG4gICAgICB9LFxuXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHYpIHtcblxuICAgICAgICBpZiAodGhpcy5fX3N0YXRlLnNwYWNlICE9PSAnSFNWJykge1xuICAgICAgICAgIHJlY2FsY3VsYXRlSFNWKHRoaXMpO1xuICAgICAgICAgIHRoaXMuX19zdGF0ZS5zcGFjZSA9ICdIU1YnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX3N0YXRlW2NvbXBvbmVudF0gPSB2O1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgZnVuY3Rpb24gcmVjYWxjdWxhdGVSR0IoY29sb3IsIGNvbXBvbmVudCwgY29tcG9uZW50SGV4SW5kZXgpIHtcblxuICAgIGlmIChjb2xvci5fX3N0YXRlLnNwYWNlID09PSAnSEVYJykge1xuXG4gICAgICBjb2xvci5fX3N0YXRlW2NvbXBvbmVudF0gPSBtYXRoLmNvbXBvbmVudF9mcm9tX2hleChjb2xvci5fX3N0YXRlLmhleCwgY29tcG9uZW50SGV4SW5kZXgpO1xuXG4gICAgfSBlbHNlIGlmIChjb2xvci5fX3N0YXRlLnNwYWNlID09PSAnSFNWJykge1xuXG4gICAgICBjb21tb24uZXh0ZW5kKGNvbG9yLl9fc3RhdGUsIG1hdGguaHN2X3RvX3JnYihjb2xvci5fX3N0YXRlLmgsIGNvbG9yLl9fc3RhdGUucywgY29sb3IuX19zdGF0ZS52KSk7XG5cbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aHJvdyAnQ29ycnVwdGVkIGNvbG9yIHN0YXRlJztcblxuICAgIH1cblxuICB9XG5cbiAgZnVuY3Rpb24gcmVjYWxjdWxhdGVIU1YoY29sb3IpIHtcblxuICAgIHZhciByZXN1bHQgPSBtYXRoLnJnYl90b19oc3YoY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7XG5cbiAgICBjb21tb24uZXh0ZW5kKGNvbG9yLl9fc3RhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICBzOiByZXN1bHQucyxcbiAgICAgICAgICB2OiByZXN1bHQudlxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGlmICghY29tbW9uLmlzTmFOKHJlc3VsdC5oKSkge1xuICAgICAgY29sb3IuX19zdGF0ZS5oID0gcmVzdWx0Lmg7XG4gICAgfSBlbHNlIGlmIChjb21tb24uaXNVbmRlZmluZWQoY29sb3IuX19zdGF0ZS5oKSkge1xuICAgICAgY29sb3IuX19zdGF0ZS5oID0gMDtcbiAgICB9XG5cbiAgfVxuXG4gIHJldHVybiBDb2xvcjtcblxufSkoZGF0LmNvbG9yLmludGVycHJldCA9IChmdW5jdGlvbiAodG9TdHJpbmcsIGNvbW1vbikge1xuXG4gIHZhciByZXN1bHQsIHRvUmV0dXJuO1xuXG4gIHZhciBpbnRlcnByZXQgPSBmdW5jdGlvbigpIHtcblxuICAgIHRvUmV0dXJuID0gZmFsc2U7XG5cbiAgICB2YXIgb3JpZ2luYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvbW1vbi50b0FycmF5KGFyZ3VtZW50cykgOiBhcmd1bWVudHNbMF07XG5cbiAgICBjb21tb24uZWFjaChJTlRFUlBSRVRBVElPTlMsIGZ1bmN0aW9uKGZhbWlseSkge1xuXG4gICAgICBpZiAoZmFtaWx5LmxpdG11cyhvcmlnaW5hbCkpIHtcblxuICAgICAgICBjb21tb24uZWFjaChmYW1pbHkuY29udmVyc2lvbnMsIGZ1bmN0aW9uKGNvbnZlcnNpb24sIGNvbnZlcnNpb25OYW1lKSB7XG5cbiAgICAgICAgICByZXN1bHQgPSBjb252ZXJzaW9uLnJlYWQob3JpZ2luYWwpO1xuXG4gICAgICAgICAgaWYgKHRvUmV0dXJuID09PSBmYWxzZSAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0b1JldHVybiA9IHJlc3VsdDtcbiAgICAgICAgICAgIHJlc3VsdC5jb252ZXJzaW9uTmFtZSA9IGNvbnZlcnNpb25OYW1lO1xuICAgICAgICAgICAgcmVzdWx0LmNvbnZlcnNpb24gPSBjb252ZXJzaW9uO1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5CUkVBSztcblxuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29tbW9uLkJSRUFLO1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICAgIHJldHVybiB0b1JldHVybjtcblxuICB9O1xuXG4gIHZhciBJTlRFUlBSRVRBVElPTlMgPSBbXG5cbiAgICAvLyBTdHJpbmdzXG4gICAge1xuXG4gICAgICBsaXRtdXM6IGNvbW1vbi5pc1N0cmluZyxcblxuICAgICAgY29udmVyc2lvbnM6IHtcblxuICAgICAgICBUSFJFRV9DSEFSX0hFWDoge1xuXG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcblxuICAgICAgICAgICAgdmFyIHRlc3QgPSBvcmlnaW5hbC5tYXRjaCgvXiMoW0EtRjAtOV0pKFtBLUYwLTldKShbQS1GMC05XSkkL2kpO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3BhY2U6ICdIRVgnLFxuICAgICAgICAgICAgICBoZXg6IHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgJzB4JyArXG4gICAgICAgICAgICAgICAgICAgICAgdGVzdFsxXS50b1N0cmluZygpICsgdGVzdFsxXS50b1N0cmluZygpICtcbiAgICAgICAgICAgICAgICAgICAgICB0ZXN0WzJdLnRvU3RyaW5nKCkgKyB0ZXN0WzJdLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgICAgICAgICAgIHRlc3RbM10udG9TdHJpbmcoKSArIHRlc3RbM10udG9TdHJpbmcoKSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IHRvU3RyaW5nXG5cbiAgICAgICAgfSxcblxuICAgICAgICBTSVhfQ0hBUl9IRVg6IHtcblxuICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKG9yaWdpbmFsKSB7XG5cbiAgICAgICAgICAgIHZhciB0ZXN0ID0gb3JpZ2luYWwubWF0Y2goL14jKFtBLUYwLTldezZ9KSQvaSk7XG4gICAgICAgICAgICBpZiAodGVzdCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzcGFjZTogJ0hFWCcsXG4gICAgICAgICAgICAgIGhleDogcGFyc2VJbnQoJzB4JyArIHRlc3RbMV0udG9TdHJpbmcoKSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IHRvU3RyaW5nXG5cbiAgICAgICAgfSxcblxuICAgICAgICBDU1NfUkdCOiB7XG5cbiAgICAgICAgICByZWFkOiBmdW5jdGlvbihvcmlnaW5hbCkge1xuXG4gICAgICAgICAgICB2YXIgdGVzdCA9IG9yaWdpbmFsLm1hdGNoKC9ecmdiXFwoXFxzKiguKylcXHMqLFxccyooLispXFxzKixcXHMqKC4rKVxccypcXCkvKTtcbiAgICAgICAgICAgIGlmICh0ZXN0ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAnUkdCJyxcbiAgICAgICAgICAgICAgcjogcGFyc2VGbG9hdCh0ZXN0WzFdKSxcbiAgICAgICAgICAgICAgZzogcGFyc2VGbG9hdCh0ZXN0WzJdKSxcbiAgICAgICAgICAgICAgYjogcGFyc2VGbG9hdCh0ZXN0WzNdKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICB3cml0ZTogdG9TdHJpbmdcblxuICAgICAgICB9LFxuXG4gICAgICAgIENTU19SR0JBOiB7XG5cbiAgICAgICAgICByZWFkOiBmdW5jdGlvbihvcmlnaW5hbCkge1xuXG4gICAgICAgICAgICB2YXIgdGVzdCA9IG9yaWdpbmFsLm1hdGNoKC9ecmdiYVxcKFxccyooLispXFxzKixcXHMqKC4rKVxccyosXFxzKiguKylcXHMqXFwsXFxzKiguKylcXHMqXFwpLyk7XG4gICAgICAgICAgICBpZiAodGVzdCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzcGFjZTogJ1JHQicsXG4gICAgICAgICAgICAgIHI6IHBhcnNlRmxvYXQodGVzdFsxXSksXG4gICAgICAgICAgICAgIGc6IHBhcnNlRmxvYXQodGVzdFsyXSksXG4gICAgICAgICAgICAgIGI6IHBhcnNlRmxvYXQodGVzdFszXSksXG4gICAgICAgICAgICAgIGE6IHBhcnNlRmxvYXQodGVzdFs0XSlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IHRvU3RyaW5nXG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gTnVtYmVyc1xuICAgIHtcblxuICAgICAgbGl0bXVzOiBjb21tb24uaXNOdW1iZXIsXG5cbiAgICAgIGNvbnZlcnNpb25zOiB7XG5cbiAgICAgICAgSEVYOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAnSEVYJyxcbiAgICAgICAgICAgICAgaGV4OiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgY29udmVyc2lvbk5hbWU6ICdIRVgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbG9yLmhleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEFycmF5c1xuICAgIHtcblxuICAgICAgbGl0bXVzOiBjb21tb24uaXNBcnJheSxcblxuICAgICAgY29udmVyc2lvbnM6IHtcblxuICAgICAgICBSR0JfQVJSQVk6IHtcbiAgICAgICAgICByZWFkOiBmdW5jdGlvbihvcmlnaW5hbCkge1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsLmxlbmd0aCAhPSAzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzcGFjZTogJ1JHQicsXG4gICAgICAgICAgICAgIHI6IG9yaWdpbmFsWzBdLFxuICAgICAgICAgICAgICBnOiBvcmlnaW5hbFsxXSxcbiAgICAgICAgICAgICAgYjogb3JpZ2luYWxbMl1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIFtjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBSR0JBX0FSUkFZOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbC5sZW5ndGggIT0gNCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3BhY2U6ICdSR0InLFxuICAgICAgICAgICAgICByOiBvcmlnaW5hbFswXSxcbiAgICAgICAgICAgICAgZzogb3JpZ2luYWxbMV0sXG4gICAgICAgICAgICAgIGI6IG9yaWdpbmFsWzJdLFxuICAgICAgICAgICAgICBhOiBvcmlnaW5hbFszXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gW2NvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGNvbG9yLmFdO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvLyBPYmplY3RzXG4gICAge1xuXG4gICAgICBsaXRtdXM6IGNvbW1vbi5pc09iamVjdCxcblxuICAgICAgY29udmVyc2lvbnM6IHtcblxuICAgICAgICBSR0JBX09CSjoge1xuICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICBpZiAoY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLnIpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmcpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmIpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3BhY2U6ICdSR0InLFxuICAgICAgICAgICAgICAgIHI6IG9yaWdpbmFsLnIsXG4gICAgICAgICAgICAgICAgZzogb3JpZ2luYWwuZyxcbiAgICAgICAgICAgICAgICBiOiBvcmlnaW5hbC5iLFxuICAgICAgICAgICAgICAgIGE6IG9yaWdpbmFsLmFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHI6IGNvbG9yLnIsXG4gICAgICAgICAgICAgIGc6IGNvbG9yLmcsXG4gICAgICAgICAgICAgIGI6IGNvbG9yLmIsXG4gICAgICAgICAgICAgIGE6IGNvbG9yLmFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgUkdCX09CSjoge1xuICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICBpZiAoY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLnIpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmcpICYmXG4gICAgICAgICAgICAgICAgY29tbW9uLmlzTnVtYmVyKG9yaWdpbmFsLmIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3BhY2U6ICdSR0InLFxuICAgICAgICAgICAgICAgIHI6IG9yaWdpbmFsLnIsXG4gICAgICAgICAgICAgICAgZzogb3JpZ2luYWwuZyxcbiAgICAgICAgICAgICAgICBiOiBvcmlnaW5hbC5iXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICByOiBjb2xvci5yLFxuICAgICAgICAgICAgICBnOiBjb2xvci5nLFxuICAgICAgICAgICAgICBiOiBjb2xvci5iXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIEhTVkFfT0JKOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGlmIChjb21tb24uaXNOdW1iZXIob3JpZ2luYWwuaCkgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwucykgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwudikgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwuYSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcGFjZTogJ0hTVicsXG4gICAgICAgICAgICAgICAgaDogb3JpZ2luYWwuaCxcbiAgICAgICAgICAgICAgICBzOiBvcmlnaW5hbC5zLFxuICAgICAgICAgICAgICAgIHY6IG9yaWdpbmFsLnYsXG4gICAgICAgICAgICAgICAgYTogb3JpZ2luYWwuYVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaDogY29sb3IuaCxcbiAgICAgICAgICAgICAgczogY29sb3IucyxcbiAgICAgICAgICAgICAgdjogY29sb3IudixcbiAgICAgICAgICAgICAgYTogY29sb3IuYVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBIU1ZfT0JKOiB7XG4gICAgICAgICAgcmVhZDogZnVuY3Rpb24ob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIGlmIChjb21tb24uaXNOdW1iZXIob3JpZ2luYWwuaCkgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwucykgJiZcbiAgICAgICAgICAgICAgICBjb21tb24uaXNOdW1iZXIob3JpZ2luYWwudikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcGFjZTogJ0hTVicsXG4gICAgICAgICAgICAgICAgaDogb3JpZ2luYWwuaCxcbiAgICAgICAgICAgICAgICBzOiBvcmlnaW5hbC5zLFxuICAgICAgICAgICAgICAgIHY6IG9yaWdpbmFsLnZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGg6IGNvbG9yLmgsXG4gICAgICAgICAgICAgIHM6IGNvbG9yLnMsXG4gICAgICAgICAgICAgIHY6IGNvbG9yLnZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9XG5cblxuICBdO1xuXG4gIHJldHVybiBpbnRlcnByZXQ7XG5cblxufSkoZGF0LmNvbG9yLnRvU3RyaW5nLFxuZGF0LnV0aWxzLmNvbW1vbiksXG5kYXQuY29sb3IubWF0aCA9IChmdW5jdGlvbiAoKSB7XG5cbiAgdmFyIHRtcENvbXBvbmVudDtcblxuICByZXR1cm4ge1xuXG4gICAgaHN2X3RvX3JnYjogZnVuY3Rpb24oaCwgcywgdikge1xuXG4gICAgICB2YXIgaGkgPSBNYXRoLmZsb29yKGggLyA2MCkgJSA2O1xuXG4gICAgICB2YXIgZiA9IGggLyA2MCAtIE1hdGguZmxvb3IoaCAvIDYwKTtcbiAgICAgIHZhciBwID0gdiAqICgxLjAgLSBzKTtcbiAgICAgIHZhciBxID0gdiAqICgxLjAgLSAoZiAqIHMpKTtcbiAgICAgIHZhciB0ID0gdiAqICgxLjAgLSAoKDEuMCAtIGYpICogcykpO1xuICAgICAgdmFyIGMgPSBbXG4gICAgICAgIFt2LCB0LCBwXSxcbiAgICAgICAgW3EsIHYsIHBdLFxuICAgICAgICBbcCwgdiwgdF0sXG4gICAgICAgIFtwLCBxLCB2XSxcbiAgICAgICAgW3QsIHAsIHZdLFxuICAgICAgICBbdiwgcCwgcV1cbiAgICAgIF1baGldO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICByOiBjWzBdICogMjU1LFxuICAgICAgICBnOiBjWzFdICogMjU1LFxuICAgICAgICBiOiBjWzJdICogMjU1XG4gICAgICB9O1xuXG4gICAgfSxcblxuICAgIHJnYl90b19oc3Y6IGZ1bmN0aW9uKHIsIGcsIGIpIHtcblxuICAgICAgdmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgICAgIGRlbHRhID0gbWF4IC0gbWluLFxuICAgICAgICAgIGgsIHM7XG5cbiAgICAgIGlmIChtYXggIT0gMCkge1xuICAgICAgICBzID0gZGVsdGEgLyBtYXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGg6IE5hTixcbiAgICAgICAgICBzOiAwLFxuICAgICAgICAgIHY6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHIgPT0gbWF4KSB7XG4gICAgICAgIGggPSAoZyAtIGIpIC8gZGVsdGE7XG4gICAgICB9IGVsc2UgaWYgKGcgPT0gbWF4KSB7XG4gICAgICAgIGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG4gICAgICB9XG4gICAgICBoIC89IDY7XG4gICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgaCArPSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBoOiBoICogMzYwLFxuICAgICAgICBzOiBzLFxuICAgICAgICB2OiBtYXggLyAyNTVcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHJnYl90b19oZXg6IGZ1bmN0aW9uKHIsIGcsIGIpIHtcbiAgICAgIHZhciBoZXggPSB0aGlzLmhleF93aXRoX2NvbXBvbmVudCgwLCAyLCByKTtcbiAgICAgIGhleCA9IHRoaXMuaGV4X3dpdGhfY29tcG9uZW50KGhleCwgMSwgZyk7XG4gICAgICBoZXggPSB0aGlzLmhleF93aXRoX2NvbXBvbmVudChoZXgsIDAsIGIpO1xuICAgICAgcmV0dXJuIGhleDtcbiAgICB9LFxuXG4gICAgY29tcG9uZW50X2Zyb21faGV4OiBmdW5jdGlvbihoZXgsIGNvbXBvbmVudEluZGV4KSB7XG4gICAgICByZXR1cm4gKGhleCA+PiAoY29tcG9uZW50SW5kZXggKiA4KSkgJiAweEZGO1xuICAgIH0sXG5cbiAgICBoZXhfd2l0aF9jb21wb25lbnQ6IGZ1bmN0aW9uKGhleCwgY29tcG9uZW50SW5kZXgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPDwgKHRtcENvbXBvbmVudCA9IGNvbXBvbmVudEluZGV4ICogOCkgfCAoaGV4ICYgfiAoMHhGRiA8PCB0bXBDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgfVxuXG59KSgpLFxuZGF0LmNvbG9yLnRvU3RyaW5nLFxuZGF0LnV0aWxzLmNvbW1vbik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3ZlbmRvci9kYXQuZ3VpJylcbm1vZHVsZS5leHBvcnRzLmNvbG9yID0gcmVxdWlyZSgnLi92ZW5kb3IvZGF0LmNvbG9yJykiLCIvLyBQb2x5ZmlsbHNcblxuaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdE51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTtcblxufVxuXG5pZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuXHROdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKCB2YWx1ZSApICYmIE1hdGguZmxvb3IoIHZhbHVlICkgPT09IHZhbHVlO1xuXG5cdH07XG5cbn1cblxuLy9cblxuaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3NpZ25cblxuXHRNYXRoLnNpZ24gPSBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHRyZXR1cm4gKCB4IDwgMCApID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDtcblxuXHR9O1xuXG59XG5cbmlmICggRnVuY3Rpb24ucHJvdG90eXBlLm5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL25hbWVcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIEZ1bmN0aW9uLnByb3RvdHlwZSwgJ25hbWUnLCB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudG9TdHJpbmcoKS5tYXRjaCggL15cXHMqZnVuY3Rpb25cXHMqKFteXFwoXFxzXSopLyApWyAxIF07XG5cblx0XHR9XG5cblx0fSApO1xuXG59XG5cbmlmICggT2JqZWN0LmFzc2lnbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuXG5cdCggZnVuY3Rpb24gKCkge1xuXG5cdFx0T2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0XHQndXNlIHN0cmljdCc7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7XG5cblx0XHRcdGZvciAoIHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKysgKSB7XG5cblx0XHRcdFx0dmFyIHNvdXJjZSA9IGFyZ3VtZW50c1sgaW5kZXggXTtcblxuXHRcdFx0XHRpZiAoIHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHNvdXJjZSwgbmV4dEtleSApICkge1xuXG5cdFx0XHRcdFx0XHRcdG91dHB1dFsgbmV4dEtleSBdID0gc291cmNlWyBuZXh0S2V5IF07XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG91dHB1dDtcblxuXHRcdH07XG5cblx0fSApKCk7XG5cbn1cblxuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL2V2ZW50ZGlzcGF0Y2hlci5qcy9cbiAqL1xuXG5mdW5jdGlvbiBFdmVudERpc3BhdGNoZXIoKSB7fVxuXG5PYmplY3QuYXNzaWduKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdID0gW107XG5cblx0XHR9XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgPT09IC0gMSApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0ucHVzaCggbGlzdGVuZXIgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGhhc0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcblxuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cdFx0dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIGV2ZW50LnR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRldmVudC50YXJnZXQgPSB0aGlzO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXSwgaSA9IDA7XG5cdFx0XHR2YXIgbGVuZ3RoID0gbGlzdGVuZXJBcnJheS5sZW5ndGg7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5WyBpIF0gPSBsaXN0ZW5lckFycmF5WyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXlbIGkgXS5jYWxsKCB0aGlzLCBldmVudCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbnZhciBSRVZJU0lPTiA9ICc4NSc7XG52YXIgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIgfTtcbnZhciBDdWxsRmFjZU5vbmUgPSAwO1xudmFyIEN1bGxGYWNlQmFjayA9IDE7XG52YXIgQ3VsbEZhY2VGcm9udCA9IDI7XG52YXIgQ3VsbEZhY2VGcm9udEJhY2sgPSAzO1xudmFyIEZyb250RmFjZURpcmVjdGlvbkNXID0gMDtcbnZhciBGcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSAxO1xudmFyIEJhc2ljU2hhZG93TWFwID0gMDtcbnZhciBQQ0ZTaGFkb3dNYXAgPSAxO1xudmFyIFBDRlNvZnRTaGFkb3dNYXAgPSAyO1xudmFyIEZyb250U2lkZSA9IDA7XG52YXIgQmFja1NpZGUgPSAxO1xudmFyIERvdWJsZVNpZGUgPSAyO1xudmFyIEZsYXRTaGFkaW5nID0gMTtcbnZhciBTbW9vdGhTaGFkaW5nID0gMjtcbnZhciBOb0NvbG9ycyA9IDA7XG52YXIgRmFjZUNvbG9ycyA9IDE7XG52YXIgVmVydGV4Q29sb3JzID0gMjtcbnZhciBOb0JsZW5kaW5nID0gMDtcbnZhciBOb3JtYWxCbGVuZGluZyA9IDE7XG52YXIgQWRkaXRpdmVCbGVuZGluZyA9IDI7XG52YXIgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XG52YXIgTXVsdGlwbHlCbGVuZGluZyA9IDQ7XG52YXIgQ3VzdG9tQmxlbmRpbmcgPSA1O1xudmFyIEFkZEVxdWF0aW9uID0gMTAwO1xudmFyIFN1YnRyYWN0RXF1YXRpb24gPSAxMDE7XG52YXIgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAxMDI7XG52YXIgTWluRXF1YXRpb24gPSAxMDM7XG52YXIgTWF4RXF1YXRpb24gPSAxMDQ7XG52YXIgWmVyb0ZhY3RvciA9IDIwMDtcbnZhciBPbmVGYWN0b3IgPSAyMDE7XG52YXIgU3JjQ29sb3JGYWN0b3IgPSAyMDI7XG52YXIgT25lTWludXNTcmNDb2xvckZhY3RvciA9IDIwMztcbnZhciBTcmNBbHBoYUZhY3RvciA9IDIwNDtcbnZhciBPbmVNaW51c1NyY0FscGhhRmFjdG9yID0gMjA1O1xudmFyIERzdEFscGhhRmFjdG9yID0gMjA2O1xudmFyIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XG52YXIgRHN0Q29sb3JGYWN0b3IgPSAyMDg7XG52YXIgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTtcbnZhciBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xudmFyIE5ldmVyRGVwdGggPSAwO1xudmFyIEFsd2F5c0RlcHRoID0gMTtcbnZhciBMZXNzRGVwdGggPSAyO1xudmFyIExlc3NFcXVhbERlcHRoID0gMztcbnZhciBFcXVhbERlcHRoID0gNDtcbnZhciBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XG52YXIgR3JlYXRlckRlcHRoID0gNjtcbnZhciBOb3RFcXVhbERlcHRoID0gNztcbnZhciBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XG52YXIgTWl4T3BlcmF0aW9uID0gMTtcbnZhciBBZGRPcGVyYXRpb24gPSAyO1xudmFyIE5vVG9uZU1hcHBpbmcgPSAwO1xudmFyIExpbmVhclRvbmVNYXBwaW5nID0gMTtcbnZhciBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjtcbnZhciBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcgPSAzO1xudmFyIENpbmVvblRvbmVNYXBwaW5nID0gNDtcbnZhciBVVk1hcHBpbmcgPSAzMDA7XG52YXIgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nID0gMzAxO1xudmFyIEN1YmVSZWZyYWN0aW9uTWFwcGluZyA9IDMwMjtcbnZhciBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMztcbnZhciBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA9IDMwNDtcbnZhciBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyA9IDMwNTtcbnZhciBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA9IDMwNjtcbnZhciBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNztcbnZhciBSZXBlYXRXcmFwcGluZyA9IDEwMDA7XG52YXIgQ2xhbXBUb0VkZ2VXcmFwcGluZyA9IDEwMDE7XG52YXIgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7XG52YXIgTmVhcmVzdEZpbHRlciA9IDEwMDM7XG52YXIgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0O1xudmFyIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1O1xudmFyIExpbmVhckZpbHRlciA9IDEwMDY7XG52YXIgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7XG52YXIgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwODtcbnZhciBVbnNpZ25lZEJ5dGVUeXBlID0gMTAwOTtcbnZhciBCeXRlVHlwZSA9IDEwMTA7XG52YXIgU2hvcnRUeXBlID0gMTAxMTtcbnZhciBVbnNpZ25lZFNob3J0VHlwZSA9IDEwMTI7XG52YXIgSW50VHlwZSA9IDEwMTM7XG52YXIgVW5zaWduZWRJbnRUeXBlID0gMTAxNDtcbnZhciBGbG9hdFR5cGUgPSAxMDE1O1xudmFyIEhhbGZGbG9hdFR5cGUgPSAxMDE2O1xudmFyIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTc7XG52YXIgVW5zaWduZWRTaG9ydDU1NTFUeXBlID0gMTAxODtcbnZhciBVbnNpZ25lZFNob3J0NTY1VHlwZSA9IDEwMTk7XG52YXIgVW5zaWduZWRJbnQyNDhUeXBlID0gMTAyMDtcbnZhciBBbHBoYUZvcm1hdCA9IDEwMjE7XG52YXIgUkdCRm9ybWF0ID0gMTAyMjtcbnZhciBSR0JBRm9ybWF0ID0gMTAyMztcbnZhciBMdW1pbmFuY2VGb3JtYXQgPSAxMDI0O1xudmFyIEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTtcbnZhciBSR0JFRm9ybWF0ID0gUkdCQUZvcm1hdDtcbnZhciBEZXB0aEZvcm1hdCA9IDEwMjY7XG52YXIgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNztcbnZhciBSR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IDIwMDE7XG52YXIgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMjAwMjtcbnZhciBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAyMDAzO1xudmFyIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCA9IDIwMDQ7XG52YXIgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAyMTAwO1xudmFyIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMjEwMTtcbnZhciBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAyMTAyO1xudmFyIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDIxMDM7XG52YXIgUkdCX0VUQzFfRm9ybWF0ID0gMjE1MTtcbnZhciBMb29wT25jZSA9IDIyMDA7XG52YXIgTG9vcFJlcGVhdCA9IDIyMDE7XG52YXIgTG9vcFBpbmdQb25nID0gMjIwMjtcbnZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbnZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XG52YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xudmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xudmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XG52YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XG52YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xudmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG52YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XG52YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xudmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7XG52YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7XG52YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbnZhciBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG52YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7XG52YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xudmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7XG52YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xudmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfTWF0aCA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5icm9vZmEuY29tL1Rvb2xzL01hdGgudXVpZC5odG1cblxuXHRcdHZhciBjaGFycyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicuc3BsaXQoICcnICk7XG5cdFx0dmFyIHV1aWQgPSBuZXcgQXJyYXkoIDM2ICk7XG5cdFx0dmFyIHJuZCA9IDAsIHI7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAzNjsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGkgPT09IDggfHwgaSA9PT0gMTMgfHwgaSA9PT0gMTggfHwgaSA9PT0gMjMgKSB7XG5cblx0XHRcdFx0XHR1dWlkWyBpIF0gPSAnLSc7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggaSA9PT0gMTQgKSB7XG5cblx0XHRcdFx0XHR1dWlkWyBpIF0gPSAnNCc7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggcm5kIDw9IDB4MDIgKSBybmQgPSAweDIwMDAwMDAgKyAoIE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgKSB8IDA7XG5cdFx0XHRcdFx0ciA9IHJuZCAmIDB4Zjtcblx0XHRcdFx0XHRybmQgPSBybmQgPj4gNDtcblx0XHRcdFx0XHR1dWlkWyBpIF0gPSBjaGFyc1sgKCBpID09PSAxOSApID8gKCByICYgMHgzICkgfCAweDggOiByIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1dWlkLmpvaW4oICcnICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCB2YWx1ZSwgbWluLCBtYXggKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgdmFsdWUgKSApO1xuXG5cdH0sXG5cblx0Ly8gY29tcHV0ZSBldWNsaWRpYW4gbW9kdWxvIG9mIG0gJSBuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vZHVsb19vcGVyYXRpb25cblxuXHRldWNsaWRlYW5Nb2R1bG86IGZ1bmN0aW9uICggbiwgbSApIHtcblxuXHRcdHJldHVybiAoICggbiAlIG0gKSArIG0gKSAlIG07XG5cblx0fSxcblxuXHQvLyBMaW5lYXIgbWFwcGluZyBmcm9tIHJhbmdlIDxhMSwgYTI+IHRvIHJhbmdlIDxiMSwgYjI+XG5cblx0bWFwTGluZWFyOiBmdW5jdGlvbiAoIHgsIGExLCBhMiwgYjEsIGIyICkge1xuXG5cdFx0cmV0dXJuIGIxICsgKCB4IC0gYTEgKSAqICggYjIgLSBiMSApIC8gKCBhMiAtIGExICk7XG5cblx0fSxcblxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfaW50ZXJwb2xhdGlvblxuXG5cdGxlcnA6IGZ1bmN0aW9uICggeCwgeSwgdCApIHtcblxuXHRcdHJldHVybiAoIDEgLSB0ICkgKiB4ICsgdCAqIHk7XG5cblx0fSxcblxuXHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXBcblxuXHRzbW9vdGhzdGVwOiBmdW5jdGlvbiAoIHgsIG1pbiwgbWF4ICkge1xuXG5cdFx0aWYgKCB4IDw9IG1pbiApIHJldHVybiAwO1xuXHRcdGlmICggeCA+PSBtYXggKSByZXR1cm4gMTtcblxuXHRcdHggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7XG5cblx0XHRyZXR1cm4geCAqIHggKiAoIDMgLSAyICogeCApO1xuXG5cdH0sXG5cblx0c21vb3RoZXJzdGVwOiBmdW5jdGlvbiAoIHgsIG1pbiwgbWF4ICkge1xuXG5cdFx0aWYgKCB4IDw9IG1pbiApIHJldHVybiAwO1xuXHRcdGlmICggeCA+PSBtYXggKSByZXR1cm4gMTtcblxuXHRcdHggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7XG5cblx0XHRyZXR1cm4geCAqIHggKiB4ICogKCB4ICogKCB4ICogNiAtIDE1ICkgKyAxMCApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGludGVnZXIgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbFxuXG5cdHJhbmRJbnQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKyAxICkgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEZsb2F0OiBmdW5jdGlvbiAoIGxvdywgaGlnaCApIHtcblxuXHRcdHJldHVybiBsb3cgKyBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gZmxvYXQgZnJvbSA8LXJhbmdlLzIsIHJhbmdlLzI+IGludGVydmFsXG5cblx0cmFuZEZsb2F0U3ByZWFkOiBmdW5jdGlvbiAoIHJhbmdlICkge1xuXG5cdFx0cmV0dXJuIHJhbmdlICogKCAwLjUgLSBNYXRoLnJhbmRvbSgpICk7XG5cblx0fSxcblxuXHRkZWdUb1JhZDogZnVuY3Rpb24gKCBkZWdyZWVzICkge1xuXG5cdFx0cmV0dXJuIGRlZ3JlZXMgKiBfTWF0aC5ERUcyUkFEO1xuXG5cdH0sXG5cblx0cmFkVG9EZWc6IGZ1bmN0aW9uICggcmFkaWFucyApIHtcblxuXHRcdHJldHVybiByYWRpYW5zICogX01hdGguUkFEMkRFRztcblxuXHR9LFxuXG5cdGlzUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiAoIHZhbHVlICYgKCB2YWx1ZSAtIDEgKSApID09PSAwICYmIHZhbHVlICE9PSAwO1xuXG5cdH0sXG5cblx0bmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5wb3coIDIsIE1hdGgucm91bmQoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xuXG5cdH0sXG5cblx0bmV4dFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR2YWx1ZSAtLTtcblx0XHR2YWx1ZSB8PSB2YWx1ZSA+PiAxO1xuXHRcdHZhbHVlIHw9IHZhbHVlID4+IDI7XG5cdFx0dmFsdWUgfD0gdmFsdWUgPj4gNDtcblx0XHR2YWx1ZSB8PSB2YWx1ZSA+PiA4O1xuXHRcdHZhbHVlIHw9IHZhbHVlID4+IDE2O1xuXHRcdHZhbHVlICsrO1xuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yMiggeCwgeSApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRcIndpZHRoXCIgOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMueDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMueCA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0XCJoZWlnaHRcIiA6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy55ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBtaW4gPCBtYXgsIGlmIHRoaXMgYXNzdW1wdGlvbiBpc24ndCB0cnVlIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApIC8gbGVuZ3RoICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTtcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdGFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpc1xuXG5cdFx0dmFyIGFuZ2xlID0gTWF0aC5hdGFuMiggdGhpcy55LCB0aGlzLnggKTtcblxuXHRcdGlmICggYW5nbGUgPCAwICkgYW5nbGUgKz0gMiAqIE1hdGguUEk7XG5cblx0XHRyZXR1cm4gYW5nbGU7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55O1xuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCAvIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXG5cdFx0dmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHR2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55O1xuXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICovXG5cbnZhciB0ZXh0dXJlSWQgPSAwO1xuXG5mdW5jdGlvbiBUZXh0dXJlKCBpbWFnZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IHRleHR1cmVJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQgPyBpbWFnZSA6IFRleHR1cmUuREVGQVVMVF9JTUFHRTtcblx0dGhpcy5taXBtYXBzID0gW107XG5cblx0dGhpcy5tYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HO1xuXG5cdHRoaXMud3JhcFMgPSB3cmFwUyAhPT0gdW5kZWZpbmVkID8gd3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXHR0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCA/IGFuaXNvdHJvcHkgOiAxO1xuXG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHR0aGlzLnR5cGUgPSB0eXBlICE9PSB1bmRlZmluZWQgPyB0eXBlIDogVW5zaWduZWRCeXRlVHlwZTtcblxuXHR0aGlzLm9mZnNldCA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XG5cdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0O1x0Ly8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpXG5cblx0Ly8gVmFsdWVzIG9mIGVuY29kaW5nICE9PSBUSFJFRS5MaW5lYXJFbmNvZGluZyBvbmx5IHN1cHBvcnRlZCBvbiBtYXAsIGVudk1hcCBhbmQgZW1pc3NpdmVNYXAuXG5cdC8vXG5cdC8vIEFsc28gY2hhbmdpbmcgdGhlIGVuY29kaW5nIGFmdGVyIGFscmVhZHkgdXNlZCBieSBhIE1hdGVyaWFsIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUgTWF0ZXJpYWxcblx0Ly8gdXBkYXRlLiAgWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHR0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggVGV4dHVyZS5wcm90b3R5cGUsIFwibmVlZHNVcGRhdGVcIiwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRleHR1cmUucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmUsXG5cblx0aXNUZXh0dXJlOiB0cnVlLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHNvdXJjZS5pbWFnZTtcblx0XHR0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7XG5cblx0XHR0aGlzLndyYXBTID0gc291cmNlLndyYXBTO1xuXHRcdHRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBzb3VyY2UubWluRmlsdGVyO1xuXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0aWYgKCBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXREYXRhVVJMKCBpbWFnZSApIHtcblxuXHRcdFx0dmFyIGNhbnZhcztcblxuXHRcdFx0aWYgKCBpbWFnZS50b0RhdGFVUkwgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjYW52YXMgPSBpbWFnZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRcdFx0Y2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG5cdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG5cblx0XHRcdFx0Y2FudmFzLmdldENvbnRleHQoICcyZCcgKS5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjYW52YXMud2lkdGggPiAyMDQ4IHx8IGNhbnZhcy5oZWlnaHQgPiAyMDQ4ICkge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgb3V0cHV0ID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnVGV4dHVyZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJ1xuXHRcdFx0fSxcblxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXG5cdFx0XHRtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG5cblx0XHRcdHJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sXG5cdFx0XHRvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLFxuXHRcdFx0d3JhcDogWyB0aGlzLndyYXBTLCB0aGlzLndyYXBUIF0sXG5cblx0XHRcdG1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMubWFnRmlsdGVyLFxuXHRcdFx0YW5pc290cm9weTogdGhpcy5hbmlzb3Ryb3B5LFxuXG5cdFx0XHRmbGlwWTogdGhpcy5mbGlwWVxuXHRcdH07XG5cblx0XHRpZiAoIHRoaXMuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gVE9ETzogTW92ZSB0byBUSFJFRS5JbWFnZVxuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0aGlzLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlLnV1aWQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpbWFnZS51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSFxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSB7XG5cdFx0XHRcdFx0dXVpZDogaW1hZ2UudXVpZCxcblx0XHRcdFx0XHR1cmw6IGdldERhdGFVUkwoIGltYWdlIClcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvdXRwdXQuaW1hZ2UgPSBpbWFnZS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0bWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fSxcblxuXHR0cmFuc2Zvcm1VdjogZnVuY3Rpb24gKCB1diApIHtcblxuXHRcdGlmICggdGhpcy5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSByZXR1cm47XG5cblx0XHR1di5tdWx0aXBseSggdGhpcy5yZXBlYXQgKTtcblx0XHR1di5hZGQoIHRoaXMub2Zmc2V0ICk7XG5cblx0XHRpZiAoIHV2LnggPCAwIHx8IHV2LnggPiAxICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBTICkge1xuXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di54ID0gdXYueCA8IDAgPyAwIDogMTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di54ICkgJSAyICkgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSBNYXRoLmNlaWwoIHV2LnggKSAtIHV2Lng7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwVCApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueSApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mbGlwWSApIHtcblxuXHRcdFx0dXYueSA9IDEgLSB1di55O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3I0KCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cdHRoaXMudyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3IDogMTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yNDogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSB6O1xuXHRcdHRoaXMudyA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXHRcdHRoaXMueiA9IHNjYWxhcjtcblx0XHR0aGlzLncgPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggeiApIHtcblxuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggdyApIHtcblxuXHRcdHRoaXMudyA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAzOiB0aGlzLncgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0Y2FzZSAyOiByZXR1cm4gdGhpcy56O1xuXHRcdFx0Y2FzZSAzOiByZXR1cm4gdGhpcy53O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cdFx0dGhpcy53ID0gKCB2LncgIT09IHVuZGVmaW5lZCApID8gdi53IDogMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblx0XHR0aGlzLnogKz0gdi56O1xuXHRcdHRoaXMudyArPSB2Lnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHM7XG5cdFx0dGhpcy55ICs9IHM7XG5cdFx0dGhpcy56ICs9IHM7XG5cdFx0dGhpcy53ICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICsgYi56O1xuXHRcdHRoaXMudyA9IGEudyArIGIudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblx0XHR0aGlzLnogKz0gdi56ICogcztcblx0XHR0aGlzLncgKz0gdi53ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblx0XHR0aGlzLnogLT0gdi56O1xuXHRcdHRoaXMudyAtPSB2Lnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54IC09IHM7XG5cdFx0dGhpcy55IC09IHM7XG5cdFx0dGhpcy56IC09IHM7XG5cdFx0dGhpcy53IC09IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XG5cdFx0dGhpcy56ID0gYS56IC0gYi56O1xuXHRcdHRoaXMudyA9IGEudyAtIGIudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cdFx0dGhpcy53ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRoaXMudztcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICogdztcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICogdztcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSAqIHc7XG5cdFx0dGhpcy53ID0gZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKiB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvcXVhdGVybmlvblRvQW5nbGUvaW5kZXguaHRtXG5cblx0XHQvLyBxIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy53ID0gMiAqIE1hdGguYWNvcyggcS53ICk7XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyApO1xuXG5cdFx0aWYgKCBzIDwgMC4wMDAxICkge1xuXG5cdFx0XHQgdGhpcy54ID0gMTtcblx0XHRcdCB0aGlzLnkgPSAwO1xuXHRcdFx0IHRoaXMueiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQgdGhpcy54ID0gcS54IC8gcztcblx0XHRcdCB0aGlzLnkgPSBxLnkgLyBzO1xuXHRcdFx0IHRoaXMueiA9IHEueiAvIHM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvQW5nbGUvaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIGFuZ2xlLCB4LCB5LCB6LFx0XHQvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdFxuXHRcdFx0ZXBzaWxvbiA9IDAuMDEsXHRcdC8vIG1hcmdpbiB0byBhbGxvdyBmb3Igcm91bmRpbmcgZXJyb3JzXG5cdFx0XHRlcHNpbG9uMiA9IDAuMSxcdFx0Ly8gbWFyZ2luIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMCBhbmQgMTgwIGRlZ3JlZXNcblxuXHRcdFx0dGUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgLSBtMjEgKSA8IGVwc2lsb24gKSAmJlxuXHRcdCAgICAgKCBNYXRoLmFicyggbTEzIC0gbTMxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0yMyAtIG0zMiApIDwgZXBzaWxvbiApICkge1xuXG5cdFx0XHQvLyBzaW5ndWxhcml0eSBmb3VuZFxuXHRcdFx0Ly8gZmlyc3QgY2hlY2sgZm9yIGlkZW50aXR5IG1hdHJpeCB3aGljaCBtdXN0IGhhdmUgKzEgZm9yIGFsbCB0ZXJtc1xuXHRcdFx0Ly8gaW4gbGVhZGluZyBkaWFnb25hbCBhbmQgemVybyBpbiBvdGhlciB0ZXJtc1xuXG5cdFx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgKyBtMzEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTIzICsgbTMyICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBzaW5ndWxhcml0eSBpcyBpZGVudGl0eSBtYXRyaXggc28gYW5nbGUgPSAwXG5cblx0XHRcdFx0dGhpcy5zZXQoIDEsIDAsIDAsIDAgKTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpczsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXNcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBvdGhlcndpc2UgdGhpcyBzaW5ndWxhcml0eSBpcyBhbmdsZSA9IDE4MFxuXG5cdFx0XHRhbmdsZSA9IE1hdGguUEk7XG5cblx0XHRcdHZhciB4eCA9ICggbTExICsgMSApIC8gMjtcblx0XHRcdHZhciB5eSA9ICggbTIyICsgMSApIC8gMjtcblx0XHRcdHZhciB6eiA9ICggbTMzICsgMSApIC8gMjtcblx0XHRcdHZhciB4eSA9ICggbTEyICsgbTIxICkgLyA0O1xuXHRcdFx0dmFyIHh6ID0gKCBtMTMgKyBtMzEgKSAvIDQ7XG5cdFx0XHR2YXIgeXogPSAoIG0yMyArIG0zMiApIC8gNDtcblxuXHRcdFx0aWYgKCAoIHh4ID4geXkgKSAmJiAoIHh4ID4genogKSApIHtcblxuXHRcdFx0XHQvLyBtMTEgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeHggPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDA7XG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eCA9IE1hdGguc3FydCggeHggKTtcblx0XHRcdFx0XHR5ID0geHkgLyB4O1xuXHRcdFx0XHRcdHogPSB4eiAvIHg7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCB5eSA+IHp6ICkge1xuXG5cdFx0XHRcdC8vIG0yMiBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXG5cblx0XHRcdFx0aWYgKCB5eSA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eSA9IDA7XG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR5ID0gTWF0aC5zcXJ0KCB5eSApO1xuXHRcdFx0XHRcdHggPSB4eSAvIHk7XG5cdFx0XHRcdFx0eiA9IHl6IC8geTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbTMzIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0gc28gYmFzZSByZXN1bHQgb24gdGhpc1xuXG5cdFx0XHRcdGlmICggenogPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eiA9IE1hdGguc3FydCggenogKTtcblx0XHRcdFx0XHR4ID0geHogLyB6O1xuXHRcdFx0XHRcdHkgPSB5eiAvIHo7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0KCB4LCB5LCB6LCBhbmdsZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpczsgLy8gcmV0dXJuIDE4MCBkZWcgcm90YXRpb25cblxuXHRcdH1cblxuXHRcdC8vIGFzIHdlIGhhdmUgcmVhY2hlZCBoZXJlIHRoZXJlIGFyZSBubyBzaW5ndWxhcml0aWVzIHNvIHdlIGNhbiBoYW5kbGUgbm9ybWFsbHlcblxuXHRcdHZhciBzID0gTWF0aC5zcXJ0KCAoIG0zMiAtIG0yMyApICogKCBtMzIgLSBtMjMgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTEzIC0gbTMxICkgKiAoIG0xMyAtIG0zMSApICtcblx0XHQgICAgICAgICAgICAgICAgICAgKCBtMjEgLSBtMTIgKSAqICggbTIxIC0gbTEyICkgKTsgLy8gdXNlZCB0byBub3JtYWxpemVcblxuXHRcdGlmICggTWF0aC5hYnMoIHMgKSA8IDAuMDAxICkgcyA9IDE7XG5cblx0XHQvLyBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLCBzaG91bGQgbm90IGhhcHBlbiBpZiBtYXRyaXggaXMgb3J0aG9nb25hbCBhbmQgc2hvdWxkIGJlXG5cdFx0Ly8gY2F1Z2h0IGJ5IHNpbmd1bGFyaXR5IHRlc3QgYWJvdmUsIGJ1dCBJJ3ZlIGxlZnQgaXQgaW4ganVzdCBpbiBjYXNlXG5cblx0XHR0aGlzLnggPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHR0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHR0aGlzLnogPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHR0aGlzLncgPSBNYXRoLmFjb3MoICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWluKCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBtaW4gPCBtYXgsIGlmIHRoaXMgYXNzdW1wdGlvbiBpc24ndCB0cnVlIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggbWluLncsIE1hdGgubWluKCBtYXgudywgdGhpcy53ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yNCgpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9ICggdGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXHRcdHRoaXMudyA9IC0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53ICk7XG5cblx0fSxcblxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggLyB0aGlzLmxlbmd0aCgpICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cdFx0dGhpcy53ICs9ICggdi53IC0gdGhpcy53ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgJiYgKCB2LncgPT09IHRoaXMudyApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblx0XHR0aGlzLncgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cdFx0dGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBNYXJpdXMgS2ludGVsIC8gaHR0cHM6Ly9naXRodWIuY29tL2tpbnRlbFxuICovXG5cbi8qXG4gSW4gb3B0aW9ucywgd2UgY2FuIHNwZWNpZnk6XG4gKiBUZXh0dXJlIHBhcmFtZXRlcnMgZm9yIGFuIGF1dG8tZ2VuZXJhdGVkIHRhcmdldCB0ZXh0dXJlXG4gKiBkZXB0aEJ1ZmZlci9zdGVuY2lsQnVmZmVyOiBCb29sZWFucyB0byBpbmRpY2F0ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlc2UgYnVmZmVyc1xuKi9cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMud2lkdGggPSB3aWR0aDtcblx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0dGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0dGhpcy5zY2lzc29yVGVzdCA9IGZhbHNlO1xuXG5cdHRoaXMudmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdGlmICggb3B0aW9ucy5taW5GaWx0ZXIgPT09IHVuZGVmaW5lZCApIG9wdGlvbnMubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTtcblxuXHR0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogdHJ1ZTtcblx0dGhpcy5kZXB0aFRleHR1cmUgPSBvcHRpb25zLmRlcHRoVGV4dHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGlzV2ViR0xSZW5kZXJUYXJnZXQ6IHRydWUsXG5cblx0c2V0U2l6ZTogZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB0aGlzLndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLmhlaWdodCAhPT0gaGVpZ2h0ICkge1xuXG5cdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHRcdFx0dGhpcy5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXdwb3J0LnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHRoaXMuc2Npc3Nvci5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7XG5cdFx0dGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xuXG5cdFx0dGhpcy52aWV3cG9ydC5jb3B5KCBzb3VyY2Uudmlld3BvcnQgKTtcblxuXHRcdHRoaXMudGV4dHVyZSA9IHNvdXJjZS50ZXh0dXJlLmNsb25lKCk7XG5cblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyO1xuXHRcdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5zdGVuY2lsQnVmZmVyO1xuXHRcdHRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbVxuICovXG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHRXZWJHTFJlbmRlclRhcmdldC5jYWxsKCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XG5cblx0dGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7IC8vIFBYIDAsIE5YIDEsIFBZIDIsIE5ZIDMsIFBaIDQsIE5aIDVcblx0dGhpcy5hY3RpdmVNaXBNYXBMZXZlbCA9IDA7XG5cbn1cblxuV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSApO1xuV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTtcblxuV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHtcblxuXHRcdGlmICggKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgeCA9IGV1bGVyLl94LCB5ID0gZXVsZXIuX3ksIHogPSBldWxlci5feiwgb3JkZXIgPSBldWxlci5vcmRlcjtcblxuXHRcdC8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS9cblx0XHQvLyBcdDIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzL1xuXHRcdC8vXHRjb250ZW50L1NwaW5DYWxjLm1cblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcztcblx0XHR2YXIgc2luID0gTWF0aC5zaW47XG5cblx0XHR2YXIgYzEgPSBjb3MoIHggLyAyICk7XG5cdFx0dmFyIGMyID0gY29zKCB5IC8gMiApO1xuXHRcdHZhciBjMyA9IGNvcyggeiAvIDIgKTtcblxuXHRcdHZhciBzMSA9IHNpbiggeCAvIDIgKTtcblx0XHR2YXIgczIgPSBzaW4oIHkgLyAyICk7XG5cdFx0dmFyIHMzID0gc2luKCB6IC8gMiApO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9hbmdsZVRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXG5cblx0XHR2YXIgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXSxcblxuXHRcdFx0dHJhY2UgPSBtMTEgKyBtMjIgKyBtMzMsXG5cdFx0XHRzO1xuXG5cdFx0aWYgKCB0cmFjZSA+IDAgKSB7XG5cblx0XHRcdHMgPSAwLjUgLyBNYXRoLnNxcnQoIHRyYWNlICsgMS4wICk7XG5cblx0XHRcdHRoaXMuX3cgPSAwLjI1IC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0zMiAtIG0yMyApICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMyAtIG0zMSApICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMSAtIG0xMiApICogcztcblxuXHRcdH0gZWxzZSBpZiAoIG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMgKSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0xMSAtIG0yMiAtIG0zMyApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gMC4yNSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTIgKyBtMjEgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMjIgPiBtMzMgKSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0yMiAtIG0xMSAtIG0zMyApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTIgKyBtMjEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gMC4yNSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMzMgLSBtMTEgLSBtMjIgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTIxIC0gbTEyICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEzICsgbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTIzICsgbTMyICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9IDAuMjUgKiBzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Vbml0VmVjdG9yczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciByO1xuXG5cdFx0dmFyIEVQUyA9IDAuMDAwMDAxO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Vbml0VmVjdG9ycyggdkZyb20sIHZUbyApIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRyID0gdkZyb20uZG90KCB2VG8gKSArIDE7XG5cblx0XHRcdGlmICggciA8IEVQUyApIHtcblxuXHRcdFx0XHRyID0gMDtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkge1xuXG5cdFx0XHRcdFx0djEuc2V0KCAtIHZGcm9tLnksIHZGcm9tLngsIDAgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0djEuc2V0KCAwLCAtIHZGcm9tLnosIHZGcm9tLnkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0djEuY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5feCA9IHYxLng7XG5cdFx0XHR0aGlzLl95ID0gdjEueTtcblx0XHRcdHRoaXMuX3ogPSB2MS56O1xuXHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW52ZXJzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29uanVnYXRlKCkubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRjb25qdWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX3ggKj0gLSAxO1xuXHRcdHRoaXMuX3kgKj0gLSAxO1xuXHRcdHRoaXMuX3ogKj0gLSAxO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGwgPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCBsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHR0aGlzLl93ID0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGwgPSAxIC8gbDtcblxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHEsIHAgKSB7XG5cblx0XHRpZiAoIHAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggdGhpcywgcSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5UXVhdGVybmlvbnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bVxuXG5cdFx0dmFyIHFheCA9IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7XG5cdFx0dmFyIHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFiLCB0ICkge1xuXG5cdFx0aWYgKCB0ID09PSAwICkgcmV0dXJuIHRoaXM7XG5cdFx0aWYgKCB0ID09PSAxICkgcmV0dXJuIHRoaXMuY29weSggcWIgKTtcblxuXHRcdHZhciB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdztcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXG5cblx0XHR2YXIgY29zSGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96O1xuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPCAwICkge1xuXG5cdFx0XHR0aGlzLl93ID0gLSBxYi5fdztcblx0XHRcdHRoaXMuX3ggPSAtIHFiLl94O1xuXHRcdFx0dGhpcy5feSA9IC0gcWIuX3k7XG5cdFx0XHR0aGlzLl96ID0gLSBxYi5fejtcblxuXHRcdFx0Y29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA+PSAxLjAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB3O1xuXHRcdFx0dGhpcy5feCA9IHg7XG5cdFx0XHR0aGlzLl95ID0geTtcblx0XHRcdHRoaXMuX3ogPSB6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YSApO1xuXG5cdFx0aWYgKCBNYXRoLmFicyggc2luSGFsZlRoZXRhICkgPCAwLjAwMSApIHtcblxuXHRcdFx0dGhpcy5fdyA9IDAuNSAqICggdyArIHRoaXMuX3cgKTtcblx0XHRcdHRoaXMuX3ggPSAwLjUgKiAoIHggKyB0aGlzLl94ICk7XG5cdFx0XHR0aGlzLl95ID0gMC41ICogKCB5ICsgdGhpcy5feSApO1xuXHRcdFx0dGhpcy5feiA9IDAuNSAqICggeiArIHRoaXMuX3ogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaGFsZlRoZXRhID0gTWF0aC5hdGFuMiggc2luSGFsZlRoZXRhLCBjb3NIYWxmVGhldGEgKTtcblx0XHR2YXIgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLFxuXHRcdFx0cmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTtcblxuXHRcdHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTtcblx0XHR0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7XG5cblx0XHRyZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLl95ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLl96ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblx0XHR0aGlzLl93ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdG9uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciAqa2lsZSAvIGh0dHA6Ly9raWxlLnN0cmF2YWdhbnphLm9yZy9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjMoIHgsIHksIHogKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yMzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggeiApIHtcblxuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblx0XHR0aGlzLnogKz0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblx0XHR0aGlzLnogKz0gdi56ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblx0XHR0aGlzLnogLT0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5VmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXHRcdHRoaXMueiAqPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAqIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKiBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICogYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseUV1bGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlFdWxlciggZXVsZXIgKSB7XG5cblx0XHRcdGlmICggKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5QXhpc0FuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlBeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAgKiB6ICsgZVsgMTIgXTtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6ICsgZVsgMTMgXTtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXTtcblx0XHR2YXIgdyA9ICBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdyApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7XG5cblx0XHQvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvclxuXG5cdFx0dmFyIGl4ID0gIHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcblx0XHR2YXIgaXkgPSAgcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xuXHRcdHZhciBpeiA9ICBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XG5cdFx0dmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cblx0XHQvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cblx0XHR0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5O1xuXHRcdHRoaXMueSA9IGl5ICogcXcgKyBpdyAqIC0gcXkgKyBpeiAqIC0gcXggLSBpeCAqIC0gcXo7XG5cdFx0dGhpcy56ID0gaXogKiBxdyArIGl3ICogLSBxeiArIGl4ICogLSBxeSAtIGl5ICogLSBxeDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdW5wcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAgKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBtaW4gPCBtYXgsIGlmIHRoaXMgYXNzdW1wdGlvbiBpc24ndCB0cnVlIGl0IHdpbGwgbm90IG9wZXJhdGUgY29ycmVjdGx5XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSAvIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYuejtcblxuXHR9LFxuXG5cdC8vIFRPRE8gbGVuZ3RoU3F1YXJlZD9cblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMuejtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICk7XG5cblx0fSxcblxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggLyB0aGlzLmxlbmd0aCgpICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblxuXHRcdHRoaXMueCA9IHkgKiB2LnogLSB6ICogdi55O1xuXHRcdHRoaXMueSA9IHogKiB2LnggLSB4ICogdi56O1xuXHRcdHRoaXMueiA9IHggKiB2LnkgLSB5ICogdi54O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc1ZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBheCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56O1xuXHRcdHZhciBieCA9IGIueCwgYnkgPSBiLnksIGJ6ID0gYi56O1xuXG5cdFx0dGhpcy54ID0gYXkgKiBieiAtIGF6ICogYnk7XG5cdFx0dGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7XG5cdFx0dGhpcy56ID0gYXggKiBieSAtIGF5ICogYng7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHByb2plY3RPblZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHR2YXIgc2NhbGFyID0gdmVjdG9yLmRvdCggdGhpcyApIC8gdmVjdG9yLmxlbmd0aFNxKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb3B5KCB2ZWN0b3IgKS5tdWx0aXBseVNjYWxhciggc2NhbGFyICk7XG5cblx0fSxcblxuXHRwcm9qZWN0T25QbGFuZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwcm9qZWN0T25QbGFuZSggcGxhbmVOb3JtYWwgKSB7XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJlZmxlY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJlZmxlY3QgaW5jaWRlbnQgdmVjdG9yIG9mZiBwbGFuZSBvcnRob2dvbmFsIHRvIG5vcm1hbFxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVmbGVjdCggbm9ybWFsICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zdWIoIHYxLmNvcHkoIG5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAyICogdGhpcy5kb3QoIG5vcm1hbCApICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFuZ2xlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciB0aGV0YSA9IHRoaXMuZG90KCB2ICkgLyAoIE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICkgKTtcblxuXHRcdC8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1zXG5cblx0XHRyZXR1cm4gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGhldGEsIC0gMSwgMSApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55LCBkeiA9IHRoaXMueiAtIHYuejtcblxuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHo7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApICsgTWF0aC5hYnMoIHRoaXMueiAtIHYueiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbVNwaGVyaWNhbDogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHNpblBoaVJhZGl1cyA9IE1hdGguc2luKCBzLnBoaSApICogcy5yYWRpdXM7XG5cblx0XHR0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbiggcy50aGV0YSApO1xuXHRcdHRoaXMueSA9IE1hdGguY29zKCBzLnBoaSApICogcy5yYWRpdXM7XG5cdFx0dGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0aC5jb3MoIHMudGhldGEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7XG5cblx0XHR0aGlzLnggPSBjLnJhZGl1cyAqIE1hdGguc2luKCBjLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gYy55O1xuXHRcdHRoaXMueiA9IGMucmFkaXVzICogTWF0aC5jb3MoIGMudGhldGEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAzICk7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdHZhciBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdHZhciBzeiA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0dGhpcy54ID0gc3g7XG5cdFx0dGhpcy55ID0gc3k7XG5cdFx0dGhpcy56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7XG5cblxuXHRcdHJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiA0ICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb21cbiAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWRcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4NCgpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCwgMCxcblx0XHQwLCAxLCAwLCAwLFxuXHRcdDAsIDAsIDEsIDAsXG5cdFx0MCwgMCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlQmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxuXHRcdFx0MCwgICAgICAgMCwgICAgICAgMCwgICAgICAgMVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcblxuXHRcdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZO1xuXG5cdFx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHRcdHRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRpZiAoICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHggPSBldWxlci54LCB5ID0gZXVsZXIueSwgeiA9IGV1bGVyLno7XG5cdFx0dmFyIGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTtcblx0XHR2YXIgYyA9IE1hdGguY29zKCB5ICksIGQgPSBNYXRoLnNpbiggeSApO1xuXHRcdHZhciBlID0gTWF0aC5jb3MoIHogKSwgZiA9IE1hdGguc2luKCB6ICk7XG5cblx0XHRpZiAoIGV1bGVyLm9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhZiArIGJlICogZDtcblx0XHRcdHRlWyA1IF0gPSBhZSAtIGJmICogZDtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmYgLSBhZSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYmUgKyBhZiAqIGQ7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGNlICsgZGYgKiBiO1xuXHRcdFx0dGVbIDQgXSA9IGRlICogYiAtIGNmO1xuXHRcdFx0dGVbIDggXSA9IGEgKiBkO1xuXG5cdFx0XHR0ZVsgMSBdID0gYSAqIGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gY2YgKiBiIC0gZGU7XG5cdFx0XHR0ZVsgNiBdID0gZGYgKyBjZSAqIGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGNlIC0gZGYgKiBiO1xuXHRcdFx0dGVbIDQgXSA9IC0gYSAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZGUgKyBjZiAqIGI7XG5cblx0XHRcdHRlWyAxIF0gPSBjZiArIGRlICogYjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSBkZiAtIGNlICogYjtcblxuXHRcdFx0dGVbIDIgXSA9IC0gYSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmUgKiBkIC0gYWY7XG5cdFx0XHR0ZVsgOCBdID0gYWUgKiBkICsgYmY7XG5cblx0XHRcdHRlWyAxIF0gPSBjICogZjtcblx0XHRcdHRlWyA1IF0gPSBiZiAqIGQgKyBhZTtcblx0XHRcdHRlWyA5IF0gPSBhZiAqIGQgLSBiZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZDtcblx0XHRcdHRlWyA2IF0gPSBiICogYztcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmQgLSBhYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gYmMgKiBmICsgYWQ7XG5cblx0XHRcdHRlWyAxIF0gPSBmO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGU7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGQgKiBlO1xuXHRcdFx0dGVbIDYgXSA9IGFkICogZiArIGJjO1xuXHRcdFx0dGVbIDEwIF0gPSBhYyAtIGJkICogZjtcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGY7XG5cdFx0XHR0ZVsgOCBdID0gZCAqIGU7XG5cblx0XHRcdHRlWyAxIF0gPSBhYyAqIGYgKyBiZDtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSBhZCAqIGYgLSBiYztcblxuXHRcdFx0dGVbIDIgXSA9IGJjICogZiAtIGFkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBlO1xuXHRcdFx0dGVbIDEwIF0gPSBiZCAqIGYgKyBhYztcblxuXHRcdH1cblxuXHRcdC8vIGxhc3QgY29sdW1uXG5cdFx0dGVbIDMgXSA9IDA7XG5cdFx0dGVbIDcgXSA9IDA7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0Ly8gYm90dG9tIHJvd1xuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IHEuX3gsIHkgPSBxLl95LCB6ID0gcS5feiwgdyA9IHEuX3c7XG5cdFx0dmFyIHgyID0geCArIHgsIHkyID0geSArIHksIHoyID0geiArIHo7XG5cdFx0dmFyIHh4ID0geCAqIHgyLCB4eSA9IHggKiB5MiwgeHogPSB4ICogejI7XG5cdFx0dmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7XG5cdFx0dmFyIHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XG5cblx0XHR0ZVsgMCBdID0gMSAtICggeXkgKyB6eiApO1xuXHRcdHRlWyA0IF0gPSB4eSAtIHd6O1xuXHRcdHRlWyA4IF0gPSB4eiArIHd5O1xuXG5cdFx0dGVbIDEgXSA9IHh5ICsgd3o7XG5cdFx0dGVbIDUgXSA9IDEgLSAoIHh4ICsgenogKTtcblx0XHR0ZVsgOSBdID0geXogLSB3eDtcblxuXHRcdHRlWyAyIF0gPSB4eiAtIHd5O1xuXHRcdHRlWyA2IF0gPSB5eiArIHd4O1xuXHRcdHRlWyAxMCBdID0gMSAtICggeHggKyB5eSApO1xuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHogPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggZXllLCB0YXJnZXQsIHVwICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0XHR6LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7XG5cblx0XHRcdGlmICggei5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvblxuXG5cdFx0XHRcdHoueiA9IDE7XG5cblx0XHRcdH1cblxuXHRcdFx0ei5ub3JtYWxpemUoKTtcblx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHRpZiAoIHgubGVuZ3RoU3EoKSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBleWUgYW5kIHRhcmdldCBhcmUgaW4gdGhlIHNhbWUgdmVydGljYWxcblxuXHRcdFx0XHR6LnogKz0gMC4wMDAxO1xuXHRcdFx0XHR4LmNyb3NzVmVjdG9ycyggdXAsIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR4Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eS5jcm9zc1ZlY3RvcnMoIHosIHggKTtcblxuXHRcdFx0dGVbIDAgXSA9IHgueDsgdGVbIDQgXSA9IHkueDsgdGVbIDggXSA9IHoueDtcblx0XHRcdHRlWyAxIF0gPSB4Lnk7IHRlWyA1IF0gPSB5Lnk7IHRlWyA5IF0gPSB6Lnk7XG5cdFx0XHR0ZVsgMiBdID0geC56OyB0ZVsgNiBdID0geS56OyB0ZVsgMTAgXSA9IHouejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtLCBuICkge1xuXG5cdFx0aWYgKCBuICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIG4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdHZhciBiZSA9IGIuZWxlbWVudHM7XG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgNCBdLCBhMTMgPSBhZVsgOCBdLCBhMTQgPSBhZVsgMTIgXTtcblx0XHR2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDUgXSwgYTIzID0gYWVbIDkgXSwgYTI0ID0gYWVbIDEzIF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA2IF0sIGEzMyA9IGFlWyAxMCBdLCBhMzQgPSBhZVsgMTQgXTtcblx0XHR2YXIgYTQxID0gYWVbIDMgXSwgYTQyID0gYWVbIDcgXSwgYTQzID0gYWVbIDExIF0sIGE0NCA9IGFlWyAxNSBdO1xuXG5cdFx0dmFyIGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyA0IF0sIGIxMyA9IGJlWyA4IF0sIGIxNCA9IGJlWyAxMiBdO1xuXHRcdHZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsgMTMgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDYgXSwgYjMzID0gYmVbIDEwIF0sIGIzNCA9IGJlWyAxNCBdO1xuXHRcdHZhciBiNDEgPSBiZVsgMyBdLCBiNDIgPSBiZVsgNyBdLCBiNDMgPSBiZVsgMTEgXSwgYjQ0ID0gYmVbIDE1IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxICsgYTE0ICogYjQxO1xuXHRcdHRlWyA0IF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzIgKyBhMTQgKiBiNDI7XG5cdFx0dGVbIDggXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMyArIGExNCAqIGI0Mztcblx0XHR0ZVsgMTIgXSA9IGExMSAqIGIxNCArIGExMiAqIGIyNCArIGExMyAqIGIzNCArIGExNCAqIGI0NDtcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzEgKyBhMjQgKiBiNDE7XG5cdFx0dGVbIDUgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0Mjtcblx0XHR0ZVsgOSBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzICsgYTI0ICogYjQzO1xuXHRcdHRlWyAxMyBdID0gYTIxICogYjE0ICsgYTIyICogYjI0ICsgYTIzICogYjM0ICsgYTI0ICogYjQ0O1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMSArIGEzNCAqIGI0MTtcblx0XHR0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyICsgYTM0ICogYjQyO1xuXHRcdHRlWyAxMCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzICsgYTM0ICogYjQzO1xuXHRcdHRlWyAxNCBdID0gYTMxICogYjE0ICsgYTMyICogYjI0ICsgYTMzICogYjM0ICsgYTM0ICogYjQ0O1xuXG5cdFx0dGVbIDMgXSA9IGE0MSAqIGIxMSArIGE0MiAqIGIyMSArIGE0MyAqIGIzMSArIGE0NCAqIGI0MTtcblx0XHR0ZVsgNyBdID0gYTQxICogYjEyICsgYTQyICogYjIyICsgYTQzICogYjMyICsgYTQ0ICogYjQyO1xuXHRcdHRlWyAxMSBdID0gYTQxICogYjEzICsgYTQyICogYjIzICsgYTQzICogYjMzICsgYTQ0ICogYjQzO1xuXHRcdHRlWyAxNSBdID0gYTQxICogYjE0ICsgYTQyICogYjI0ICsgYTQzICogYjM0ICsgYTQ0ICogYjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgOCBdICo9IHM7IHRlWyAxMiBdICo9IHM7XG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA5IF0gKj0gczsgdGVbIDEzIF0gKj0gcztcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA2IF0gKj0gczsgdGVbIDEwIF0gKj0gczsgdGVbIDE0IF0gKj0gcztcblx0XHR0ZVsgMyBdICo9IHM7IHRlWyA3IF0gKj0gczsgdGVbIDExIF0gKj0gczsgdGVbIDE1IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0djEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHRcdHYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0XHR2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0XHR2MS5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRlWyA0IF0sIG4xMyA9IHRlWyA4IF0sIG4xNCA9IHRlWyAxMiBdO1xuXHRcdHZhciBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTtcblx0XHR2YXIgbjMxID0gdGVbIDIgXSwgbjMyID0gdGVbIDYgXSwgbjMzID0gdGVbIDEwIF0sIG4zNCA9IHRlWyAxNCBdO1xuXHRcdHZhciBuNDEgPSB0ZVsgMyBdLCBuNDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07XG5cblx0XHQvL1RPRE86IG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudFxuXHRcdC8vKCBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG0gKVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdG40MSAqIChcblx0XHRcdFx0KyBuMTQgKiBuMjMgKiBuMzJcblx0XHRcdFx0IC0gbjEzICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xNCAqIG4yMiAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xMiAqIG4yMyAqIG4zNFxuXHRcdFx0KSArXG5cdFx0XHRuNDIgKiAoXG5cdFx0XHRcdCsgbjExICogbjIzICogbjM0XG5cdFx0XHRcdCAtIG4xMSAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTQgKiBuMjEgKiBuMzNcblx0XHRcdFx0IC0gbjEzICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xMyAqIG4yNCAqIG4zMVxuXHRcdFx0XHQgLSBuMTQgKiBuMjMgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQzICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTEgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjE0ICogbjIxICogbjMyXG5cdFx0XHRcdCArIG4xMiAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTQgKiBuMjIgKiBuMzFcblx0XHRcdFx0IC0gbjEyICogbjI0ICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40NCAqIChcblx0XHRcdFx0LSBuMTMgKiBuMjIgKiBuMzFcblx0XHRcdFx0IC0gbjExICogbjIzICogbjMyXG5cdFx0XHRcdCArIG4xMSAqIG4yMiAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjEgKiBuMzJcblx0XHRcdFx0IC0gbjEyICogbjIxICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yMyAqIG4zMVxuXHRcdFx0KVxuXG5cdFx0KTtcblxuXHR9LFxuXG5cdHRyYW5zcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgdG1wO1xuXG5cdFx0dG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDExIF07IHRlWyAxMSBdID0gdGVbIDE0IF07IHRlWyAxNCBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQb3NpdGlvbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gdi54O1xuXHRcdHRlWyAxMyBdID0gdi55O1xuXHRcdHRlWyAxNCBdID0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRJbnZlcnNlOiBmdW5jdGlvbiAoIG0sIHRocm93T25EZWdlbmVyYXRlICkge1xuXG5cdFx0Ly8gYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cyxcblx0XHRcdG1lID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMxID0gbWVbIDIgXSwgbjQxID0gbWVbIDMgXSxcblx0XHRcdG4xMiA9IG1lWyA0IF0sIG4yMiA9IG1lWyA1IF0sIG4zMiA9IG1lWyA2IF0sIG40MiA9IG1lWyA3IF0sXG5cdFx0XHRuMTMgPSBtZVsgOCBdLCBuMjMgPSBtZVsgOSBdLCBuMzMgPSBtZVsgMTAgXSwgbjQzID0gbWVbIDExIF0sXG5cdFx0XHRuMTQgPSBtZVsgMTIgXSwgbjI0ID0gbWVbIDEzIF0sIG4zNCA9IG1lWyAxNCBdLCBuNDQgPSBtZVsgMTUgXSxcblxuXHRcdFx0dDExID0gbjIzICogbjM0ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LFxuXHRcdFx0dDEyID0gbjE0ICogbjMzICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICogbjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LFxuXHRcdFx0dDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LFxuXHRcdFx0dDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0O1xuXG5cdFx0dmFyIGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMyArIG40MSAqIHQxNDtcblxuXHRcdGlmICggZGV0ID09PSAwICkge1xuXG5cdFx0XHR2YXIgbXNnID0gXCJUSFJFRS5NYXRyaXg0LmdldEludmVyc2UoKTogY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAgMCwgMCxcblx0XHRcdDAsIGMsIC0gcywgMCxcblx0XHRcdDAsIHMsICBjLCAwLFxuXHRcdFx0MCwgMCwgIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsICBjLCAwLCAwLFxuXHRcdFx0MCwgIDAsIDEsIDAsXG5cdFx0XHQwLCAgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUoIHNjYWxlICk7XG5cdFx0dGhpcy5zZXRQb3NpdGlvbiggcG9zaXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0dmFyIHN4ID0gdmVjdG9yLnNldCggdGVbIDAgXSwgdGVbIDEgXSwgdGVbIDIgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN5ID0gdmVjdG9yLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN6ID0gdmVjdG9yLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcblxuXHRcdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRcdHZhciBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XG5cblx0XHRcdHBvc2l0aW9uLnggPSB0ZVsgMTIgXTtcblx0XHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcblxuXHRcdFx0Ly8gc2NhbGUgdGhlIHJvdGF0aW9uIHBhcnRcblx0XHRcdG1hdHJpeC5jb3B5KCB0aGlzICk7XG5cblx0XHRcdHZhciBpbnZTWCA9IDEgLyBzeDtcblx0XHRcdHZhciBpbnZTWSA9IDEgLyBzeTtcblx0XHRcdHZhciBpbnZTWiA9IDEgLyBzejtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGludlNYO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNSBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOCBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7XG5cblx0XHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0c2NhbGUueCA9IHN4O1xuXHRcdFx0c2NhbGUueSA9IHN5O1xuXHRcdFx0c2NhbGUueiA9IHN6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0dmFyIGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgYiA9ICggdG9wICsgYm90dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdHZhciBkID0gLSAyICogZmFyICogbmVhciAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dGVbIDAgXSA9IHg7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSBhO1x0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IHk7XHR0ZVsgOSBdID0gYjtcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSBjO1x0dGVbIDE0IF0gPSBkO1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IC0gMTtcdHRlWyAxNSBdID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZU9ydGhvZ3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgcCA9IDEuMCAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHR2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoO1xuXHRcdHZhciB6ID0gKCBmYXIgKyBuZWFyICkgKiBwO1xuXG5cdFx0dGVbIDAgXSA9IDIgKiB3O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gMDtcdHRlWyAxMiBdID0gLSB4O1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IDIgKiBoO1x0dGVbIDkgXSA9IDA7XHR0ZVsgMTMgXSA9IC0geTtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSAtIDIgKiBwO1x0dGVbIDE0IF0gPSAtIHo7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gMDtcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDExIF0gPSB0ZVsgMTEgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZSggZGF0YSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmltYWdlID0geyBkYXRhOiBkYXRhLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxO1xuXG59XG5cbkRhdGFUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEYXRhVGV4dHVyZTtcblxuRGF0YVRleHR1cmUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmUoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdO1xuXHRtYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IEN1YmVSZWZsZWN0aW9uTWFwcGluZztcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxufVxuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ3ViZVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZVRleHR1cmU7XG5cbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlID0gdHJ1ZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdWJlVGV4dHVyZS5wcm90b3R5cGUsICdpbWFnZXMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbWFnZTtcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICogVW5pZm9ybXMgb2YgYSBwcm9ncmFtLlxuICogVGhvc2UgZm9ybSBhIHRyZWUgc3RydWN0dXJlIHdpdGggYSBzcGVjaWFsIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIHRoZSByb290LFxuICogd2hpY2ggeW91IGdldCBieSBjYWxsaW5nICduZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICknLlxuICpcbiAqXG4gKiBQcm9wZXJ0aWVzIG9mIGlubmVyIG5vZGVzIGluY2x1ZGluZyB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2VxIC0gYXJyYXkgb2YgbmVzdGVkIHVuaWZvcm1zXG4gKiAubWFwIC0gbmVzdGVkIHVuaWZvcm1zIGJ5IG5hbWVcbiAqXG4gKlxuICogTWV0aG9kcyBvZiBhbGwgbm9kZXMgZXhjZXB0IHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIHZhbHVlLCBbcmVuZGVyZXJdIClcbiAqXG4gKiBcdFx0dXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocylcbiAqICBcdHRoZSAncmVuZGVyZXInIHBhcmFtZXRlciBpcyBuZWVkZWQgZm9yIHNhbXBsZXIgdW5pZm9ybXNcbiAqXG4gKlxuICogU3RhdGljIG1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAudXBsb2FkKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtcyBpbiAnc2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZSdcbiAqXG4gKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXFcbiAqXG4gKiBcdFx0ZmlsdGVycyAnc2VxJyBlbnRyaWVzIHdpdGggY29ycmVzcG9uZGluZyBlbnRyeSBpbiB2YWx1ZXNcbiAqXG4gKlxuICogTWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIG5hbWUsIHZhbHVlIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtIHdpdGggIG5hbWUgJ25hbWUnIHRvICd2YWx1ZSdcbiAqXG4gKiAuc2V0KCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtIGZyb20gb2JqZWN0IGFuZCBwcm9wZXJ0eSB3aXRoIHNhbWUgbmFtZSB0aGFuIHVuaWZvcm1cbiAqXG4gKiAuc2V0T3B0aW9uYWwoIGdsLCBvYmosIHByb3AgKVxuICpcbiAqIFx0XHRsaWtlIC5zZXQgZm9yIGFuIG9wdGlvbmFsIHByb3BlcnR5IG9mIHRoZSBvYmplY3RcbiAqXG4gKi9cblxudmFyIGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG52YXIgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG4vLyAtLS0gQmFzZSBmb3IgaW5uZXIgbm9kZXMgKGluY2x1ZGluZyB0aGUgcm9vdCkgLS0tXG5cbmZ1bmN0aW9uIFVuaWZvcm1Db250YWluZXIoKSB7XG5cblx0dGhpcy5zZXEgPSBbXTtcblx0dGhpcy5tYXAgPSB7fTtcblxufVxuXG4vLyAtLS0gVXRpbGl0aWVzIC0tLVxuXG4vLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlzIGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSlcblxudmFyIGFycmF5Q2FjaGVGMzIgPSBbXTtcbnZhciBhcnJheUNhY2hlSTMyID0gW107XG5cbi8vIEZsb2F0MzJBcnJheSBjYWNoZXMgdXNlZCBmb3IgdXBsb2FkaW5nIE1hdHJpeCB1bmlmb3Jtc1xuXG52YXIgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTtcbnZhciBtYXQzYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCA5ICk7XG5cbi8vIEZsYXR0ZW5pbmcgZm9yIGFycmF5cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuXG5mdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgbkJsb2NrcywgYmxvY2tTaXplICkge1xuXG5cdHZhciBmaXJzdEVsZW0gPSBhcnJheVsgMCBdO1xuXG5cdGlmICggZmlyc3RFbGVtIDw9IDAgfHwgZmlyc3RFbGVtID4gMCApIHJldHVybiBhcnJheTtcblx0Ly8gdW5vcHRpbWl6ZWQ6ICEgaXNOYU4oIGZpcnN0RWxlbSApXG5cdC8vIHNlZSBodHRwOi8vamFja3NvbmR1bnN0YW4uY29tL2FydGljbGVzLzk4M1xuXG5cdHZhciBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZSxcblx0XHRyID0gYXJyYXlDYWNoZUYzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBGbG9hdDMyQXJyYXkoIG4gKTtcblx0XHRhcnJheUNhY2hlRjMyWyBuIF0gPSByO1xuXG5cdH1cblxuXHRpZiAoIG5CbG9ja3MgIT09IDAgKSB7XG5cblx0XHRmaXJzdEVsZW0udG9BcnJheSggciwgMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBvZmZzZXQgPSAwOyBpICE9PSBuQmxvY2tzOyArKyBpICkge1xuXG5cdFx0XHRvZmZzZXQgKz0gYmxvY2tTaXplO1xuXHRcdFx0YXJyYXlbIGkgXS50b0FycmF5KCByLCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gVGV4dHVyZSB1bml0IGFsbG9jYXRpb25cblxuZnVuY3Rpb24gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKSB7XG5cblx0dmFyIHIgPSBhcnJheUNhY2hlSTMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEludDMyQXJyYXkoIG4gKTtcblx0XHRhcnJheUNhY2hlSTMyWyBuIF0gPSByO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKVxuXHRcdHJbIGkgXSA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblxuXHRyZXR1cm4gcjtcblxufVxuXG4vLyAtLS0gU2V0dGVycyAtLS1cblxuLy8gTm90ZTogRGVmaW5pbmcgdGhlc2UgbWV0aG9kcyBleHRlcm5hbGx5LCBiZWNhdXNlIHRoZXkgY29tZSBpbiBhIGJ1bmNoXG4vLyBhbmQgdGhpcyB3YXkgdGhlaXIgbmFtZXMgbWluaWZ5LlxuXG4vLyBTaW5nbGUgc2NhbGFyXG5cbmZ1bmN0aW9uIHNldFZhbHVlMWYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApOyB9XG5mdW5jdGlvbiBzZXRWYWx1ZTFpKCBnbCwgdiApIHsgZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHYgKTsgfVxuXG4vLyBTaW5nbGUgZmxvYXQgdmVjdG9yIChmcm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuVmVjdG9yTilcblxuZnVuY3Rpb24gc2V0VmFsdWUyZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSBnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIHYgKTtcblx0ZWxzZSBnbC51bmlmb3JtMmYoIHRoaXMuYWRkciwgdi54LCB2LnkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApXG5cdFx0Z2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnogKTtcblx0ZWxzZSBpZiAoIHYuciAhPT0gdW5kZWZpbmVkIClcblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXHRlbHNlXG5cdFx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0ZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSBnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIHYgKTtcblx0ZWxzZSBnbC51bmlmb3JtNGYoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiwgdi53ICk7XG5cbn1cblxuLy8gU2luZ2xlIG1hdHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIE1hdHJpeE4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZtKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2LmVsZW1lbnRzIHx8IHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDNhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQ0YXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHYgfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbi8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2YgKGFsd2F5cyBmbGF0IGFycmF5cylcblxuZnVuY3Rpb24gc2V0VmFsdWUyaXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMml2KCB0aGlzLmFkZHIsIHYgKTsgfVxuZnVuY3Rpb24gc2V0VmFsdWUzaXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTsgfVxuZnVuY3Rpb24gc2V0VmFsdWU0aXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtNGl2KCB0aGlzLmFkZHIsIHYgKTsgfVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciB0aGUgc2luZ3VsYXIgY2FzZVxuXG5mdW5jdGlvbiBnZXRTaW5ndWxhclNldHRlciggdHlwZSApIHtcblxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmOyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWUyZnY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZTNmdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlNGZ2OyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZTJmbTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlM2ZtOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWU0Zm07IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogcmV0dXJuIHNldFZhbHVlVDE7IC8vIFNBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDY7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIEFycmF5IG9mIHNjYWxhcnNcblxuZnVuY3Rpb24gc2V0VmFsdWUxZnYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTsgfVxuZnVuY3Rpb24gc2V0VmFsdWUxaXYoIGdsLCB2ICkgeyBnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHYgKTsgfVxuXG4vLyBBcnJheSBvZiB2ZWN0b3JzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc3NlcylcblxuZnVuY3Rpb24gc2V0VmFsdWVWMmEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAyICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDMgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjRhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZsYXQgb3IgZnJvbSBUSFJFRSBjbGFzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlTTJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTNhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDkgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTRhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDE2ICkgKTtcblxufVxuXG4vLyBBcnJheSBvZiB0ZXh0dXJlcyAoMkQgLyBDdWJlKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQxYSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciBuID0gdi5sZW5ndGgsXG5cdFx0dW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHZbIGkgXSB8fCBlbXB0eVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUNmEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHZbIGkgXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxuXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZnY7IC8vIEZMT0FUXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZVYyYTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlVjNhOyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGE7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTJhOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM2E7IC8vIF9NQVQzXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00YTsgLy8gX01BVDRcblxuXHRcdGNhc2UgMHg4YjVlOiByZXR1cm4gc2V0VmFsdWVUMWE7IC8vIFNBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDZhOyAvLyBTQU1QTEVSX0NVQkVcblxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWl2OyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzRcblxuXHR9XG5cbn1cblxuLy8gLS0tIFVuaWZvcm0gQ2xhc3NlcyAtLS1cblxuZnVuY3Rpb24gU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuc2l6ZSA9IGFjdGl2ZUluZm8uc2l6ZTtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFB1cmVBcnJheVNldHRlciggYWN0aXZlSW5mby50eXBlICk7XG5cblx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xuXG59XG5cbmZ1bmN0aW9uIFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cblx0VW5pZm9ybUNvbnRhaW5lci5jYWxsKCB0aGlzICk7IC8vIG1peC1pblxuXG59XG5cblN0cnVjdHVyZWRVbmlmb3JtLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIHZhbHVlICkge1xuXG5cdC8vIE5vdGU6IERvbid0IG5lZWQgYW4gZXh0cmEgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIsIHNpbmNlIHNhbXBsZXJzXG5cdC8vIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJ1Y3R1cmVkIHVuaWZvcm1zLlxuXG5cdHZhciBzZXEgPSB0aGlzLnNlcTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHR1LnNldFZhbHVlKCBnbCwgdmFsdWVbIHUuaWQgXSApO1xuXG5cdH1cblxufTtcblxuLy8gLS0tIFRvcC1sZXZlbCAtLS1cblxuLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5nc1xuXG52YXIgUmVQYXRoUGFydCA9IC8oW1xcd1xcZF9dKykoXFxdKT8oXFxbfFxcLik/L2c7XG5cbi8vIGV4dHJhY3RzXG4vLyBcdC0gdGhlIGlkZW50aWZpZXIgKG1lbWJlciBuYW1lIG9yIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgcmlnaHQgYnJhY2tldCAoZm91bmQgd2hlbiBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGxlZnQgYnJhY2tldCBvciBkb3QgKHR5cGUgb2Ygc3Vic2NyaXB0KVxuLy9cbi8vIE5vdGU6IFRoZXNlIHBvcnRpb25zIGNhbiBiZSByZWFkIGluIGEgbm9uLW92ZXJsYXBwaW5nIGZhc2hpb24gYW5kXG4vLyBhbGxvdyBzdHJhaWdodGZvcndhcmQgcGFyc2luZyBvZiB0aGUgaGllcmFyY2h5IHRoYXQgV2ViR0wgZW5jb2Rlc1xuLy8gaW4gdGhlIHVuaWZvcm0gbmFtZXMuXG5cbmZ1bmN0aW9uIGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCApIHtcblxuXHRjb250YWluZXIuc2VxLnB1c2goIHVuaWZvcm1PYmplY3QgKTtcblx0Y29udGFpbmVyLm1hcFsgdW5pZm9ybU9iamVjdC5pZCBdID0gdW5pZm9ybU9iamVjdDtcblxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaWZvcm0oIGFjdGl2ZUluZm8sIGFkZHIsIGNvbnRhaW5lciApIHtcblxuXHR2YXIgcGF0aCA9IGFjdGl2ZUluZm8ubmFtZSxcblx0XHRwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cblx0Ly8gcmVzZXQgUmVnRXhwIG9iamVjdCwgYmVjYXVzZSBvZiB0aGUgZWFybHkgZXhpdCBvZiBhIHByZXZpb3VzIHJ1blxuXHRSZVBhdGhQYXJ0Lmxhc3RJbmRleCA9IDA7XG5cblx0Zm9yICggOyA7ICkge1xuXG5cdFx0dmFyIG1hdGNoID0gUmVQYXRoUGFydC5leGVjKCBwYXRoICksXG5cdFx0XHRtYXRjaEVuZCA9IFJlUGF0aFBhcnQubGFzdEluZGV4LFxuXG5cdFx0XHRpZCA9IG1hdGNoWyAxIF0sXG5cdFx0XHRpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAnXScsXG5cdFx0XHRzdWJzY3JpcHQgPSBtYXRjaFsgMyBdO1xuXG5cdFx0aWYgKCBpZElzSW5kZXggKSBpZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyXG5cblx0XHRpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHtcblxuXHRcdFx0Ly8gYmFyZSBuYW1lIG9yIFwicHVyZVwiIGJvdHRvbS1sZXZlbCBhcnJheSBcIlswXVwiIHN1ZmZpeFxuXG5cdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0XHRuZXcgU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSA6XG5cdFx0XHRcdFx0bmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTtcblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBpdCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3RcblxuXHRcdFx0dmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRwYXRoID0gaW5mby5uYW1lLFxuXHRcdFx0YWRkciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgcGF0aCApO1xuXG5cdFx0cGFyc2VVbmlmb3JtKCBpbmZvLCBhZGRyLCB0aGlzICk7XG5cblx0fVxuXG59XG5cbldlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgbmFtZSwgdmFsdWUgKSB7XG5cblx0dmFyIHUgPSB0aGlzLm1hcFsgbmFtZSBdO1xuXG5cdGlmICggdSAhPT0gdW5kZWZpbmVkICkgdS5zZXRWYWx1ZSggZ2wsIHZhbHVlLCB0aGlzLnJlbmRlcmVyICk7XG5cbn07XG5cbldlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldE9wdGlvbmFsID0gZnVuY3Rpb24gKCBnbCwgb2JqZWN0LCBuYW1lICkge1xuXG5cdHZhciB2ID0gb2JqZWN0WyBuYW1lIF07XG5cblx0aWYgKCB2ICE9PSB1bmRlZmluZWQgKSB0aGlzLnNldFZhbHVlKCBnbCwgbmFtZSwgdiApO1xuXG59O1xuXG5cbi8vIFN0YXRpYyBpbnRlcmZhY2VcblxuV2ViR0xVbmlmb3Jtcy51cGxvYWQgPSBmdW5jdGlvbiAoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKSB7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF0sXG5cdFx0XHR2ID0gdmFsdWVzWyB1LmlkIF07XG5cblx0XHRpZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcgd2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkXG5cdFx0XHR1LnNldFZhbHVlKCBnbCwgdi52YWx1ZSwgcmVuZGVyZXIgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbldlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlID0gZnVuY3Rpb24gKCBzZXEsIHZhbHVlcyApIHtcblxuXHR2YXIgciA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdO1xuXHRcdGlmICggdS5pZCBpbiB2YWx1ZXMgKSByLnB1c2goIHUgKTtcblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ29sb3JLZXl3b3JkcyA9IHsgJ2FsaWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgwMEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLFxuXHQnYmVpZ2UnOiAweEY1RjVEQywgJ2Jpc3F1ZSc6IDB4RkZFNEM0LCAnYmxhY2snOiAweDAwMDAwMCwgJ2JsYW5jaGVkYWxtb25kJzogMHhGRkVCQ0QsICdibHVlJzogMHgwMDAwRkYsICdibHVldmlvbGV0JzogMHg4QTJCRTIsXG5cdCdicm93bic6IDB4QTUyQTJBLCAnYnVybHl3b29kJzogMHhERUI4ODcsICdjYWRldGJsdWUnOiAweDVGOUVBMCwgJ2NoYXJ0cmV1c2UnOiAweDdGRkYwMCwgJ2Nob2NvbGF0ZSc6IDB4RDI2OTFFLCAnY29yYWwnOiAweEZGN0Y1MCxcblx0J2Nvcm5mbG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFuJzogMHgwMDhCOEIsXG5cdCdkYXJrZ29sZGVucm9kJzogMHhCODg2MEIsICdkYXJrZ3JheSc6IDB4QTlBOUE5LCAnZGFya2dyZWVuJzogMHgwMDY0MDAsICdkYXJrZ3JleSc6IDB4QTlBOUE5LCAnZGFya2toYWtpJzogMHhCREI3NkIsICdkYXJrbWFnZW50YSc6IDB4OEIwMDhCLFxuXHQnZGFya29saXZlZ3JlZW4nOiAweDU1NkIyRiwgJ2RhcmtvcmFuZ2UnOiAweEZGOEMwMCwgJ2RhcmtvcmNoaWQnOiAweDk5MzJDQywgJ2RhcmtyZWQnOiAweDhCMDAwMCwgJ2RhcmtzYWxtb24nOiAweEU5OTY3QSwgJ2RhcmtzZWFncmVlbic6IDB4OEZCQzhGLFxuXHQnZGFya3NsYXRlYmx1ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQwMEQzLFxuXHQnZGVlcHBpbmsnOiAweEZGMTQ5MywgJ2RlZXBza3libHVlJzogMHgwMEJGRkYsICdkaW1ncmF5JzogMHg2OTY5NjksICdkaW1ncmV5JzogMHg2OTY5NjksICdkb2RnZXJibHVlJzogMHgxRTkwRkYsICdmaXJlYnJpY2snOiAweEIyMjIyMixcblx0J2Zsb3JhbHdoaXRlJzogMHhGRkZBRjAsICdmb3Jlc3RncmVlbic6IDB4MjI4QjIyLCAnZnVjaHNpYSc6IDB4RkYwMEZGLCAnZ2FpbnNib3JvJzogMHhEQ0RDREMsICdnaG9zdHdoaXRlJzogMHhGOEY4RkYsICdnb2xkJzogMHhGRkQ3MDAsXG5cdCdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCxcblx0J2luZGlhbnJlZCc6IDB4Q0Q1QzVDLCAnaW5kaWdvJzogMHg0QjAwODIsICdpdm9yeSc6IDB4RkZGRkYwLCAna2hha2knOiAweEYwRTY4QywgJ2xhdmVuZGVyJzogMHhFNkU2RkEsICdsYXZlbmRlcmJsdXNoJzogMHhGRkYwRjUsICdsYXduZ3JlZW4nOiAweDdDRkMwMCxcblx0J2xlbW9uY2hpZmZvbic6IDB4RkZGQUNELCAnbGlnaHRibHVlJzogMHhBREQ4RTYsICdsaWdodGNvcmFsJzogMHhGMDgwODAsICdsaWdodGN5YW4nOiAweEUwRkZGRiwgJ2xpZ2h0Z29sZGVucm9keWVsbG93JzogMHhGQUZBRDIsICdsaWdodGdyYXknOiAweEQzRDNEMyxcblx0J2xpZ2h0Z3JlZW4nOiAweDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICdsaWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRza3libHVlJzogMHg4N0NFRkEsXG5cdCdsaWdodHNsYXRlZ3JheSc6IDB4Nzc4ODk5LCAnbGlnaHRzbGF0ZWdyZXknOiAweDc3ODg5OSwgJ2xpZ2h0c3RlZWxibHVlJzogMHhCMEM0REUsICdsaWdodHllbGxvdyc6IDB4RkZGRkUwLCAnbGltZSc6IDB4MDBGRjAwLCAnbGltZWdyZWVuJzogMHgzMkNEMzIsXG5cdCdsaW5lbic6IDB4RkFGMEU2LCAnbWFnZW50YSc6IDB4RkYwMEZGLCAnbWFyb29uJzogMHg4MDAwMDAsICdtZWRpdW1hcXVhbWFyaW5lJzogMHg2NkNEQUEsICdtZWRpdW1ibHVlJzogMHgwMDAwQ0QsICdtZWRpdW1vcmNoaWQnOiAweEJBNTVEMyxcblx0J21lZGl1bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNsYXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1bXR1cnF1b2lzZSc6IDB4NDhEMUNDLFxuXHQnbWVkaXVtdmlvbGV0cmVkJzogMHhDNzE1ODUsICdtaWRuaWdodGJsdWUnOiAweDE5MTk3MCwgJ21pbnRjcmVhbSc6IDB4RjVGRkZBLCAnbWlzdHlyb3NlJzogMHhGRkU0RTEsICdtb2NjYXNpbic6IDB4RkZFNEI1LCAnbmF2YWpvd2hpdGUnOiAweEZGREVBRCxcblx0J25hdnknOiAweDAwMDA4MCwgJ29sZGxhY2UnOiAweEZERjVFNiwgJ29saXZlJzogMHg4MDgwMDAsICdvbGl2ZWRyYWInOiAweDZCOEUyMywgJ29yYW5nZSc6IDB4RkZBNTAwLCAnb3JhbmdlcmVkJzogMHhGRjQ1MDAsICdvcmNoaWQnOiAweERBNzBENixcblx0J3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hpcCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksXG5cdCdwZXJ1JzogMHhDRDg1M0YsICdwaW5rJzogMHhGRkMwQ0IsICdwbHVtJzogMHhEREEwREQsICdwb3dkZXJibHVlJzogMHhCMEUwRTYsICdwdXJwbGUnOiAweDgwMDA4MCwgJ3JlZCc6IDB4RkYwMDAwLCAncm9zeWJyb3duJzogMHhCQzhGOEYsXG5cdCdyb3lhbGJsdWUnOiAweDQxNjlFMSwgJ3NhZGRsZWJyb3duJzogMHg4QjQ1MTMsICdzYWxtb24nOiAweEZBODA3MiwgJ3NhbmR5YnJvd24nOiAweEY0QTQ2MCwgJ3NlYWdyZWVuJzogMHgyRThCNTcsICdzZWFzaGVsbCc6IDB4RkZGNUVFLFxuXHQnc2llbm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwgJ3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXknOiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSxcblx0J3NwcmluZ2dyZWVuJzogMHgwMEZGN0YsICdzdGVlbGJsdWUnOiAweDQ2ODJCNCwgJ3Rhbic6IDB4RDJCNDhDLCAndGVhbCc6IDB4MDA4MDgwLCAndGhpc3RsZSc6IDB4RDhCRkQ4LCAndG9tYXRvJzogMHhGRjYzNDcsICd0dXJxdW9pc2UnOiAweDQwRTBEMCxcblx0J3Zpb2xldCc6IDB4RUU4MkVFLCAnd2hlYXQnOiAweEY1REVCMywgJ3doaXRlJzogMHhGRkZGRkYsICd3aGl0ZXNtb2tlJzogMHhGNUY1RjUsICd5ZWxsb3cnOiAweEZGRkYwMCwgJ3llbGxvd2dyZWVuJzogMHg5QUNEMzIgfTtcblxuZnVuY3Rpb24gQ29sb3IoIHIsIGcsIGIgKSB7XG5cblx0aWYgKCBnID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Ly8gciBpcyBUSFJFRS5Db2xvciwgaGV4IG9yIHN0cmluZ1xuXHRcdHJldHVybiB0aGlzLnNldCggciApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcy5zZXRSR0IoIHIsIGcsIGIgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb2xvci5wcm90b3R5cGUsIHtcblxuXHRpc0NvbG9yOiB0cnVlLFxuXG5cdHI6IDEsIGc6IDEsIGI6IDEsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHZhbHVlICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHR0aGlzLnNldEhleCggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRcdHRoaXMuc2V0U3R5bGUoIHZhbHVlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnIgPSBzY2FsYXI7XG5cdFx0dGhpcy5nID0gc2NhbGFyO1xuXHRcdHRoaXMuYiA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SGV4OiBmdW5jdGlvbiAoIGhleCApIHtcblxuXHRcdGhleCA9IE1hdGguZmxvb3IoIGhleCApO1xuXG5cdFx0dGhpcy5yID0gKCBoZXggPj4gMTYgJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmcgPSAoIGhleCA+PiA4ICYgMjU1ICkgLyAyNTU7XG5cdFx0dGhpcy5iID0gKCBoZXggJiAyNTUgKSAvIDI1NTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UkdCOiBmdW5jdGlvbiAoIHIsIGcsIGIgKSB7XG5cblx0XHR0aGlzLnIgPSByO1xuXHRcdHRoaXMuZyA9IGc7XG5cdFx0dGhpcy5iID0gYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkge1xuXG5cdFx0XHRpZiAoIHQgPCAwICkgdCArPSAxO1xuXHRcdFx0aWYgKCB0ID4gMSApIHQgLT0gMTtcblx0XHRcdGlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDtcblx0XHRcdGlmICggdCA8IDEgLyAyICkgcmV0dXJuIHE7XG5cdFx0XHRpZiAoIHQgPCAyIC8gMyApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqICggMiAvIDMgLSB0ICk7XG5cdFx0XHRyZXR1cm4gcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRIU0woIGgsIHMsIGwgKSB7XG5cblx0XHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXG5cdFx0XHRoID0gX01hdGguZXVjbGlkZWFuTW9kdWxvKCBoLCAxICk7XG5cdFx0XHRzID0gX01hdGguY2xhbXAoIHMsIDAsIDEgKTtcblx0XHRcdGwgPSBfTWF0aC5jbGFtcCggbCwgMCwgMSApO1xuXG5cdFx0XHRpZiAoIHMgPT09IDAgKSB7XG5cblx0XHRcdFx0dGhpcy5yID0gdGhpcy5nID0gdGhpcy5iID0gbDtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgcCA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gKCBsICogcyApO1xuXHRcdFx0XHR2YXIgcSA9ICggMiAqIGwgKSAtIHA7XG5cblx0XHRcdFx0dGhpcy5yID0gaHVlMnJnYiggcSwgcCwgaCArIDEgLyAzICk7XG5cdFx0XHRcdHRoaXMuZyA9IGh1ZTJyZ2IoIHEsIHAsIGggKTtcblx0XHRcdFx0dGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRTdHlsZTogZnVuY3Rpb24gKCBzdHlsZSApIHtcblxuXHRcdGZ1bmN0aW9uIGhhbmRsZUFscGhhKCBzdHJpbmcgKSB7XG5cblx0XHRcdGlmICggc3RyaW5nID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdGlmICggcGFyc2VGbG9hdCggc3RyaW5nICkgPCAxICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBBbHBoYSBjb21wb25lbnQgb2YgJyArIHN0eWxlICsgJyB3aWxsIGJlIGlnbm9yZWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdHZhciBtO1xuXG5cdFx0aWYgKCBtID0gL14oKD86cmdifGhzbClhPylcXChcXHMqKFteXFwpXSopXFwpLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyByZ2IgLyBoc2xcblxuXHRcdFx0dmFyIGNvbG9yO1xuXHRcdFx0dmFyIG5hbWUgPSBtWyAxIF07XG5cdFx0XHR2YXIgY29tcG9uZW50cyA9IG1bIDIgXTtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdyZ2InOlxuXHRcdFx0XHRjYXNlICdyZ2JhJzpcblxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyooLFxccyooWzAtOV0qXFwuP1swLTldKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJnYigyNTUsMCwwKSByZ2JhKDI1NSwwLDAsMC41KVxuXHRcdFx0XHRcdFx0dGhpcy5yID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuZyA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAyNTU7XG5cdFx0XHRcdFx0XHR0aGlzLmIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMjU1O1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDUgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyooLFxccyooWzAtOV0qXFwuP1swLTldKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KVxuXHRcdFx0XHRcdFx0dGhpcy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDUgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHRcdGNhc2UgJ2hzbGEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFswLTldKlxcLj9bMC05XSspXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gaHNsKDEyMCw1MCUsNTAlKSBoc2xhKDEyMCw1MCUsNTAlLDAuNSlcblx0XHRcdFx0XHRcdHZhciBoID0gcGFyc2VGbG9hdCggY29sb3JbIDEgXSApIC8gMzYwO1xuXHRcdFx0XHRcdFx0dmFyIHMgPSBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHZhciBsID0gcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEhTTCggaCwgcywgbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG0gPSAvXlxcIyhbQS1GYS1mMC05XSspJC8uZXhlYyggc3R5bGUgKSApIHtcblxuXHRcdFx0Ly8gaGV4IGNvbG9yXG5cblx0XHRcdHZhciBoZXggPSBtWyAxIF07XG5cdFx0XHR2YXIgc2l6ZSA9IGhleC5sZW5ndGg7XG5cblx0XHRcdGlmICggc2l6ZSA9PT0gMyApIHtcblxuXHRcdFx0XHQvLyAjZmYwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAwICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAxICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAyICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHNpemUgPT09IDYgKSB7XG5cblx0XHRcdFx0Ly8gI2ZmMDAwMFxuXHRcdFx0XHR0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmcgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMiApICsgaGV4LmNoYXJBdCggMyApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggNCApICsgaGV4LmNoYXJBdCggNSApLCAxNiApIC8gMjU1O1xuXG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHN0eWxlICYmIHN0eWxlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGNvbG9yIGtleXdvcmRzXG5cdFx0XHR2YXIgaGV4ID0gQ29sb3JLZXl3b3Jkc1sgc3R5bGUgXTtcblxuXHRcdFx0aWYgKCBoZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyByZWRcblx0XHRcdFx0dGhpcy5zZXRIZXgoIGhleCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHVua25vd24gY29sb3Jcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgJyArIHN0eWxlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yLnI7XG5cdFx0dGhpcy5nID0gY29sb3IuZztcblx0XHR0aGlzLmIgPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCBjb2xvciwgZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHRpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRlZmluZWQgKSBnYW1tYUZhY3RvciA9IDIuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBnYW1tYUZhY3RvciApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBnYW1tYUZhY3RvciApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBnYW1tYUZhY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCBjb2xvciwgZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHRpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRlZmluZWQgKSBnYW1tYUZhY3RvciA9IDIuMDtcblxuXHRcdHZhciBzYWZlSW52ZXJzZSA9ICggZ2FtbWFGYWN0b3IgPiAwICkgPyAoIDEuMCAvIGdhbW1hRmFjdG9yICkgOiAxLjA7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3Iuciwgc2FmZUludmVyc2UgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgc2FmZUludmVyc2UgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgc2FmZUludmVyc2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydEdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iO1xuXG5cdFx0dGhpcy5yID0gciAqIHI7XG5cdFx0dGhpcy5nID0gZyAqIGc7XG5cdFx0dGhpcy5iID0gYiAqIGI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnNxcnQoIHRoaXMuciApO1xuXHRcdHRoaXMuZyA9IE1hdGguc3FydCggdGhpcy5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5zcXJ0KCB0aGlzLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0SGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLnIgKiAyNTUgKSA8PCAxNiBeICggdGhpcy5nICogMjU1ICkgPDwgOCBeICggdGhpcy5iICogMjU1ICkgPDwgMDtcblxuXHR9LFxuXG5cdGdldEhleFN0cmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggJzAwMDAwMCcgKyB0aGlzLmdldEhleCgpLnRvU3RyaW5nKCAxNiApICkuc2xpY2UoIC0gNiApO1xuXG5cdH0sXG5cblx0Z2V0SFNMOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdHZhciBoc2wgPSBvcHRpb25hbFRhcmdldCB8fCB7IGg6IDAsIHM6IDAsIGw6IDAgfTtcblxuXHRcdHZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iO1xuXG5cdFx0dmFyIG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7XG5cdFx0dmFyIG1pbiA9IE1hdGgubWluKCByLCBnLCBiICk7XG5cblx0XHR2YXIgaHVlLCBzYXR1cmF0aW9uO1xuXHRcdHZhciBsaWdodG5lc3MgPSAoIG1pbiArIG1heCApIC8gMi4wO1xuXG5cdFx0aWYgKCBtaW4gPT09IG1heCApIHtcblxuXHRcdFx0aHVlID0gMDtcblx0XHRcdHNhdHVyYXRpb24gPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGRlbHRhID0gbWF4IC0gbWluO1xuXG5cdFx0XHRzYXR1cmF0aW9uID0gbGlnaHRuZXNzIDw9IDAuNSA/IGRlbHRhIC8gKCBtYXggKyBtaW4gKSA6IGRlbHRhIC8gKCAyIC0gbWF4IC0gbWluICk7XG5cblx0XHRcdHN3aXRjaCAoIG1heCApIHtcblxuXHRcdFx0XHRjYXNlIHI6IGh1ZSA9ICggZyAtIGIgKSAvIGRlbHRhICsgKCBnIDwgYiA/IDYgOiAwICk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIGc6IGh1ZSA9ICggYiAtIHIgKSAvIGRlbHRhICsgMjsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRodWUgLz0gNjtcblxuXHRcdH1cblxuXHRcdGhzbC5oID0gaHVlO1xuXHRcdGhzbC5zID0gc2F0dXJhdGlvbjtcblx0XHRoc2wubCA9IGxpZ2h0bmVzcztcblxuXHRcdHJldHVybiBoc2w7XG5cblx0fSxcblxuXHRnZXRTdHlsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICdyZ2IoJyArICggKCB0aGlzLnIgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmcgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmIgKiAyNTUgKSB8IDAgKSArICcpJztcblxuXHR9LFxuXG5cdG9mZnNldEhTTDogZnVuY3Rpb24gKCBoLCBzLCBsICkge1xuXG5cdFx0dmFyIGhzbCA9IHRoaXMuZ2V0SFNMKCk7XG5cblx0XHRoc2wuaCArPSBoOyBoc2wucyArPSBzOyBoc2wubCArPSBsO1xuXG5cdFx0dGhpcy5zZXRIU0woIGhzbC5oLCBoc2wucywgaHNsLmwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZENvbG9yczogZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IE1hdGgubWF4KCAwLCB0aGlzLnIgLSBjb2xvci5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5tYXgoIDAsIHRoaXMuZyAtIGNvbG9yLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciAqPSBjb2xvci5yO1xuXHRcdHRoaXMuZyAqPSBjb2xvci5nO1xuXHRcdHRoaXMuYiAqPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy5yICo9IHM7XG5cdFx0dGhpcy5nICo9IHM7XG5cdFx0dGhpcy5iICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0dGhpcy5yICs9ICggY29sb3IuciAtIHRoaXMuciApICogYWxwaGE7XG5cdFx0dGhpcy5nICs9ICggY29sb3IuZyAtIHRoaXMuZyApICogYWxwaGE7XG5cdFx0dGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBjICkge1xuXG5cdFx0cmV0dXJuICggYy5yID09PSB0aGlzLnIgKSAmJiAoIGMuZyA9PT0gdGhpcy5nICkgJiYgKCBjLmIgPT09IHRoaXMuYiApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuciA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLmcgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuYiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuZztcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5iO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRIZXgoKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBVbmlmb3JtcyBsaWJyYXJ5IGZvciBzaGFyZWQgd2ViZ2wgc2hhZGVyc1xuICovXG5cbnZhciBVbmlmb3Jtc0xpYiA9IHtcblxuXHRjb21tb246IHtcblxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LFxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXG5cdFx0bWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0b2Zmc2V0UmVwZWF0OiB7IHZhbHVlOiBuZXcgVmVjdG9yNCggMCwgMCwgMSwgMSApIH0sXG5cblx0XHRzcGVjdWxhck1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0XHRlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRmbGlwRW52TWFwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRyZWZsZWN0aXZpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9XG5cblx0fSxcblxuXHRhb21hcDoge1xuXG5cdFx0YW9NYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRhb01hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9XG5cblx0fSxcblxuXHRsaWdodG1hcDoge1xuXG5cdFx0bGlnaHRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRsaWdodE1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9XG5cblx0fSxcblxuXHRlbWlzc2l2ZW1hcDoge1xuXG5cdFx0ZW1pc3NpdmVNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0YnVtcG1hcDoge1xuXG5cdFx0YnVtcE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGJ1bXBTY2FsZTogeyB2YWx1ZTogMSB9XG5cblx0fSxcblxuXHRub3JtYWxtYXA6IHtcblxuXHRcdG5vcm1hbE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdG5vcm1hbFNjYWxlOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiggMSwgMSApIH1cblxuXHR9LFxuXG5cdGRpc3BsYWNlbWVudG1hcDoge1xuXG5cdFx0ZGlzcGxhY2VtZW50TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0ZGlzcGxhY2VtZW50U2NhbGU6IHsgdmFsdWU6IDEgfSxcblx0XHRkaXNwbGFjZW1lbnRCaWFzOiB7IHZhbHVlOiAwIH1cblxuXHR9LFxuXG5cdHJvdWdobmVzc21hcDoge1xuXG5cdFx0cm91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdG1ldGFsbmVzc21hcDoge1xuXG5cdFx0bWV0YWxuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGdyYWRpZW50bWFwOiB7XG5cblx0XHRncmFkaWVudE1hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRmb2c6IHtcblxuXHRcdGZvZ0RlbnNpdHk6IHsgdmFsdWU6IDAuMDAwMjUgfSxcblx0XHRmb2dOZWFyOiB7IHZhbHVlOiAxIH0sXG5cdFx0Zm9nRmFyOiB7IHZhbHVlOiAyMDAwIH0sXG5cdFx0Zm9nQ29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhmZmZmZmYgKSB9XG5cblx0fSxcblxuXHRsaWdodHM6IHtcblxuXHRcdGFtYmllbnRMaWdodENvbG9yOiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0Y29sb3I6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9LFxuXHRcdFx0Y29uZUNvczoge30sXG5cdFx0XHRwZW51bWJyYUNvczoge30sXG5cdFx0XHRkZWNheToge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdHNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0c3BvdFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHBvaW50TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRwb2ludFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdGhlbWlzcGhlcmVMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0c2t5Q29sb3I6IHt9LFxuXHRcdFx0Z3JvdW5kQ29sb3I6IHt9XG5cdFx0fSB9LFxuXG5cdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgQlJERiBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGZyb20gZXhhbXBsZSB0byBtYWluIHNyY1xuXHRcdHJlY3RBcmVhTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0d2lkdGg6IHt9LFxuXHRcdFx0aGVpZ2h0OiB7fVxuXHRcdH0gfVxuXG5cdH0sXG5cblx0cG9pbnRzOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRzaXplOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRzY2FsZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0bWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0b2Zmc2V0UmVwZWF0OiB7IHZhbHVlOiBuZXcgVmVjdG9yNCggMCwgMCwgMSwgMSApIH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogVW5pZm9ybSBVdGlsaXRpZXNcbiAqL1xuXG52YXIgVW5pZm9ybXNVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCB1bmlmb3JtcyApIHtcblxuXHRcdHZhciBtZXJnZWQgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdG1wICkge1xuXG5cdFx0XHRcdG1lcmdlZFsgcCBdID0gdG1wWyBwIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtZXJnZWQ7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHR2YXIgdW5pZm9ybXNfZHN0ID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSBpbiB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdID0ge307XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHVuaWZvcm1zX3NyY1sgdSBdICkge1xuXG5cdFx0XHRcdHZhciBwYXJhbWV0ZXJfc3JjID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcl9zcmMgJiYgKCBwYXJhbWV0ZXJfc3JjLmlzQ29sb3IgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzTWF0cml4MyB8fCBwYXJhbWV0ZXJfc3JjLmlzTWF0cml4NCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1RleHR1cmUgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3NyYyApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuc2xpY2UoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5pZm9ybXNfZHN0O1xuXG5cdH1cblxufTtcblxudmFyIGFscGhhbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFscGhhdGVzdF9mcmFnbWVudCA9IFwiI2lmZGVmIEFMUEhBVEVTVFxcblxcdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFvbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgYmVnaW5fdmVydGV4ID0gXCJcXG52ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcXG5cIjtcblxudmFyIGJlZ2lubm9ybWFsX3ZlcnRleCA9IFwiXFxudmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcXG5cIjtcblxudmFyIGJzZGZzID0gXCJmbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcXG5cXHRpZiggZGVjYXlFeHBvbmVudCA+IDAuMCApIHtcXG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxcblxcdFxcdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcXG5cXHRcXHRmbG9hdCBtYXhEaXN0YW5jZUN1dG9mZkZhY3RvciA9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7XFxuXFx0XFx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZiAqIG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yO1xcbiNlbHNlXFxuXFx0XFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xcbiNlbmRpZlxcblxcdH1cXG5cXHRyZXR1cm4gMS4wO1xcbn1cXG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcXG59XFxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XFxuXFx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RMSCAtIDYuOTgzMTYgKSAqIGRvdExIICk7XFxuXFx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XFxufVxcbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xcblxcdHJldHVybiAxLjAgLyAoIGdsICogZ3YgKTtcXG59XFxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5MICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0ZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xcblxcdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcXG59XFxuZmxvYXQgRF9HR1goIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XFxuXFx0ZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgLyBwb3cyKCBkZW5vbSApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTtcXG5cXHRmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG52ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgPSA2NC4wO1xcblxcdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xcblxcdGNvbnN0IGZsb2F0IExVVF9CSUFTICA9IDAuNSAvIExVVF9TSVpFO1xcblxcdGZsb2F0IHRoZXRhID0gYWNvcyggZG90KCBOLCBWICkgKTtcXG5cXHR2ZWMyIHV2ID0gdmVjMihcXG5cXHRcXHRzcXJ0KCBzYXR1cmF0ZSggcm91Z2huZXNzICkgKSxcXG5cXHRcXHRzYXR1cmF0ZSggdGhldGEgLyAoIDAuNSAqIFBJICkgKSApO1xcblxcdHV2ID0gdXYgKiBMVVRfU0NBTEUgKyBMVVRfQklBUztcXG5cXHRyZXR1cm4gdXY7XFxufVxcbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xcblxcdGZsb2F0IGwgPSBsZW5ndGgoIGYgKTtcXG5cXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XFxufVxcbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xcblxcdGZsb2F0IHggPSBkb3QoIHYxLCB2MiApO1xcblxcdGZsb2F0IHkgPSBhYnMoIHggKTtcXG5cXHRmbG9hdCBhID0gMC44NjI2NyArICgwLjQ5Nzg4ICsgMC4wMTQzNiAqIHkgKSAqIHk7XFxuXFx0ZmxvYXQgYiA9IDMuNDUwNjggKyAoNC4xODgxNCArIHkpICogeTtcXG5cXHRmbG9hdCB2ID0gYSAvIGI7XFxuXFx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoeCA+IDAuMCkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIDEuMCAtIHggKiB4ICkgLSB2O1xcblxcdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcXG59XFxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XFxuXFx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XFxuXFx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIFQxLCBUMjtcXG5cXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xcblxcdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcXG5cXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2UoIG1hdDMoIFQxLCBUMiwgTiApICk7XFxuXFx0dmVjMyBjb29yZHNbIDQgXTtcXG5cXHRjb29yZHNbIDAgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAyIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDIgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xcblxcdGNvb3Jkc1sgMSBdID0gbm9ybWFsaXplKCBjb29yZHNbIDEgXSApO1xcblxcdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xcblxcdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xcblxcdHZlYzMgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAuMCApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMiBdLCBjb29yZHNbIDMgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcXG5cXHR2ZWMzIHJlc3VsdCA9IHZlYzMoIExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggdmVjdG9yRm9ybUZhY3RvciApICk7XFxuXFx0cmV0dXJuIHJlc3VsdDtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xcblxcdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xcblxcdHZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7XFxuXFx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XFxuXFx0dmVjMiBBQiA9IHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcXG5cXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIEFCLnggKyBBQi55O1xcbn1cXG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xcblxcdHJldHVybiAwLjI1O1xcbn1cXG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkge1xcblxcdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xcblxcdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xcblxcdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcXG5cXHRmbG9hdCBHID0gR19CbGlublBob25nX0ltcGxpY2l0KCApO1xcblxcdGZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTtcXG5cXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcXG59XFxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuICggMi4wIC8gcG93MiggZ2d4Um91Z2huZXNzICsgMC4wMDAxICkgLSAyLjAgKTtcXG59XFxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xcblxcdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xcbn1cXG5cIjtcblxudmFyIGJ1bXBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9CVU1QTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcXG5cXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcXG5cXHRcXHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XFxuXFx0XFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZVdiApO1xcblxcdFxcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcXG5cXHRcXHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcXG5cXHRcXHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcXG5cXHRcXHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcXG5cXHR9XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSApIHtcXG5cXHRcXHR2ZWMzIHZTaWdtYVggPSBkRmR4KCBzdXJmX3BvcyApO1xcblxcdFxcdHZlYzMgdlNpZ21hWSA9IGRGZHkoIHN1cmZfcG9zICk7XFxuXFx0XFx0dmVjMyB2TiA9IHN1cmZfbm9ybTtcXG5cXHRcXHR2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XFxuXFx0XFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xcblxcdFxcdGZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICk7XFxuXFx0XFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyArKyBpICkge1xcblxcdFxcdHZlYzQgcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdGlmICggZG90KCB2Vmlld1Bvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xcblxcdH1cXG5cXHRcXHRcXG5cXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xcblxcdFxcdGJvb2wgY2xpcHBlZCA9IHRydWU7XFxuXFx0XFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyArKyBpICkge1xcblxcdFxcdFxcdHZlYzQgcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdFxcdGNsaXBwZWQgPSAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcXG5cXHRcXHR9XFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHRcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvci54eXogPSBjb2xvci54eXo7XFxuI2VuZGlmXCI7XG5cbnZhciBjb21tb24gPSBcIiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1OVxcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcXG4jZGVmaW5lIExPRzIgMS40NDI2OTVcXG4jZGVmaW5lIEVQU0lMT04gMWUtNlxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG59O1xcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XFxufVxcbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xcbn1cXG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcXG5cXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XFxufVxcbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xcbn1cXG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XFxufVxcbm1hdDMgdHJhbnNwb3NlKCBjb25zdCBpbiBtYXQzIHYgKSB7XFxuXFx0bWF0MyB0bXA7XFxuXFx0dG1wWzBdID0gdmVjMyh2WzBdLngsIHZbMV0ueCwgdlsyXS54KTtcXG5cXHR0bXBbMV0gPSB2ZWMzKHZbMF0ueSwgdlsxXS55LCB2WzJdLnkpO1xcblxcdHRtcFsyXSA9IHZlYzModlswXS56LCB2WzFdLnosIHZbMl0ueik7XFxuXFx0cmV0dXJuIHRtcDtcXG59XFxuXCI7XG5cbnZhciBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQgPSBcIiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXFxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcXG5pbnQgZ2V0RmFjZUZyb21EaXJlY3Rpb24odmVjMyBkaXJlY3Rpb24pIHtcXG5cXHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyhkaXJlY3Rpb24pO1xcblxcdGludCBmYWNlID0gLTE7XFxuXFx0aWYoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnogKSB7XFxuXFx0XFx0aWYoYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMCA6IDM7XFxuXFx0XFx0ZWxzZVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyIDogNTtcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdHJldHVybiBmYWNlO1xcbn1cXG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxcbiNkZWZpbmUgY3ViZVVWX3JhbmdlQ2xhbXAgKGV4cDIoKDYuMCAtIDEuMCkgKiAyLjApKVxcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBzY2FsZSA9IGV4cDIoY3ViZVVWX21heExvZHMxIC0gcm91Z2huZXNzTGV2ZWwpO1xcblxcdGZsb2F0IGR4Um91Z2huZXNzID0gZEZkeChyb3VnaG5lc3MpO1xcblxcdGZsb2F0IGR5Um91Z2huZXNzID0gZEZkeShyb3VnaG5lc3MpO1xcblxcdHZlYzMgZHggPSBkRmR4KCB2ZWMgKiBzY2FsZSAqIGR4Um91Z2huZXNzICk7XFxuXFx0dmVjMyBkeSA9IGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcXG5cXHRmbG9hdCBkID0gbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XFxuXFx0ZCA9IGNsYW1wKGQsIDEuMCwgY3ViZVVWX3JhbmdlQ2xhbXApO1xcblxcdGZsb2F0IG1pcExldmVsID0gMC41ICogbG9nMihkKTtcXG5cXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMyIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDIuMClcXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcXG5cXHRtaXBMZXZlbCA9IHJvdWdobmVzc0xldmVsID4gY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XFxuXFx0ZmxvYXQgYSA9IDE2LjAgKiBjdWJlVVZfcmNwVGV4dHVyZVNpemU7XFxuXFx0dmVjMiBleHAyX3BhY2tlZCA9IGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XFxuXFx0dmVjMiByY3BfZXhwMl9wYWNrZWQgPSB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xcblxcdGZsb2F0IHBvd1NjYWxlID0gZXhwMl9wYWNrZWQueCAqIGV4cDJfcGFja2VkLnk7XFxuXFx0ZmxvYXQgc2NhbGUgPSByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcXG5cXHRmbG9hdCBtaXBPZmZzZXQgPSAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcXG5cXHRib29sIGJSZXMgPSBtaXBMZXZlbCA9PSAwLjA7XFxuXFx0c2NhbGUgPSAgYlJlcyAmJiAoc2NhbGUgPCBhKSA/IGEgOiBzY2FsZTtcXG5cXHR2ZWMzIHI7XFxuXFx0dmVjMiBvZmZzZXQ7XFxuXFx0aW50IGZhY2UgPSBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xcblxcdGZsb2F0IHJjcFBvd1NjYWxlID0gMS4wIC8gcG93U2NhbGU7XFxuXFx0aWYoIGZhY2UgPT0gMCkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDEpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDIpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSAzKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigwLjArbWlwT2Zmc2V0LDAuNSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gNCkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ciA9IG5vcm1hbGl6ZShyKTtcXG5cXHRmbG9hdCB0ZXhlbE9mZnNldCA9IDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIHMgPSAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcXG5cXHR2ZWMyIGJhc2UgPSBvZmZzZXQgKyB2ZWMyKCB0ZXhlbE9mZnNldCApO1xcblxcdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xcbn1cXG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXFxudmVjNCB0ZXh0dXJlQ3ViZVVWKHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgcm91Z2huZXNzVmFsID0gcm91Z2huZXNzKiBjdWJlVVZfbWF4TG9kczM7XFxuXFx0ZmxvYXQgcjEgPSBmbG9vcihyb3VnaG5lc3NWYWwpO1xcblxcdGZsb2F0IHIyID0gcjEgKyAxLjA7XFxuXFx0ZmxvYXQgdCA9IGZyYWN0KHJvdWdobmVzc1ZhbCk7XFxuXFx0dmVjMiBtaXBJbmZvID0gTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgcyA9IG1pcEluZm8ueTtcXG5cXHRmbG9hdCBsZXZlbDAgPSBtaXBJbmZvLng7XFxuXFx0ZmxvYXQgbGV2ZWwxID0gbGV2ZWwwICsgMS4wO1xcblxcdGxldmVsMSA9IGxldmVsMSA+IDUuMCA/IDUuMCA6IGxldmVsMTtcXG5cXHRsZXZlbDAgKz0gbWluKCBmbG9vciggcyArIDAuNSApLCA1LjAgKTtcXG5cXHR2ZWMyIHV2XzEwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XFxuXFx0dmVjNCBjb2xvcjEwID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xcblxcdHZlYzIgdXZfMjAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMiwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMjAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XFxuXFx0dmVjNCByZXN1bHQgPSBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XFxuXFx0cmV0dXJuIHZlYzQocmVzdWx0LnJnYiwgMS4wKTtcXG59XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkZWZhdWx0bm9ybWFsX3ZlcnRleCA9IFwiI2lmZGVmIEZMSVBfU0lERURcXG5cXHRvYmplY3ROb3JtYWwgPSAtb2JqZWN0Tm9ybWFsO1xcbiNlbmRpZlxcbnZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XFxuXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR0cmFuc2Zvcm1lZCArPSBub3JtYWwgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVtaXNzaXZlbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dmVjNCBlbWlzc2l2ZUNvbG9yID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdlV2ICk7XFxuXFx0ZW1pc3NpdmVDb2xvci5yZ2IgPSBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XFxuXFx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW5jb2RpbmdzX2ZyYWdtZW50ID0gXCIgIGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1xcblwiO1xuXG52YXIgZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQgPSBcIlxcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZhbHVlO1xcbn1cXG52ZWM0IEdhbW1hVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xcblxcdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnh5eiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCAxLjAgLyBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IExpbmVhclRvc1JHQiggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiBleHAyKCB2YWx1ZS5hICogMjU1LjAgLSAxMjguMCApLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xcblxcdGZsb2F0IGZFeHAgPSBjbGFtcCggY2VpbCggbG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLTEyOC4wLCAxMjcuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xcbn1cXG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnh5eiAqIHZhbHVlLncgKiBtYXhSYW5nZSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLngsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgTSAgICAgID0gY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xcblxcdE0gICAgICAgICAgICA9IGNlaWwoIE0gKiAyNTUuMCApIC8gMjU1LjA7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcXG59XFxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoICggbWF4UmFuZ2UgLyAyNTUuMCApIC8gdmFsdWUuYSApLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBEICAgICAgPSBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcXG5cXHREICAgICAgICAgICAgPSBtaW4oIGZsb29yKCBEICkgLyAyNTUuMCwgMS4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcXG59XFxuY29uc3QgbWF0MyBjTG9nTHV2TSA9IG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcXG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcXG5cXHR2ZWMzIFhwX1lfWFlacCA9IHZhbHVlLnJnYiAqIGNMb2dMdXZNO1xcblxcdFhwX1lfWFlacCA9IG1heChYcF9ZX1hZWnAsIHZlYzMoMWUtNiwgMWUtNiwgMWUtNikpO1xcblxcdHZlYzQgdlJlc3VsdDtcXG5cXHR2UmVzdWx0Lnh5ID0gWHBfWV9YWVpwLnh5IC8gWHBfWV9YWVpwLno7XFxuXFx0ZmxvYXQgTGUgPSAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xcblxcdHZSZXN1bHQudyA9IGZyYWN0KExlKTtcXG5cXHR2UmVzdWx0LnogPSAoTGUgLSAoZmxvb3IodlJlc3VsdC53KjI1NS4wKSkvMjU1LjApLzI1NS4wO1xcblxcdHJldHVybiB2UmVzdWx0O1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xcbnZlYzQgTG9nTHV2VG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xcblxcdHZlYzMgWHBfWV9YWVpwO1xcblxcdFhwX1lfWFlacC55ID0gZXhwMigoTGUgLSAxMjcuMCkgLyAyLjApO1xcblxcdFhwX1lfWFlacC56ID0gWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xcblxcdFhwX1lfWFlacC54ID0gdmFsdWUueCAqIFhwX1lfWFlacC56O1xcblxcdHZlYzMgdlJHQiA9IFhwX1lfWFlacC5yZ2IgKiBjTG9nTHV2SW52ZXJzZU07XFxuXFx0cmV0dXJuIHZlYzQoIG1heCh2UkdCLCAwLjApLCAxLjAgKTtcXG59XFxuXCI7XG5cbnZhciBlbnZtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgZmxpcE5vcm1hbCAqIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxcblxcdFxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0XFx0c2FtcGxlVVYueSA9IHNhdHVyYXRlKCBmbGlwTm9ybWFsICogcmVmbGVjdFZlYy55ICogMC41ICsgMC41ICk7XFxuXFx0XFx0c2FtcGxlVVYueCA9IGF0YW4oIGZsaXBOb3JtYWwgKiByZWZsZWN0VmVjLnosIGZsaXBOb3JtYWwgKiByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBmbGlwTm9ybWFsICogbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHRlbnZDb2xvciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XFxuXFx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfTUlYIClcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbnZtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XFxuXFx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICggZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGZvZ192ZXJ0ZXggPSBcIlxcbiNpZmRlZiBVU0VfRk9HXFxuZm9nRGVwdGggPSAtbXZQb3NpdGlvbi56O1xcbiNlbmRpZlwiO1xuXG52YXIgZm9nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0ZPR1xcbiAgdmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGZvZ19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHRmbG9hdCBmb2dGYWN0b3IgPSB3aGl0ZUNvbXBsaW1lbnQoIGV4cDIoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICogTE9HMiApICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7XFxuXFx0I2VuZGlmXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xcblxcdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XFxuXFx0I2lmZGVmIEZPR19FWFAyXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFRPT05cXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcXG5cXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcXG5cXHRcXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xcblxcdFxcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcXG5cXHRcXHRcXHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRyZXR1cm4gKCBjb29yZC54IDwgMC43ICkgPyB2ZWMzKCAwLjcgKSA6IHZlYzMoIDEuMCApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0bWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfbGFtYmVydF92ZXJ0ZXggPSBcInZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcXG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuZ2VvbWV0cnkudmlld0RpciA9IG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XFxuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XFxuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuYmFja0dlb21ldHJ5Lm5vcm1hbCA9IC1nZW9tZXRyeS5ub3JtYWw7XFxuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZMaWdodEJhY2sgPSB2ZWMzKCAwLjAgKTtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbmZsb2F0IGRvdE5MO1xcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGFycyA9IFwidW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdHN0cnVjdCBQb2ludExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdHN0cnVjdCBTcG90TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRmbG9hdCBjb25lQ29zO1xcblxcdFxcdGZsb2F0IHBlbnVtYnJhQ29zO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCAgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodDtcXG5cXHR9O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y01hdDtcXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNNYWc7XFxuXFx0dW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdO1xcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBza3lDb2xvcjtcXG5cXHRcXHR2ZWMzIGdyb3VuZENvbG9yO1xcblxcdH07XFxuXFx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XFxuXFx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xcblxcdFxcdGZsb2F0IGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41O1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gaXJyYWRpYW5jZTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBxdWVyeVZlYywgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciAtIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9uZW50ICkgKyAxLjAgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xcblxcdFxcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVVihxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyhibGlublNoaW5pbmVzc0V4cG9uZW50KSk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRcXHRzYW1wbGVVVi55ID0gc2F0dXJhdGUoIHJlZmxlY3RWZWMueSAqIDAuNSArIDAuNSApO1xcblxcdFxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLDAuMCwxLjAgKSApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSBcIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU2hpbmluZXNzO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9CbGlublBob25nKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBub3JtYWwgPSBnZW9tZXRyeS5ub3JtYWw7XFxuXFx0XFx0dmVjMyB2aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0dmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247XFxuXFx0XFx0dmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XFxuXFx0XFx0dmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjtcXG5cXHRcXHRmbG9hdCByb3VnaG5lc3MgPSBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICk7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0ZmxvYXQgbm9ybSA9IHRleHR1cmUyRCggbHRjTWFnLCB1diApLmE7XFxuXFx0XFx0dmVjNCB0ID0gdGV4dHVyZTJEKCBsdGNNYXQsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCAgIDEsICAgMCwgdC55ICksXFxuXFx0XFx0XFx0dmVjMyggICAwLCB0LnosICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQudywgICAwLCB0LnggKVxcblxcdFxcdCk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiBub3JtICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxICksIHJlY3RDb29yZHMgKTtcXG5cXHR9XFxuI2VuZGlmXFxudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHQjaWZkZWYgVE9PTlxcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZW5kaWZcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYV9CbGlublBob25nXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVxcdCgwKVxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gXCJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gY2xhbXAoIHJvdWdobmVzc0ZhY3RvciwgMC4wNCwgMS4wICk7XFxuI2lmZGVmIFNUQU5EQVJEXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG5cXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XFx0bWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0gY2xhbXAoIGNsZWFyQ29hdFJvdWdobmVzcywgMC4wNCwgMS4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9IFwic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0O1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG5cXHQjZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0ZmxvYXQgbm9ybSA9IHRleHR1cmUyRCggbHRjTWFnLCB1diApLmE7XFxuXFx0XFx0dmVjNCB0ID0gdGV4dHVyZTJEKCBsdGNNYXQsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCAgIDEsICAgMCwgdC55ICksXFxuXFx0XFx0XFx0dmVjMyggICAwLCB0LnosICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQudywgICAwLCB0LnggKVxcblxcdFxcdCk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiBub3JtICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxICksIHJlY3RDb29yZHMgKTtcXG5cXHR9XFxuI2VuZGlmXFxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhckNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdGZsb2F0IGRvdE5MID0gZG90TlY7XFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogcmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJDb2F0UmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhckNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzICk7XFxuXFx0I2VuZGlmXFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X1BoeXNpY2FsXFxuI2RlZmluZSBSRV9EaXJlY3RfUmVjdEFyZWFcXHRcXHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfSW5kaXJlY3RTcGVjdWxhclxcdFxcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcXG4jZGVmaW5lIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICkgICBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzIClcXG4jZGVmaW5lIE1hdGVyaWFsX0NsZWFyQ29hdF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKVxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xcbn1cXG5cIjtcblxudmFyIGxpZ2h0c190ZW1wbGF0ZSA9IFwiXFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcXG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWw7XFxuZ2VvbWV0cnkudmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxcblxcdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxcblxcdFNwb3RMaWdodCBzcG90TGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKVxcblxcdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRyZWN0QXJlYUxpZ2h0ID0gcmVjdEFyZWFMaWdodHNbIGkgXTtcXG5cXHRcXHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0bGlnaHRNYXBJcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xcblxcdCNlbmRpZlxcblxcdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxcblxcdFxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRcXHRpcnJhZGlhbmNlICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIDggKTtcXG5cXHQjZW5kaWZcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdHZlYzMgcmFkaWFuY2UgPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIDggKTtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIDggKTtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgY2xlYXJDb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxvZ2RlcHRoYnVmX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZChVU0VfTE9HREVQVEhCVUYpICYmIGRlZmluZWQoVVNFX0xPR0RFUFRIQlVGX0VYVClcXG5cXHRnbF9GcmFnRGVwdGhFWFQgPSBsb2cyKHZGcmFnRGVwdGgpICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcXG5cXHRcXHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdGdsX1Bvc2l0aW9uLnogPSBsb2cyKG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApKSAqIGxvZ0RlcHRoQnVmRkM7XFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcXG5cXHRcXHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcXG5cXHQjZWxzZVxcblxcdFxcdGdsX1Bvc2l0aW9uLnogPSAoZ2xfUG9zaXRpb24ueiAtIDEuMCkgKiBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHZlYzQgdGV4ZWxDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VXYgKTtcXG5cXHR0ZXhlbENvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xcblxcdGRpZmZ1c2VDb2xvciAqPSB0ZXhlbENvbG9yO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHZlYzQgbWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIG1hcCwgdmVjMiggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnkgKSAqIG9mZnNldFJlcGVhdC56dyArIG9mZnNldFJlcGVhdC54eSApO1xcblxcdGRpZmZ1c2VDb2xvciAqPSBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVhdDtcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtZXRhbG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzcztcXG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxcblxcdHZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XFxuXFx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaG5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDEgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07XFxuXFx0I2Vsc2VcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGh0YXJnZXRfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQyIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ0IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ3IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsX2ZsaXAgPSBcIiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRmbG9hdCBmbGlwTm9ybWFsID0gKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xcbiNlbHNlXFxuXFx0ZmxvYXQgZmxpcE5vcm1hbCA9IDEuMDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudCA9IFwiI2lmZGVmIEZMQVRfU0hBREVEXFxuXFx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XFxuI2Vsc2VcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApICogZmxpcE5vcm1hbDtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX05PUk1BTE1BUFxcblxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsICk7XFxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxcblxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XFxuXFx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xcblxcdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0gKSB7XFxuXFx0XFx0dmVjMyBxMCA9IGRGZHgoIGV5ZV9wb3MueHl6ICk7XFxuXFx0XFx0dmVjMyBxMSA9IGRGZHkoIGV5ZV9wb3MueHl6ICk7XFxuXFx0XFx0dmVjMiBzdDAgPSBkRmR4KCB2VXYuc3QgKTtcXG5cXHRcXHR2ZWMyIHN0MSA9IGRGZHkoIHZVdi5zdCApO1xcblxcdFxcdHZlYzMgUyA9IG5vcm1hbGl6ZSggcTAgKiBzdDEudCAtIHExICogc3QwLnQgKTtcXG5cXHRcXHR2ZWMzIFQgPSBub3JtYWxpemUoIC1xMCAqIHN0MS5zICsgcTEgKiBzdDAucyApO1xcblxcdFxcdHZlYzMgTiA9IG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XFxuXFx0XFx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHRcXHRtYXBOLnh5ID0gbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xcblxcdFxcdG1hdDMgdHNuID0gbWF0MyggUywgVCwgTiApO1xcblxcdFxcdHJldHVybiBub3JtYWxpemUoIHRzbiAqIG1hcE4gKTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwYWNraW5nID0gXCJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XFxufVxcbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xcblxcdHJldHVybiAxLjAgLSAyLjAgKiByZ2IueHl6O1xcbn1cXG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO1xcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xcblxcdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xcblxcdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XFx0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcXG59XFxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcXG5cXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XFxufVxcbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApO1xcbn1cXG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xcbn1cXG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XFxufVxcbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xcbn1cXG5cIjtcblxudmFyIHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgPSBcIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHByb2plY3RfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogc2tpbm5lZDtcXG4jZWxzZVxcblxcdHZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG4jZW5kaWZcXG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xcblwiO1xuXG52YXIgZGl0aGVyaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggRElUSEVSSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggRElUSEVSSU5HIClcXG5cXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcXG5cXHRcXHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XFxuXFx0XFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcXG5cXHRcXHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xcblxcdFxcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcm91Z2huZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xcblxcdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XFxuXFx0fVxcblxcdGZsb2F0IHRleHR1cmUyRFNoYWRvd0xlcnAoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgc2l6ZSwgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRjb25zdCB2ZWMyIG9mZnNldCA9IHZlYzIoIDAuMCwgMS4wICk7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNpemU7XFxuXFx0XFx0dmVjMiBjZW50cm9pZFVWID0gZmxvb3IoIHV2ICogc2l6ZSArIDAuNSApIC8gc2l6ZTtcXG5cXHRcXHRmbG9hdCBsYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IGx0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh5LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgcmIgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXgsIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCBydCA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eSwgY29tcGFyZSApO1xcblxcdFxcdHZlYzIgZiA9IGZyYWN0KCB1diAqIHNpemUgKyAwLjUgKTtcXG5cXHRcXHRmbG9hdCBhID0gbWl4KCBsYiwgbHQsIGYueSApO1xcblxcdFxcdGZsb2F0IGIgPSBtaXgoIHJiLCBydCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYyA9IG1peCggYSwgYiwgZi54ICk7XFxuXFx0XFx0cmV0dXJuIGM7XFxuXFx0fVxcblxcdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XFxuXFx0XFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7XFxuXFx0XFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xcblxcdFxcdGJ2ZWM0IGluRnJ1c3R1bVZlYyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBzaGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGluRnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XFxuXFx0XFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMgPSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgZnJ1c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XFxuXFx0XFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHJldHVybiAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xcblxcdFxcdFxcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0cmV0dXJuIChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiAxLjA7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xcblxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XFxuXFx0XFx0dmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0JpYXMgKSAvIDEwMDAuMDtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dlNwb3RTaGFkb3dDb29yZFsgaSBdID0gc3BvdFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdFNwb3RMaWdodCBzcG90TGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRzaGFkb3cgKj0gYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gc2hhZG93O1xcbn1cXG5cIjtcblxudmFyIHNraW5iYXNlX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xcblxcdG1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xcblxcdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xcblxcdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xcbiNlbmRpZlwiO1xuXG52YXIgc2tpbm5pbmdfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XFxuXFx0I2lmZGVmIEJPTkVfVEVYVFVSRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xcblxcdFxcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgaiA9IGkgKiA0LjA7XFxuXFx0XFx0XFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XFxuXFx0XFx0XFx0dmVjNCB2MSA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5pbmdfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcXG5cXHRza2lubmVkICA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNraW5ub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VztcXG5cXHRza2luTWF0cml4ICA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XFxuXFx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzcGVjdWxhcm1hcF9mcmFnbWVudCA9IFwiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXFxuXFx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlV2ICk7XFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IHRleGVsU3BlY3VsYXIucjtcXG4jZWxzZVxcblxcdHNwZWN1bGFyU3RyZW5ndGggPSAxLjA7XFxuI2VuZGlmXCI7XG5cbnZhciBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX1NQRUNVTEFSTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciB0b25lbWFwcGluZ19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApXFxuICBnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xcbn1cXG52ZWMzIE9wdGltaXplZENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XFxuXFx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcXG59XFxuXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0dW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVhdDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHV2X3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXFxuXFx0dlV2ID0gdXYgKiBvZmZzZXRSZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHk7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdGF0dHJpYnV0ZSB2ZWMyIHV2MjtcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml92ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZVdjIgPSB1djI7XFxuI2VuZGlmXCI7XG5cbnZhciB3b3JsZHBvc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApIHx8IGRlZmluZWQoIExBTUJFUlQgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXFxuXFx0I2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdFxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogc2tpbm5lZDtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgY3ViZV9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkUG9zaXRpb24ueCwgdldvcmxkUG9zaXRpb24ueXogKSApO1xcblxcdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XFxufVxcblwiO1xuXG52YXIgY3ViZV92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dldvcmxkUG9zaXRpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGRlcHRoX2ZyYWcgPSBcIiNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGRpZmZ1c2VDb2xvci5hID0gb3BhY2l0eTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xcblxcdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcXG5cXHQjZW5kaWZcXG59XFxuXCI7XG5cbnZhciBkZXB0aF92ZXJ0ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBkaXN0YW5jZVJHQkFfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGxpZ2h0UG9zO1xcbnZhcnlpbmcgdmVjNCB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4gKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uLnh5eiAtIGxpZ2h0UG9zLnh5eiApIC8gMTAwMC4wICk7XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSBcInZhcnlpbmcgdmVjNCB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247XFxufVxcblwiO1xuXG52YXIgZXF1aXJlY3RfZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0c2FtcGxlVVYueSA9IHNhdHVyYXRlKCB0RmxpcCAqIGRpcmVjdGlvbi55ICogLTAuNSArIDAuNSApO1xcblxcdHNhbXBsZVVWLnggPSBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaGJhc2ljX3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaGxhbWJlcnRfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcXG5cXHQjaW5jbHVkZSA8bGlnaHRtYXBfZnJhZ21lbnQ+XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICk7XFxuXFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hsYW1iZXJ0X3ZlcnQgPSBcIiNkZWZpbmUgTEFNQkVSVFxcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBob25nX2ZyYWcgPSBcIiNkZWZpbmUgUEhPTkdcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xcbnVuaWZvcm0gZmxvYXQgc2hpbmluZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cXG4jaW5jbHVkZSA8bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19waG9uZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3RlbXBsYXRlPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaHBob25nX3ZlcnQgPSBcIiNkZWZpbmUgUEhPTkdcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF9mcmFnID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWZuZGVmIFNUQU5EQVJEXFxuXFx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXQ7XFxuXFx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXRSb3VnaG5lc3M7XFxuI2VuZGlmXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c190ZW1wbGF0ZT5cXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGh5c2ljYWxfdmVydCA9IFwiI2RlZmluZSBQSFlTSUNBTFxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnID0gXCIjZGVmaW5lIE5PUk1BTFxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tOb3JtYWxUb1JHQiggbm9ybWFsICksIG9wYWNpdHkgKTtcXG59XFxuXCI7XG5cbnZhciBub3JtYWxfdmVydCA9IFwiI2RlZmluZSBOT1JNQUxcXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuI2VuZGlmXFxufVxcblwiO1xuXG52YXIgcG9pbnRzX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgcG9pbnRzX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2l6ZTtcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxcblxcdFxcdGdsX1BvaW50U2l6ZSA9IHNpemUgKiAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTtcXG5cXHQjZWxzZVxcblxcdFxcdGdsX1BvaW50U2l6ZSA9IHNpemU7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIHNoYWRvd19mcmFnID0gXCJ1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xcbn1cXG5cIjtcblxudmFyIHNoYWRvd192ZXJ0ID0gXCIjaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnM6IGxpZ2h0c19wYXJzLFxuXHRsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCxcblx0bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfdGVtcGxhdGU6IGxpZ2h0c190ZW1wbGF0ZSxcblx0bG9nZGVwdGhidWZfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX2ZyYWdtZW50LFxuXHRsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50LFxuXHRsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDogbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgsXG5cdGxvZ2RlcHRoYnVmX3ZlcnRleDogbG9nZGVwdGhidWZfdmVydGV4LFxuXHRtYXBfZnJhZ21lbnQ6IG1hcF9mcmFnbWVudCxcblx0bWFwX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRtb3JwaG5vcm1hbF92ZXJ0ZXg6IG1vcnBobm9ybWFsX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LFxuXHRtb3JwaHRhcmdldF92ZXJ0ZXg6IG1vcnBodGFyZ2V0X3ZlcnRleCxcblx0bm9ybWFsX2ZsaXA6IG5vcm1hbF9mbGlwLFxuXHRub3JtYWxfZnJhZ21lbnQ6IG5vcm1hbF9mcmFnbWVudCxcblx0bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRwYWNraW5nOiBwYWNraW5nLFxuXHRwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50LFxuXHRwcm9qZWN0X3ZlcnRleDogcHJvamVjdF92ZXJ0ZXgsXG5cdGRpdGhlcmluZ19mcmFnbWVudDogZGl0aGVyaW5nX2ZyYWdtZW50LFxuXHRkaXRoZXJpbmdfcGFyc19mcmFnbWVudDogZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9mcmFnbWVudDogcm91Z2huZXNzbWFwX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfdmVydGV4OiBzaGFkb3dtYXBfcGFyc192ZXJ0ZXgsXG5cdHNoYWRvd21hcF92ZXJ0ZXg6IHNoYWRvd21hcF92ZXJ0ZXgsXG5cdHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDogc2hhZG93bWFza19wYXJzX2ZyYWdtZW50LFxuXHRza2luYmFzZV92ZXJ0ZXg6IHNraW5iYXNlX3ZlcnRleCxcblx0c2tpbm5pbmdfcGFyc192ZXJ0ZXg6IHNraW5uaW5nX3BhcnNfdmVydGV4LFxuXHRza2lubmluZ192ZXJ0ZXg6IHNraW5uaW5nX3ZlcnRleCxcblx0c2tpbm5vcm1hbF92ZXJ0ZXg6IHNraW5ub3JtYWxfdmVydGV4LFxuXHRzcGVjdWxhcm1hcF9mcmFnbWVudDogc3BlY3VsYXJtYXBfZnJhZ21lbnQsXG5cdHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX2ZyYWdtZW50OiB0b25lbWFwcGluZ19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDogdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCxcblx0dXZfcGFyc19mcmFnbWVudDogdXZfcGFyc19mcmFnbWVudCxcblx0dXZfcGFyc192ZXJ0ZXg6IHV2X3BhcnNfdmVydGV4LFxuXHR1dl92ZXJ0ZXg6IHV2X3ZlcnRleCxcblx0dXYyX3BhcnNfZnJhZ21lbnQ6IHV2Ml9wYXJzX2ZyYWdtZW50LFxuXHR1djJfcGFyc192ZXJ0ZXg6IHV2Ml9wYXJzX3ZlcnRleCxcblx0dXYyX3ZlcnRleDogdXYyX3ZlcnRleCxcblx0d29ybGRwb3NfdmVydGV4OiB3b3JsZHBvc192ZXJ0ZXgsXG5cblx0Y3ViZV9mcmFnOiBjdWJlX2ZyYWcsXG5cdGN1YmVfdmVydDogY3ViZV92ZXJ0LFxuXHRkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLFxuXHRkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LFxuXHRkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2ZyYWcsXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCxcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZyxcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCxcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LFxuXHRtZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCxcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZyxcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCxcblx0bWVzaHBob25nX2ZyYWc6IG1lc2hwaG9uZ19mcmFnLFxuXHRtZXNocGhvbmdfdmVydDogbWVzaHBob25nX3ZlcnQsXG5cdG1lc2hwaHlzaWNhbF9mcmFnOiBtZXNocGh5c2ljYWxfZnJhZyxcblx0bWVzaHBoeXNpY2FsX3ZlcnQ6IG1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRub3JtYWxfZnJhZzogbm9ybWFsX2ZyYWcsXG5cdG5vcm1hbF92ZXJ0OiBub3JtYWxfdmVydCxcblx0cG9pbnRzX2ZyYWc6IHBvaW50c19mcmFnLFxuXHRwb2ludHNfdmVydDogcG9pbnRzX3ZlcnQsXG5cdHNoYWRvd19mcmFnOiBzaGFkb3dfZnJhZyxcblx0c2hhZG93X3ZlcnQ6IHNoYWRvd192ZXJ0XG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqL1xuXG52YXIgU2hhZGVyTGliID0ge1xuXG5cdGJhc2ljOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZ1xuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY19mcmFnXG5cblx0fSxcblxuXHRsYW1iZXJ0OiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWdcblxuXHR9LFxuXG5cdHBob25nOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmdyYWRpZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHNwZWN1bGFyOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MTExMTExICkgfSxcblx0XHRcdFx0c2hpbmluZXNzOiB7IHZhbHVlOiAzMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX2ZyYWdcblxuXHR9LFxuXG5cdHN0YW5kYXJkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLnJvdWdobmVzc21hcCxcblx0XHRcdFVuaWZvcm1zTGliLm1ldGFsbmVzc21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRyb3VnaG5lc3M6IHsgdmFsdWU6IDAuNSB9LFxuXHRcdFx0XHRtZXRhbG5lc3M6IHsgdmFsdWU6IDAuNSB9LFxuXHRcdFx0XHRlbnZNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSAvLyB0ZW1wb3Jhcnlcblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZ1xuXG5cdH0sXG5cblx0cG9pbnRzOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIucG9pbnRzLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX2ZyYWdcblxuXHR9LFxuXG5cdGRhc2hlZDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0c2NhbGU6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0ZGFzaFNpemU6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0dG90YWxTaXplOiB7IHZhbHVlOiAyIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF9mcmFnXG5cblx0fSxcblxuXHRkZXB0aDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcFxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfZnJhZ1xuXG5cdH0sXG5cblx0bm9ybWFsOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdHtcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfZnJhZ1xuXG5cdH0sXG5cblx0LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvL1x0Q3ViZSBtYXAgc2hhZGVyXG5cdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Y3ViZToge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRDdWJlOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHR0RmxpcDogeyB2YWx1ZTogLSAxIH0sXG5cdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV9mcmFnXG5cblx0fSxcblxuXHQvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vXHRDdWJlIG1hcCBzaGFkZXJcblx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHRlcXVpcmVjdDoge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0dEZsaXA6IHsgdmFsdWU6IC0gMSB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZ1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VSR0JBOiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0bGlnaHRQb3M6IHsgdmFsdWU6IG5ldyBWZWN0b3IzKCkgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfZnJhZ1xuXG5cdH1cblxufTtcblxuU2hhZGVyTGliLnBoeXNpY2FsID0ge1xuXG5cdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0U2hhZGVyTGliLnN0YW5kYXJkLnVuaWZvcm1zLFxuXHRcdHtcblx0XHRcdGNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJDb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH1cblx0XHR9XG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gQm94MiggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IyKCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xuXG5cdFx0XHR2YXIgaGFsZlNpemUgPSB2MS5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gcmVzdWx0LnNldCggMCwgMCApIDogcmVzdWx0LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGdldFNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwICkgOiByZXN1bHQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjb250YWluc0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMZW5zRmxhcmVQbHVnaW4oIHJlbmRlcmVyLCBmbGFyZXMgKSB7XG5cblx0dmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDtcblx0dmFyIHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7XG5cblx0dmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjtcblx0dmFyIHNoYWRlciwgcHJvZ3JhbSwgYXR0cmlidXRlcywgdW5pZm9ybXM7XG5cblx0dmFyIHRlbXBUZXh0dXJlLCBvY2NsdXNpb25UZXh0dXJlO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDEsIC0gMSwgIDAsIDAsXG5cdFx0XHQgMSwgLSAxLCAgMSwgMCxcblx0XHRcdCAxLCAgMSwgIDEsIDEsXG5cdFx0XHQtIDEsICAxLCAgMCwgMVxuXHRcdF0gKTtcblxuXHRcdHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggW1xuXHRcdFx0MCwgMSwgMixcblx0XHRcdDAsIDIsIDNcblx0XHRdICk7XG5cblx0XHQvLyBidWZmZXJzXG5cblx0XHR2ZXJ0ZXhCdWZmZXIgICAgID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0ZWxlbWVudEJ1ZmZlciAgICA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZmFjZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHQvLyB0ZXh0dXJlc1xuXG5cdFx0dGVtcFRleHR1cmUgICAgICA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblx0XHRvY2NsdXNpb25UZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIHRlbXBUZXh0dXJlICk7XG5cdFx0Z2wudGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCLCAxNiwgMTYsIDAsIGdsLlJHQiwgZ2wuVU5TSUdORURfQllURSwgbnVsbCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QgKTtcblxuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBvY2NsdXNpb25UZXh0dXJlICk7XG5cdFx0Z2wudGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMTYsIDE2LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0c2hhZGVyID0ge1xuXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IFtcblxuXHRcdFx0XHRcInVuaWZvcm0gbG93cCBpbnQgcmVuZGVyVHlwZTtcIixcblxuXHRcdFx0XHRcInVuaWZvcm0gdmVjMyBzY3JlZW5Qb3NpdGlvbjtcIixcblx0XHRcdFx0XCJ1bmlmb3JtIHZlYzIgc2NhbGU7XCIsXG5cdFx0XHRcdFwidW5pZm9ybSBmbG9hdCByb3RhdGlvbjtcIixcblxuXHRcdFx0XHRcInVuaWZvcm0gc2FtcGxlcjJEIG9jY2x1c2lvbk1hcDtcIixcblxuXHRcdFx0XHRcImF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uO1wiLFxuXHRcdFx0XHRcImF0dHJpYnV0ZSB2ZWMyIHV2O1wiLFxuXG5cdFx0XHRcdFwidmFyeWluZyB2ZWMyIHZVVjtcIixcblx0XHRcdFx0XCJ2YXJ5aW5nIGZsb2F0IHZWaXNpYmlsaXR5O1wiLFxuXG5cdFx0XHRcdFwidm9pZCBtYWluKCkge1wiLFxuXG5cdFx0XHRcdFx0XCJ2VVYgPSB1djtcIixcblxuXHRcdFx0XHRcdFwidmVjMiBwb3MgPSBwb3NpdGlvbjtcIixcblxuXHRcdFx0XHRcdFwiaWYgKCByZW5kZXJUeXBlID09IDIgKSB7XCIsXG5cblx0XHRcdFx0XHRcdFwidmVjNCB2aXNpYmlsaXR5ID0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC4xICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC41LCAwLjEgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjksIDAuMSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC41ICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC45LCAwLjkgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjUsIDAuOSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC45ICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC4xLCAwLjUgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjUsIDAuNSApICk7XCIsXG5cblx0XHRcdFx0XHRcdFwidlZpc2liaWxpdHkgPSAgICAgICAgdmlzaWJpbGl0eS5yIC8gOS4wO1wiLFxuXHRcdFx0XHRcdFx0XCJ2VmlzaWJpbGl0eSAqPSAxLjAgLSB2aXNpYmlsaXR5LmcgLyA5LjA7XCIsXG5cdFx0XHRcdFx0XHRcInZWaXNpYmlsaXR5ICo9ICAgICAgIHZpc2liaWxpdHkuYiAvIDkuMDtcIixcblx0XHRcdFx0XHRcdFwidlZpc2liaWxpdHkgKj0gMS4wIC0gdmlzaWJpbGl0eS5hIC8gOS4wO1wiLFxuXG5cdFx0XHRcdFx0XHRcInBvcy54ID0gY29zKCByb3RhdGlvbiApICogcG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIHBvc2l0aW9uLnk7XCIsXG5cdFx0XHRcdFx0XHRcInBvcy55ID0gc2luKCByb3RhdGlvbiApICogcG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIHBvc2l0aW9uLnk7XCIsXG5cblx0XHRcdFx0XHRcIn1cIixcblxuXHRcdFx0XHRcdFwiZ2xfUG9zaXRpb24gPSB2ZWM0KCAoIHBvcyAqIHNjYWxlICsgc2NyZWVuUG9zaXRpb24ueHkgKS54eSwgc2NyZWVuUG9zaXRpb24ueiwgMS4wICk7XCIsXG5cblx0XHRcdFx0XCJ9XCJcblxuXHRcdFx0XS5qb2luKCBcIlxcblwiICksXG5cblx0XHRcdGZyYWdtZW50U2hhZGVyOiBbXG5cblx0XHRcdFx0XCJ1bmlmb3JtIGxvd3AgaW50IHJlbmRlclR5cGU7XCIsXG5cblx0XHRcdFx0XCJ1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XCIsXG5cdFx0XHRcdFwidW5pZm9ybSBmbG9hdCBvcGFjaXR5O1wiLFxuXHRcdFx0XHRcInVuaWZvcm0gdmVjMyBjb2xvcjtcIixcblxuXHRcdFx0XHRcInZhcnlpbmcgdmVjMiB2VVY7XCIsXG5cdFx0XHRcdFwidmFyeWluZyBmbG9hdCB2VmlzaWJpbGl0eTtcIixcblxuXHRcdFx0XHRcInZvaWQgbWFpbigpIHtcIixcblxuXHRcdFx0XHRcdC8vIHBpbmsgc3F1YXJlXG5cblx0XHRcdFx0XHRcImlmICggcmVuZGVyVHlwZSA9PSAwICkge1wiLFxuXG5cdFx0XHRcdFx0XHRcImdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAxLjAsIDAuMCApO1wiLFxuXG5cdFx0XHRcdFx0Ly8gcmVzdG9yZVxuXG5cdFx0XHRcdFx0XCJ9IGVsc2UgaWYgKCByZW5kZXJUeXBlID09IDEgKSB7XCIsXG5cblx0XHRcdFx0XHRcdFwiZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVViApO1wiLFxuXG5cdFx0XHRcdFx0Ly8gZmxhcmVcblxuXHRcdFx0XHRcdFwifSBlbHNlIHtcIixcblxuXHRcdFx0XHRcdFx0XCJ2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7XCIsXG5cdFx0XHRcdFx0XHRcInRleHR1cmUuYSAqPSBvcGFjaXR5ICogdlZpc2liaWxpdHk7XCIsXG5cdFx0XHRcdFx0XHRcImdsX0ZyYWdDb2xvciA9IHRleHR1cmU7XCIsXG5cdFx0XHRcdFx0XHRcImdsX0ZyYWdDb2xvci5yZ2IgKj0gY29sb3I7XCIsXG5cblx0XHRcdFx0XHRcIn1cIixcblxuXHRcdFx0XHRcIn1cIlxuXG5cdFx0XHRdLmpvaW4oIFwiXFxuXCIgKVxuXG5cdFx0fTtcblxuXHRcdHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCBzaGFkZXIgKTtcblxuXHRcdGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHR2ZXJ0ZXg6IGdsLmdldEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHR1djogICAgIGdsLmdldEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgXCJ1dlwiIClcblx0XHR9O1xuXG5cdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRyZW5kZXJUeXBlOiAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcInJlbmRlclR5cGVcIiApLFxuXHRcdFx0bWFwOiAgICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJtYXBcIiApLFxuXHRcdFx0b2NjbHVzaW9uTWFwOiAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJvY2NsdXNpb25NYXBcIiApLFxuXHRcdFx0b3BhY2l0eTogICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJvcGFjaXR5XCIgKSxcblx0XHRcdGNvbG9yOiAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwiY29sb3JcIiApLFxuXHRcdFx0c2NhbGU6ICAgICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJzY2FsZVwiICksXG5cdFx0XHRyb3RhdGlvbjogICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcInJvdGF0aW9uXCIgKSxcblx0XHRcdHNjcmVlblBvc2l0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwic2NyZWVuUG9zaXRpb25cIiApXG5cdFx0fTtcblxuXHR9XG5cblx0Lypcblx0ICogUmVuZGVyIGxlbnMgZmxhcmVzXG5cdCAqIE1ldGhvZDogcmVuZGVycyAxNngxNiAweGZmMDBmZi1jb2xvcmVkIHBvaW50cyBzY2F0dGVyZWQgb3ZlciB0aGUgbGlnaHQgc291cmNlIGFyZWEsXG5cdCAqICAgICAgICAgcmVhZHMgdGhlc2UgYmFjayBhbmQgY2FsY3VsYXRlcyBvY2NsdXNpb24uXG5cdCAqL1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhLCB2aWV3cG9ydCApIHtcblxuXHRcdGlmICggZmxhcmVzLmxlbmd0aCA9PT0gMCApIHJldHVybjtcblxuXHRcdHZhciB0ZW1wUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGludkFzcGVjdCA9IHZpZXdwb3J0LncgLyB2aWV3cG9ydC56LFxuXHRcdFx0aGFsZlZpZXdwb3J0V2lkdGggPSB2aWV3cG9ydC56ICogMC41LFxuXHRcdFx0aGFsZlZpZXdwb3J0SGVpZ2h0ID0gdmlld3BvcnQudyAqIDAuNTtcblxuXHRcdHZhciBzaXplID0gMTYgLyB2aWV3cG9ydC53LFxuXHRcdFx0c2NhbGUgPSBuZXcgVmVjdG9yMiggc2l6ZSAqIGludkFzcGVjdCwgc2l6ZSApO1xuXG5cdFx0dmFyIHNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoIDEsIDEsIDAgKSxcblx0XHRcdHNjcmVlblBvc2l0aW9uUGl4ZWxzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHRcdHZhciB2YWxpZEFyZWEgPSBuZXcgQm94MigpO1xuXG5cdFx0dmFsaWRBcmVhLm1pbi5zZXQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnkgKTtcblx0XHR2YWxpZEFyZWEubWF4LnNldCggdmlld3BvcnQueCArICggdmlld3BvcnQueiAtIDE2ICksIHZpZXdwb3J0LnkgKyAoIHZpZXdwb3J0LncgLSAxNiApICk7XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aW5pdCgpO1xuXG5cdFx0fVxuXG5cdFx0Z2wudXNlUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMudmVydGV4ICk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7XG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdC8vIGxvb3AgdGhyb3VnaCBhbGwgbGVucyBmbGFyZXMgdG8gdXBkYXRlIHRoZWlyIG9jY2x1c2lvbiBhbmQgcG9zaXRpb25zXG5cdFx0Ly8gc2V0dXAgZ2wgYW5kIGNvbW1vbiB1c2VkIGF0dHJpYnMvdW5pZm9ybXNcblxuXHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMub2NjbHVzaW9uTWFwLCAwICk7XG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDEgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy52ZXJ0ZXgsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTtcblx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnV2LCAyLCBnbC5GTE9BVCwgZmFsc2UsIDIgKiA4LCA4ICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXG5cdFx0c3RhdGUuZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBmYWxzZSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmxhcmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNpemUgPSAxNiAvIHZpZXdwb3J0Lnc7XG5cdFx0XHRzY2FsZS5zZXQoIHNpemUgKiBpbnZBc3BlY3QsIHNpemUgKTtcblxuXHRcdFx0Ly8gY2FsYyBvYmplY3Qgc2NyZWVuIHBvc2l0aW9uXG5cblx0XHRcdHZhciBmbGFyZSA9IGZsYXJlc1sgaSBdO1xuXG5cdFx0XHR0ZW1wUG9zaXRpb24uc2V0KCBmbGFyZS5tYXRyaXhXb3JsZC5lbGVtZW50c1sgMTIgXSwgZmxhcmUubWF0cml4V29ybGQuZWxlbWVudHNbIDEzIF0sIGZsYXJlLm1hdHJpeFdvcmxkLmVsZW1lbnRzWyAxNCBdICk7XG5cblx0XHRcdHRlbXBQb3NpdGlvbi5hcHBseU1hdHJpeDQoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdHRlbXBQb3NpdGlvbi5hcHBseU1hdHJpeDQoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdC8vIHNldHVwIGFycmF5cyBmb3IgZ2wgcHJvZ3JhbXNcblxuXHRcdFx0c2NyZWVuUG9zaXRpb24uY29weSggdGVtcFBvc2l0aW9uICk7XG5cblx0XHRcdC8vIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBwaXhlbHMgdG8gY29weVxuXG5cdFx0XHRzY3JlZW5Qb3NpdGlvblBpeGVscy54ID0gdmlld3BvcnQueCArICggc2NyZWVuUG9zaXRpb24ueCAqIGhhbGZWaWV3cG9ydFdpZHRoICkgKyBoYWxmVmlld3BvcnRXaWR0aCAtIDg7XG5cdFx0XHRzY3JlZW5Qb3NpdGlvblBpeGVscy55ID0gdmlld3BvcnQueSArICggc2NyZWVuUG9zaXRpb24ueSAqIGhhbGZWaWV3cG9ydEhlaWdodCApICsgaGFsZlZpZXdwb3J0SGVpZ2h0IC0gODtcblxuXHRcdFx0Ly8gc2NyZWVuIGN1bGxcblxuXHRcdFx0aWYgKCB2YWxpZEFyZWEuY29udGFpbnNQb2ludCggc2NyZWVuUG9zaXRpb25QaXhlbHMgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBzYXZlIGN1cnJlbnQgUkdCIHRvIHRlbXAgdGV4dHVyZVxuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBudWxsICk7XG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUxICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCB0ZW1wVGV4dHVyZSApO1xuXHRcdFx0XHRnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCLCBzY3JlZW5Qb3NpdGlvblBpeGVscy54LCBzY3JlZW5Qb3NpdGlvblBpeGVscy55LCAxNiwgMTYsIDAgKTtcblxuXG5cdFx0XHRcdC8vIHJlbmRlciBwaW5rIHF1YWRcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDAgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUueCwgc2NhbGUueSApO1xuXHRcdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLnNjcmVlblBvc2l0aW9uLCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55LCBzY3JlZW5Qb3NpdGlvbi56ICk7XG5cblx0XHRcdFx0c3RhdGUuZGlzYWJsZSggZ2wuQkxFTkQgKTtcblx0XHRcdFx0c3RhdGUuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cblx0XHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7XG5cblxuXHRcdFx0XHQvLyBjb3B5IHJlc3VsdCB0byBvY2NsdXNpb25NYXBcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgb2NjbHVzaW9uVGV4dHVyZSApO1xuXHRcdFx0XHRnbC5jb3B5VGV4SW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgc2NyZWVuUG9zaXRpb25QaXhlbHMueCwgc2NyZWVuUG9zaXRpb25QaXhlbHMueSwgMTYsIDE2LCAwICk7XG5cblxuXHRcdFx0XHQvLyByZXN0b3JlIGdyYXBoaWNzXG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5yZW5kZXJUeXBlLCAxICk7XG5cdFx0XHRcdHN0YXRlLmRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMSApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1cmUgKTtcblx0XHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7XG5cblxuXHRcdFx0XHQvLyB1cGRhdGUgb2JqZWN0IHBvc2l0aW9uc1xuXG5cdFx0XHRcdGZsYXJlLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHNjcmVlblBvc2l0aW9uICk7XG5cblx0XHRcdFx0aWYgKCBmbGFyZS5jdXN0b21VcGRhdGVDYWxsYmFjayApIHtcblxuXHRcdFx0XHRcdGZsYXJlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrKCBmbGFyZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmbGFyZS51cGRhdGVMZW5zRmxhcmVzKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHJlbmRlciBmbGFyZXNcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLnJlbmRlclR5cGUsIDIgKTtcblx0XHRcdFx0c3RhdGUuZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmbGFyZS5sZW5zRmxhcmVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNwcml0ZSA9IGZsYXJlLmxlbnNGbGFyZXNbIGogXTtcblxuXHRcdFx0XHRcdGlmICggc3ByaXRlLm9wYWNpdHkgPiAwLjAwMSAmJiBzcHJpdGUuc2NhbGUgPiAwLjAwMSApIHtcblxuXHRcdFx0XHRcdFx0c2NyZWVuUG9zaXRpb24ueCA9IHNwcml0ZS54O1xuXHRcdFx0XHRcdFx0c2NyZWVuUG9zaXRpb24ueSA9IHNwcml0ZS55O1xuXHRcdFx0XHRcdFx0c2NyZWVuUG9zaXRpb24ueiA9IHNwcml0ZS56O1xuXG5cdFx0XHRcdFx0XHRzaXplID0gc3ByaXRlLnNpemUgKiBzcHJpdGUuc2NhbGUgLyB2aWV3cG9ydC53O1xuXG5cdFx0XHRcdFx0XHRzY2FsZS54ID0gc2l6ZSAqIGludkFzcGVjdDtcblx0XHRcdFx0XHRcdHNjYWxlLnkgPSBzaXplO1xuXG5cdFx0XHRcdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLnNjcmVlblBvc2l0aW9uLCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55LCBzY3JlZW5Qb3NpdGlvbi56ICk7XG5cdFx0XHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnNjYWxlLCBzY2FsZS54LCBzY2FsZS55ICk7XG5cdFx0XHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLnJvdGF0aW9uLCBzcHJpdGUucm90YXRpb24gKTtcblxuXHRcdFx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBzcHJpdGUub3BhY2l0eSApO1xuXHRcdFx0XHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgc3ByaXRlLmNvbG9yLnIsIHNwcml0ZS5jb2xvci5nLCBzcHJpdGUuY29sb3IuYiApO1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5zZXRCbGVuZGluZyggc3ByaXRlLmJsZW5kaW5nLCBzcHJpdGUuYmxlbmRFcXVhdGlvbiwgc3ByaXRlLmJsZW5kU3JjLCBzcHJpdGUuYmxlbmREc3QgKTtcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldFRleHR1cmUyRCggc3ByaXRlLnRleHR1cmUsIDEgKTtcblxuXHRcdFx0XHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXN0b3JlIGdsXG5cblx0XHRzdGF0ZS5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApO1xuXG5cdFx0cmVuZGVyZXIucmVzZXRHTFN0YXRlKCk7XG5cblx0fTtcblxuXHRmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKCBzaGFkZXIgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHRcdHZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7XG5cdFx0dmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApO1xuXG5cdFx0dmFyIHByZWZpeCA9IFwicHJlY2lzaW9uIFwiICsgcmVuZGVyZXIuZ2V0UHJlY2lzaW9uKCkgKyBcIiBmbG9hdDtcXG5cIjtcblxuXHRcdGdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIHByZWZpeCArIHNoYWRlci5mcmFnbWVudFNoYWRlciApO1xuXHRcdGdsLnNoYWRlclNvdXJjZSggdmVydGV4U2hhZGVyLCBwcmVmaXggKyBzaGFkZXIudmVydGV4U2hhZGVyICk7XG5cblx0XHRnbC5jb21waWxlU2hhZGVyKCBmcmFnbWVudFNoYWRlciApO1xuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIHZlcnRleFNoYWRlciApO1xuXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApO1xuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7XG5cblx0XHRnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlUGx1Z2luKCByZW5kZXJlciwgc3ByaXRlcyApIHtcblxuXHR2YXIgZ2wgPSByZW5kZXJlci5jb250ZXh0O1xuXHR2YXIgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcblxuXHR2YXIgdmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyO1xuXHR2YXIgcHJvZ3JhbSwgYXR0cmlidXRlcywgdW5pZm9ybXM7XG5cblx0dmFyIHRleHR1cmU7XG5cblx0Ly8gZGVjb21wb3NlIG1hdHJpeFdvcmxkXG5cblx0dmFyIHNwcml0ZVBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHNwcml0ZVJvdGF0aW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNwcml0ZVNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggW1xuXHRcdFx0LSAwLjUsIC0gMC41LCAgMCwgMCxcblx0XHRcdCAgMC41LCAtIDAuNSwgIDEsIDAsXG5cdFx0XHQgIDAuNSwgICAwLjUsICAxLCAxLFxuXHRcdFx0LSAwLjUsICAgMC41LCAgMCwgMVxuXHRcdF0gKTtcblxuXHRcdHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggW1xuXHRcdFx0MCwgMSwgMixcblx0XHRcdDAsIDIsIDNcblx0XHRdICk7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIgID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0ZWxlbWVudEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZmFjZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0YXR0cmlidXRlcyA9IHtcblx0XHRcdHBvc2l0aW9uOlx0XHRcdGdsLmdldEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgJ3Bvc2l0aW9uJyApLFxuXHRcdFx0dXY6XHRcdFx0XHRcdGdsLmdldEF0dHJpYkxvY2F0aW9uICggcHJvZ3JhbSwgJ3V2JyApXG5cdFx0fTtcblxuXHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0dXZPZmZzZXQ6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAndXZPZmZzZXQnICksXG5cdFx0XHR1dlNjYWxlOlx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksXG5cblx0XHRcdHJvdGF0aW9uOlx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3JvdGF0aW9uJyApLFxuXHRcdFx0c2NhbGU6XHRcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdzY2FsZScgKSxcblxuXHRcdFx0Y29sb3I6XHRcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdjb2xvcicgKSxcblx0XHRcdG1hcDpcdFx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21hcCcgKSxcblx0XHRcdG9wYWNpdHk6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnb3BhY2l0eScgKSxcblxuXHRcdFx0bW9kZWxWaWV3TWF0cml4OiBcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21vZGVsVmlld01hdHJpeCcgKSxcblx0XHRcdHByb2plY3Rpb25NYXRyaXg6XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdwcm9qZWN0aW9uTWF0cml4JyApLFxuXG5cdFx0XHRmb2dUeXBlOlx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ1R5cGUnICksXG5cdFx0XHRmb2dEZW5zaXR5Olx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksXG5cdFx0XHRmb2dOZWFyOlx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ05lYXInICksXG5cdFx0XHRmb2dGYXI6XHRcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksXG5cdFx0XHRmb2dDb2xvcjpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dDb2xvcicgKSxcblxuXHRcdFx0YWxwaGFUZXN0Olx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2FscGhhVGVzdCcgKVxuXHRcdH07XG5cblx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0Y2FudmFzLndpZHRoID0gODtcblx0XHRjYW52YXMuaGVpZ2h0ID0gODtcblxuXHRcdHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XG5cdFx0Y29udGV4dC5maWxsUmVjdCggMCwgMCwgOCwgOCApO1xuXG5cdFx0dGV4dHVyZSA9IG5ldyBUZXh0dXJlKCBjYW52YXMgKTtcblx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNwcml0ZXMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gc2V0dXAgZ2xcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbml0KCk7XG5cblx0XHR9XG5cblx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy5wb3NpdGlvbiApO1xuXHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy51diApO1xuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRzdGF0ZS5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblx0XHRzdGF0ZS5lbmFibGUoIGdsLkJMRU5EICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMucG9zaXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTtcblx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnV2LCAyLCBnbC5GTE9BVCwgZmFsc2UsIDIgKiA4LCA4ICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMucHJvamVjdGlvbk1hdHJpeCwgZmFsc2UsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzICk7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMCApO1xuXHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMubWFwLCAwICk7XG5cblx0XHR2YXIgb2xkRm9nVHlwZSA9IDA7XG5cdFx0dmFyIHNjZW5lRm9nVHlwZSA9IDA7XG5cdFx0dmFyIGZvZyA9IHNjZW5lLmZvZztcblxuXHRcdGlmICggZm9nICkge1xuXG5cdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmZvZ0NvbG9yLCBmb2cuY29sb3IuciwgZm9nLmNvbG9yLmcsIGZvZy5jb2xvci5iICk7XG5cblx0XHRcdGlmICggZm9nLmlzRm9nICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nTmVhciwgZm9nLm5lYXIgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dGYXIsIGZvZy5mYXIgKTtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDEgKTtcblx0XHRcdFx0b2xkRm9nVHlwZSA9IDE7XG5cdFx0XHRcdHNjZW5lRm9nVHlwZSA9IDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dEZW5zaXR5LCBmb2cuZGVuc2l0eSApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMiApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMjtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMjtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAwICk7XG5cdFx0XHRvbGRGb2dUeXBlID0gMDtcblx0XHRcdHNjZW5lRm9nVHlwZSA9IDA7XG5cblx0XHR9XG5cblxuXHRcdC8vIHVwZGF0ZSBwb3NpdGlvbnMgYW5kIHNvcnRcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblxuXHRcdFx0c3ByaXRlLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBzcHJpdGUubWF0cml4V29ybGQgKTtcblx0XHRcdHNwcml0ZS56ID0gLSBzcHJpdGUubW9kZWxWaWV3TWF0cml4LmVsZW1lbnRzWyAxNCBdO1xuXG5cdFx0fVxuXG5cdFx0c3ByaXRlcy5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGFsbCBzcHJpdGVzXG5cblx0XHR2YXIgc2NhbGUgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmFscGhhVGVzdCwgbWF0ZXJpYWwuYWxwaGFUZXN0ICk7XG5cdFx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5tb2RlbFZpZXdNYXRyaXgsIGZhbHNlLCBzcHJpdGUubW9kZWxWaWV3TWF0cml4LmVsZW1lbnRzICk7XG5cblx0XHRcdHNwcml0ZS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHNwcml0ZVBvc2l0aW9uLCBzcHJpdGVSb3RhdGlvbiwgc3ByaXRlU2NhbGUgKTtcblxuXHRcdFx0c2NhbGVbIDAgXSA9IHNwcml0ZVNjYWxlLng7XG5cdFx0XHRzY2FsZVsgMSBdID0gc3ByaXRlU2NhbGUueTtcblxuXHRcdFx0dmFyIGZvZ1R5cGUgPSAwO1xuXG5cdFx0XHRpZiAoIHNjZW5lLmZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7XG5cblx0XHRcdFx0Zm9nVHlwZSA9IHNjZW5lRm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9sZEZvZ1R5cGUgIT09IGZvZ1R5cGUgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCBmb2dUeXBlICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSBmb2dUeXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZPZmZzZXQsIG1hdGVyaWFsLm1hcC5vZmZzZXQueCwgbWF0ZXJpYWwubWFwLm9mZnNldC55ICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZTY2FsZSwgbWF0ZXJpYWwubWFwLnJlcGVhdC54LCBtYXRlcmlhbC5tYXAucmVwZWF0LnkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCAwLCAwICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZTY2FsZSwgMSwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMub3BhY2l0eSwgbWF0ZXJpYWwub3BhY2l0eSApO1xuXHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgbWF0ZXJpYWwuY29sb3IuciwgbWF0ZXJpYWwuY29sb3IuZywgbWF0ZXJpYWwuY29sb3IuYiApO1xuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLnJvdGF0aW9uLCBtYXRlcmlhbC5yb3RhdGlvbiApO1xuXHRcdFx0Z2wudW5pZm9ybTJmdiggdW5pZm9ybXMuc2NhbGUsIHNjYWxlICk7XG5cblx0XHRcdHN0YXRlLnNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0ICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFRleHR1cmUyRCggbWF0ZXJpYWwubWFwLCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7XG5cblx0XHR9XG5cblx0XHQvLyByZXN0b3JlIGdsXG5cblx0XHRzdGF0ZS5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0cmVuZGVyZXIucmVzZXRHTFN0YXRlKCk7XG5cblx0fTtcblxuXHRmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKCkge1xuXG5cdFx0dmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cblx0XHR2YXIgdmVydGV4U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5WRVJURVhfU0hBREVSICk7XG5cdFx0dmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTtcblxuXHRcdGdsLnNoYWRlclNvdXJjZSggdmVydGV4U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHJlbmRlcmVyLmdldFByZWNpc2lvbigpICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCByb3RhdGlvbjsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiBzY2FsZTsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiB1dk9mZnNldDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiB1dlNjYWxlOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCd2YXJ5aW5nIHZlYzIgdlVWOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0XHQndlVWID0gdXZPZmZzZXQgKyB1diAqIHV2U2NhbGU7JyxcblxuXHRcdFx0XHQndmVjMiBhbGlnbmVkUG9zaXRpb24gPSBwb3NpdGlvbiAqIHNjYWxlOycsXG5cblx0XHRcdFx0J3ZlYzIgcm90YXRlZFBvc2l0aW9uOycsXG5cdFx0XHRcdCdyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7Jyxcblx0XHRcdFx0J3JvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsnLFxuXG5cdFx0XHRcdCd2ZWM0IGZpbmFsUG9zaXRpb247JyxcblxuXHRcdFx0XHQnZmluYWxQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOycsXG5cdFx0XHRcdCdmaW5hbFBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsnLFxuXHRcdFx0XHQnZmluYWxQb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBmaW5hbFBvc2l0aW9uOycsXG5cblx0XHRcdFx0J2dsX1Bvc2l0aW9uID0gZmluYWxQb3NpdGlvbjsnLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuc2hhZGVyU291cmNlKCBmcmFnbWVudFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyByZW5kZXJlci5nZXRQcmVjaXNpb24oKSArICcgZmxvYXQ7JyxcblxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjb2xvcjsnLFxuXHRcdFx0J3VuaWZvcm0gc2FtcGxlcjJEIG1hcDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgb3BhY2l0eTsnLFxuXG5cdFx0XHQndW5pZm9ybSBpbnQgZm9nVHlwZTsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBmb2dDb2xvcjsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgZm9nTmVhcjsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgZm9nRmFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBhbHBoYVRlc3Q7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHRcdCd2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7JyxcblxuXHRcdFx0XHQnaWYgKCB0ZXh0dXJlLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOycsXG5cblx0XHRcdFx0J2dsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yICogdGV4dHVyZS54eXosIHRleHR1cmUuYSAqIG9wYWNpdHkgKTsnLFxuXG5cdFx0XHRcdCdpZiAoIGZvZ1R5cGUgPiAwICkgeycsXG5cblx0XHRcdFx0XHQnZmxvYXQgZGVwdGggPSBnbF9GcmFnQ29vcmQueiAvIGdsX0ZyYWdDb29yZC53OycsXG5cdFx0XHRcdFx0J2Zsb2F0IGZvZ0ZhY3RvciA9IDAuMDsnLFxuXG5cdFx0XHRcdFx0J2lmICggZm9nVHlwZSA9PSAxICkgeycsXG5cblx0XHRcdFx0XHRcdCdmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGRlcHRoICk7JyxcblxuXHRcdFx0XHRcdCd9IGVsc2UgeycsXG5cblx0XHRcdFx0XHRcdCdjb25zdCBmbG9hdCBMT0cyID0gMS40NDI2OTU7Jyxcblx0XHRcdFx0XHRcdCdmb2dGYWN0b3IgPSBleHAyKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZGVwdGggKiBkZXB0aCAqIExPRzIgKTsnLFxuXHRcdFx0XHRcdFx0J2ZvZ0ZhY3RvciA9IDEuMCAtIGNsYW1wKCBmb2dGYWN0b3IsIDAuMCwgMS4wICk7JyxcblxuXHRcdFx0XHRcdCd9JyxcblxuXHRcdFx0XHRcdCdnbF9GcmFnQ29sb3IgPSBtaXgoIGdsX0ZyYWdDb2xvciwgdmVjNCggZm9nQ29sb3IsIGdsX0ZyYWdDb2xvci53ICksIGZvZ0ZhY3RvciApOycsXG5cblx0XHRcdFx0J30nLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRcdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdFx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYi5pZCAtIGEuaWQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxudmFyIG1hdGVyaWFsSWQgPSAwO1xuXG5mdW5jdGlvbiBNYXRlcmlhbCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG1hdGVyaWFsSWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZm9nID0gdHJ1ZTtcblx0dGhpcy5saWdodHMgPSB0cnVlO1xuXG5cdHRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZztcblx0dGhpcy5zaWRlID0gRnJvbnRTaWRlO1xuXHR0aGlzLnNoYWRpbmcgPSBTbW9vdGhTaGFkaW5nOyAvLyBUSFJFRS5GbGF0U2hhZGluZywgVEhSRUUuU21vb3RoU2hhZGluZ1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzXG5cblx0dGhpcy5vcGFjaXR5ID0gMTtcblx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG5cdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cblx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcblx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xuXHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsO1xuXHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcblx0dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3JXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5wcmVjaXNpb24gPSBudWxsOyAvLyBvdmVycmlkZSB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IHByZWNpc2lvbiBmb3IgdGhpcyBtYXRlcmlhbFxuXG5cdHRoaXMucG9seWdvbk9mZnNldCA9IGZhbHNlO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IDA7XG5cblx0dGhpcy5kaXRoZXJpbmcgPSBmYWxzZTtcblxuXHR0aGlzLmFscGhhVGVzdCA9IDA7XG5cdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XG5cblx0dGhpcy5vdmVyZHJhdyA9IDA7IC8vIE92ZXJkcmF3biBwaXhlbHMgKHR5cGljYWxseSBiZXR3ZWVuIDAgYW5kIDEpIGZvciBmaXhpbmcgYW50aWFsaWFzaW5nIGdhcHMgaW4gQ2FudmFzUmVuZGVyZXJcblxuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdGVyaWFsLnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGlzTWF0ZXJpYWw6IHRydWUsXG5cblx0c2V0VmFsdWVzOiBmdW5jdGlvbiAoIHZhbHVlcyApIHtcblxuXHRcdGlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0dmFyIG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRlcmlhbDogJ1wiICsga2V5ICsgXCInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5cIiArIHRoaXMudHlwZSArIFwiOiAnXCIgKyBrZXkgKyBcIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuY29weSggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnb3ZlcmRyYXcnICkge1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBvdmVyZHJhdyBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBib29sZWFuIHR5cGVcblx0XHRcdFx0dGhpc1sga2V5IF0gPSBOdW1iZXIoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290ID0gbWV0YSA9PT0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBpc1Jvb3QgKSB7XG5cblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcblx0XHRcdFx0aW1hZ2VzOiB7fVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnTWF0ZXJpYWwnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdNYXRlcmlhbC50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIE1hdGVyaWFsIHNlcmlhbGl6YXRpb25cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3IuaXNDb2xvciApIGRhdGEuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXG5cdFx0aWYgKCB0aGlzLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5yb3VnaG5lc3MgPSB0aGlzLnJvdWdobmVzcztcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLm1ldGFsbmVzcyA9IHRoaXMubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlICYmIHRoaXMuZW1pc3NpdmUuaXNDb2xvciApIGRhdGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpO1xuXHRcdGlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzO1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0ID0gdGhpcy5jbGVhckNvYXQ7XG5cdFx0aWYgKCB0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhckNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRcdGlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmxpZ2h0TWFwICYmIHRoaXMubGlnaHRNYXAuaXNUZXh0dXJlICkgZGF0YS5saWdodE1hcCA9IHRoaXMubGlnaHRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYnVtcE1hcCAmJiB0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmJ1bXBNYXAgPSB0aGlzLmJ1bXBNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuYnVtcFNjYWxlID0gdGhpcy5idW1wU2NhbGU7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblx0XHRpZiAoIHRoaXMuZGlzcGxhY2VtZW50TWFwICYmIHRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRNYXAgPSB0aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudEJpYXMgPSB0aGlzLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLnJvdWdobmVzc01hcCAmJiB0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLnJvdWdobmVzc01hcCA9IHRoaXMucm91Z2huZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzc01hcCAmJiB0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLm1ldGFsbmVzc01hcCA9IHRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmVNYXAgJiYgdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUgKSBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5zcGVjdWxhck1hcCAmJiB0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSApIGRhdGEuc3BlY3VsYXJNYXAgPSB0aGlzLnNwZWN1bGFyTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMuZW52TWFwICYmIHRoaXMuZW52TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5lbnZNYXAgPSB0aGlzLmVudk1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5yZWZsZWN0aXZpdHkgPSB0aGlzLnJlZmxlY3Rpdml0eTsgLy8gU2NhbGUgYmVoaW5kIGVudk1hcFxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmdyYWRpZW50TWFwID0gdGhpcy5ncmFkaWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTtcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0aWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nO1xuXHRcdGlmICggdGhpcy5zaGFkaW5nICE9PSBTbW9vdGhTaGFkaW5nICkgZGF0YS5zaGFkaW5nID0gdGhpcy5zaGFkaW5nO1xuXHRcdGlmICggdGhpcy5zaWRlICE9PSBGcm9udFNpZGUgKSBkYXRhLnNpZGUgPSB0aGlzLnNpZGU7XG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSBkYXRhLnZlcnRleENvbG9ycyA9IHRoaXMudmVydGV4Q29sb3JzO1xuXG5cdFx0aWYgKCB0aGlzLm9wYWNpdHkgPCAxICkgZGF0YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSApIGRhdGEudHJhbnNwYXJlbnQgPSB0aGlzLnRyYW5zcGFyZW50O1xuXG5cdFx0ZGF0YS5kZXB0aEZ1bmMgPSB0aGlzLmRlcHRoRnVuYztcblx0XHRkYXRhLmRlcHRoVGVzdCA9IHRoaXMuZGVwdGhUZXN0O1xuXHRcdGRhdGEuZGVwdGhXcml0ZSA9IHRoaXMuZGVwdGhXcml0ZTtcblxuXHRcdGlmICggdGhpcy5hbHBoYVRlc3QgPiAwICkgZGF0YS5hbHBoYVRlc3QgPSB0aGlzLmFscGhhVGVzdDtcblx0XHRpZiAoIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkgZGF0YS5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRkYXRhLnNraW5uaW5nID0gdGhpcy5za2lubmluZztcblx0XHRkYXRhLm1vcnBoVGFyZ2V0cyA9IHRoaXMubW9ycGhUYXJnZXRzO1xuXG5cdFx0ZGF0YS5kaXRoZXJpbmcgPSB0aGlzLmRpdGhlcmluZztcblxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxuXG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBjYWNoZSApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTtcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzO1xuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcblx0XHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cblx0XHR0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nO1xuXHRcdHRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlO1xuXHRcdHRoaXMuc2hhZGluZyA9IHNvdXJjZS5zaGFkaW5nO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXG5cdFx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0dGhpcy5vdmVyZHJhdyA9IHNvdXJjZS5vdmVyZHJhdztcblxuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xuXHRcdHRoaXMuY2xpcFNoYWRvd3MgPSBzb3VyY2UuY2xpcFNoYWRvd3M7XG5cdFx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gc291cmNlLmNsaXBJbnRlcnNlY3Rpb247XG5cblx0XHR2YXIgc3JjUGxhbmVzID0gc291cmNlLmNsaXBwaW5nUGxhbmVzLFxuXHRcdFx0ZHN0UGxhbmVzID0gbnVsbDtcblxuXHRcdGlmICggc3JjUGxhbmVzICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgbiA9IHNyY1BsYW5lcy5sZW5ndGg7XG5cdFx0XHRkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRcdFx0ZHN0UGxhbmVzWyBpIF0gPSBzcmNQbGFuZXNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBsYW5lcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGRlZmluZXM6IHsgXCJsYWJlbFwiIDogXCJ2YWx1ZVwiIH0sXG4gKiAgdW5pZm9ybXM6IHsgXCJwYXJhbWV0ZXIxXCI6IHsgdmFsdWU6IDEuMCB9LCBcInBhcmFtZXRlcjJcIjogeyB2YWx1ZTI6IDIgfSB9LFxuICpcbiAqICBmcmFnbWVudFNoYWRlcjogPHN0cmluZz4sXG4gKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBsaWdodHM6IDxib29sPixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHt9O1xuXHR0aGlzLnVuaWZvcm1zID0ge307XG5cblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG59Jztcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XFxufSc7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZ1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0c1xuXHR0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lc1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBza2lubmluZyBhdHRyaWJ1dGUgc3RyZWFtc1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHNcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzXG5cblx0dGhpcy5leHRlbnNpb25zID0ge1xuXHRcdGRlcml2YXRpdmVzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkZXJpdmF0aXZlc1xuXHRcdGZyYWdEZXB0aDogZmFsc2UsIC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzXG5cdFx0ZHJhd0J1ZmZlcnM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVyc1xuXHRcdHNoYWRlclRleHR1cmVMT0Q6IGZhbHNlIC8vIHNldCB0byB1c2Ugc2hhZGVyIHRleHR1cmUgTE9EXG5cdH07XG5cblx0Ly8gV2hlbiByZW5kZXJlZCBnZW9tZXRyeSBkb2Vzbid0IGluY2x1ZGUgdGhlc2UgYXR0cmlidXRlcyBidXQgdGhlIG1hdGVyaWFsIGRvZXMsXG5cdC8vIHVzZSB0aGVzZSBkZWZhdWx0IHZhbHVlcyBpbiBXZWJHTC4gVGhpcyBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy5cblx0dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuXHRcdCdjb2xvcic6IFsgMSwgMSwgMSBdLFxuXHRcdCd1dic6IFsgMCwgMCBdLFxuXHRcdCd1djInOiBbIDAsIDAgXVxuXHR9O1xuXG5cdHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDtcblxuXHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggcGFyYW1ldGVycy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxufVxuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBzb3VyY2UudmVydGV4U2hhZGVyO1xuXG5cdHRoaXMudW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzb3VyY2UudW5pZm9ybXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSBzb3VyY2UuZGVmaW5lcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cdHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSBzb3VyY2UuZXh0ZW5zaW9ucztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHR2YXIgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdGRhdGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zO1xuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwczovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaERlcHRoTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7XG5cblx0dGhpcy5kZXB0aFBhY2tpbmcgPSBCYXNpY0RlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hEZXB0aE1hdGVyaWFsO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGVwdGhNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZXB0aFBhY2tpbmcgPSBzb3VyY2UuZGVwdGhQYWNraW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIEJveDMoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0aXNCb3gzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR2YXIgbWluWCA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblkgPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5aID0gKyBJbmZpbml0eTtcblxuXHRcdHZhciBtYXhYID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WSA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFogPSAtIEluZmluaXR5O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHR2YXIgeCA9IGFycmF5WyBpIF07XG5cdFx0XHR2YXIgeSA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0dmFyIHogPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0aWYgKCB6IDwgbWluWiApIG1pblogPSB6O1xuXG5cdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cdFx0XHRpZiAoIHogPiBtYXhaICkgbWF4WiA9IHo7XG5cblx0XHR9XG5cblx0XHR0aGlzLm1pbi5zZXQoIG1pblgsIG1pblksIG1pblogKTtcblx0XHR0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHR2YXIgbWluWCA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblkgPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5aID0gKyBJbmZpbml0eTtcblxuXHRcdHZhciBtYXhYID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WSA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFogPSAtIEluZmluaXR5O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0dmFyIHkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0dmFyIHogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRcdHZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gdGhpcy5taW4ueiA9ICsgSW5maW5pdHk7XG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApIHx8ICggdGhpcy5tYXgueiA8IHRoaXMubWluLnogKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAsIDAgKSA6IHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gcmVzdWx0LnNldCggMCwgMCwgMCApIDogcmVzdWx0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5T2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBDb21wdXRlcyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBvZiBhbiBvYmplY3QgKGluY2x1ZGluZyBpdHMgY2hpbGRyZW4pLFxuXHRcdC8vIGFjY291bnRpbmcgZm9yIGJvdGggdGhlIG9iamVjdCdzLCBhbmQgY2hpbGRyZW4ncywgd29ybGQgdHJhbnNmb3Jtc1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0XHRvYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0b2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cblx0XHRcdFx0dmFyIGksIGw7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gbm9kZS5nZW9tZXRyeTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0djEuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRcdFx0XHR2MS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdFx0XHRzY29wZS5leHBhbmRCeVBvaW50KCB2MSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHR2MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkgKS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdHBvaW50LnogPCB0aGlzLm1pbi56IHx8IHBvaW50LnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJlxuXHRcdFx0dGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSxcblx0XHRcdCggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRoaXMubWluLnogKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDYgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zLlxuXHRcdHJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0Ym94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gubWluLnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgY2xvc2VzdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XG5cblx0XHRcdC8vIEZpbmQgdGhlIHBvaW50IG9uIHRoZSBBQUJCIGNsb3Nlc3QgdG8gdGhlIHNwaGVyZSBjZW50ZXIuXG5cdFx0XHR0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHQvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFCQiBhbmQgc3BoZXJlIGludGVyc2VjdC5cblx0XHRcdHJldHVybiBjbG9zZXN0UG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXNcblx0XHQvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cblxuXHRcdHZhciBtaW4sIG1heDtcblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnggPiAwICkge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnogPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICggbWluIDw9IHBsYW5lLmNvbnN0YW50ICYmIG1heCA+PSBwbGFuZS5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0Qm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0Qm91bmRpbmdTcGhlcmUoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFNwaGVyZSgpO1xuXG5cdFx0XHR0aGlzLmdldENlbnRlciggcmVzdWx0LmNlbnRlciApO1xuXG5cdFx0XHRyZXN1bHQucmFkaXVzID0gdGhpcy5nZXRTaXplKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0Ly8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLlxuXHRcdGlmKCB0aGlzLmlzRW1wdHkoKSApIHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb2ludHMgPSBbXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKVxuXHRcdF07XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XG5cblx0XHRcdC8vIHRyYW5zZm9ybSBvZiBlbXB0eSBib3ggaXMgYW4gZW1wdHkgYm94LlxuXHRcdFx0aWYoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJuIHRoaXM7XG5cblx0XHRcdC8vIE5PVEU6IEkgYW0gdXNpbmcgYSBiaW5hcnkgcGF0dGVybiB0byBzcGVjaWZ5IGFsbCAyXjMgY29tYmluYXRpb25zIGJlbG93XG5cdFx0XHRwb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDBcblx0XHRcdHBvaW50c1sgMSBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMVxuXHRcdFx0cG9pbnRzWyAyIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDEwXG5cdFx0XHRwb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTFcblx0XHRcdHBvaW50c1sgNCBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMFxuXHRcdFx0cG9pbnRzWyA1IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAxXG5cdFx0XHRwb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTBcblx0XHRcdHBvaW50c1sgNyBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHQvLyAxMTFcblxuXHRcdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3BoZXJlKCBjZW50ZXIsIHJhZGl1cyApIHtcblxuXHR0aGlzLmNlbnRlciA9ICggY2VudGVyICE9PSB1bmRlZmluZWQgKSA/IGNlbnRlciA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmUucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Qb2ludHMoIHBvaW50cywgb3B0aW9uYWxDZW50ZXIgKSB7XG5cblx0XHRcdHZhciBjZW50ZXIgPSB0aGlzLmNlbnRlcjtcblxuXHRcdFx0aWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5jb3B5KCBvcHRpb25hbENlbnRlciApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKS5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtYXhSYWRpdXNTcSA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnRzWyBpIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNwaGVyZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLnJhZGl1cyA8PSAwICk7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG8oIHRoaXMuY2VudGVyICkgLSB0aGlzLnJhZGl1cyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR2YXIgcmFkaXVzU3VtID0gdGhpcy5yYWRpdXMgKyBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBXZSB1c2UgdGhlIGZvbGxvd2luZyBlcXVhdGlvbiB0byBjb21wdXRlIHRoZSBzaWduZWQgZGlzdGFuY2UgZnJvbVxuXHRcdC8vIHRoZSBjZW50ZXIgb2YgdGhlIHNwaGVyZSB0byB0aGUgcGxhbmUuXG5cdFx0Ly9cblx0XHQvLyBkaXN0YW5jZSA9IHEgKiBuIC0gZFxuXHRcdC8vXG5cdFx0Ly8gSWYgdGhpcyBkaXN0YW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHJhZGl1cyBvZiB0aGUgc3BoZXJlLFxuXHRcdC8vIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLmNlbnRlci5kb3QoIHBsYW5lLm5vcm1hbCApIC0gcGxhbmUuY29uc3RhbnQgKSA8PSB0aGlzLnJhZGl1cztcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGRlbHRhTGVuZ3RoU3EgPSB0aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmVzdWx0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0cmVzdWx0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHJlc3VsdC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Z2V0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgYm94ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IEJveDMoKTtcblxuXHRcdGJveC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApO1xuXHRcdGJveC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTtcblxuXHRcdHJldHVybiBib3g7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4MygpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCxcblx0XHQwLCAxLCAwLFxuXHRcdDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXgzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7XG5cdFx0dGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjtcblx0XHR0ZVsgNiBdID0gbjEzOyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyA0IF0sIG1lWyAgOCBdLFxuXHRcdFx0bWVbIDEgXSwgbWVbIDUgXSwgbWVbICA5IF0sXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0djEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHRcdHYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0XHR2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0XHR2MS5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGFlID0gYS5lbGVtZW50cztcblx0XHR2YXIgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDMgXSwgYTEzID0gYWVbIDYgXTtcblx0XHR2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDUgXSwgYTMzID0gYWVbIDggXTtcblxuXHRcdHZhciBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgMyBdLCBiMTMgPSBiZVsgNiBdO1xuXHRcdHZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNSBdLCBiMzMgPSBiZVsgOCBdO1xuXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTtcblx0XHR0ZVsgMyBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyO1xuXHRcdHRlWyA2IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzM7XG5cblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxO1xuXHRcdHRlWyA0IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzI7XG5cdFx0dGVbIDcgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMztcblxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzE7XG5cdFx0dGVbIDUgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjtcblx0XHR0ZVsgOCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDMgXSAqPSBzOyB0ZVsgNiBdICo9IHM7XG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA3IF0gKj0gcztcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDggXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhID0gdGVbIDAgXSwgYiA9IHRlWyAxIF0sIGMgPSB0ZVsgMiBdLFxuXHRcdFx0ZCA9IHRlWyAzIF0sIGUgPSB0ZVsgNCBdLCBmID0gdGVbIDUgXSxcblx0XHRcdGcgPSB0ZVsgNiBdLCBoID0gdGVbIDcgXSwgaSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnO1xuXG5cdH0sXG5cblx0Z2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtYXRyaXgsIHRocm93T25EZWdlbmVyYXRlICkge1xuXG5cdFx0aWYgKCBtYXRyaXggJiYgbWF0cml4LmlzTWF0cml4NCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5NYXRyaXgzLmdldEludmVyc2Ugbm8gbG9uZ2VyIHRha2VzIGEgTWF0cml4NCBhcmd1bWVudC5cIiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzLFxuXHRcdFx0dGUgPSB0aGlzLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLFxuXHRcdFx0bjEyID0gbWVbIDMgXSwgbjIyID0gbWVbIDQgXSwgbjMyID0gbWVbIDUgXSxcblx0XHRcdG4xMyA9IG1lWyA2IF0sIG4yMyA9IG1lWyA3IF0sIG4zMyA9IG1lWyA4IF0sXG5cblx0XHRcdHQxMSA9IG4zMyAqIG4yMiAtIG4zMiAqIG4yMyxcblx0XHRcdHQxMiA9IG4zMiAqIG4xMyAtIG4zMyAqIG4xMixcblx0XHRcdHQxMyA9IG4yMyAqIG4xMiAtIG4yMiAqIG4xMyxcblxuXHRcdFx0ZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzO1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDMuZ2V0SW52ZXJzZSgpOiBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjMyICogbjIxIC0gbjMxICogbjIyICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMyBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52O1xuXG5cdFx0dGVbIDYgXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldEludjtcblx0XHR0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdG1wLCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRtcCA9IG1bIDEgXTsgbVsgMSBdID0gbVsgMyBdOyBtWyAzIF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXROb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7XG5cblx0XHR2YXIgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRyWyAwIF0gPSBtWyAwIF07XG5cdFx0clsgMSBdID0gbVsgMyBdO1xuXHRcdHJbIDIgXSA9IG1bIDYgXTtcblx0XHRyWyAzIF0gPSBtWyAxIF07XG5cdFx0clsgNCBdID0gbVsgNCBdO1xuXHRcdHJbIDUgXSA9IG1bIDcgXTtcblx0XHRyWyA2IF0gPSBtWyAyIF07XG5cdFx0clsgNyBdID0gbVsgNSBdO1xuXHRcdHJbIDggXSA9IG1bIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAhPT0gdW5kZWZpbmVkICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXHR0aGlzLmNvbnN0YW50ID0gKCBjb25zdGFudCAhPT0gdW5kZWZpbmVkICkgPyBjb25zdGFudCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUGxhbmUucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudHM6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMubm9ybWFsLnNldCggeCwgeSwgeiApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBub3JtYWwsIHBvaW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IC0gcG9pbnQuZG90KCB0aGlzLm5vcm1hbCApO1x0Ly8gbXVzdCBiZSB0aGlzLm5vcm1hbCwgbm90IG5vcm1hbCwgYXMgdGhpcy5ub3JtYWwgaXMgbm9ybWFsaXplZFxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ29wbGFuYXJQb2ludHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZhciBub3JtYWwgPSB2MS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIHYyLnN1YlZlY3RvcnMoIGEsIGIgKSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBROiBzaG91bGQgYW4gZXJyb3IgYmUgdGhyb3duIGlmIG5vcm1hbCBpcyB6ZXJvIChlLmcuIGRlZ2VuZXJhdGUgcGxhbmUpP1xuXG5cdFx0XHR0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBub3JtYWwsIGEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHBsYW5lLm5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUgaXMgaW52YWxpZC5cblxuXHRcdHZhciBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XG5cdFx0dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIGludmVyc2VOb3JtYWxMZW5ndGggKTtcblx0XHR0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb25zdGFudCAqPSAtIDE7XG5cdFx0dGhpcy5ub3JtYWwubmVnYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbC5kb3QoIHBvaW50ICkgKyB0aGlzLmNvbnN0YW50O1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0fSxcblxuXHRwcm9qZWN0UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMub3J0aG9Qb2ludCggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkuc3ViKCBwb2ludCApLm5lZ2F0ZSgpO1xuXG5cdH0sXG5cblx0b3J0aG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcGVycGVuZGljdWxhck1hZ25pdHVkZSA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApO1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCBwZXJwZW5kaWN1bGFyTWFnbml0dWRlICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdExpbmUoIGxpbmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0dmFyIGRpcmVjdGlvbiA9IGxpbmUuZGVsdGEoIHYxICk7XG5cblx0XHRcdHZhciBkZW5vbWluYXRvciA9IHRoaXMubm9ybWFsLmRvdCggZGlyZWN0aW9uICk7XG5cblx0XHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxuXHRcdFx0XHRpZiAoIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICkgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVW5zdXJlIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIGNhc2UuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHQgPSAtICggbGluZS5zdGFydC5kb3QoIHRoaXMubm9ybWFsICkgKyB0aGlzLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdFx0aWYgKCB0IDwgMCB8fCB0ID4gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQuY29weSggZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIGxpbmUuc3RhcnQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNMaW5lOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHQvLyBOb3RlOiB0aGlzIHRlc3RzIGlmIGEgbGluZSBpbnRlcnNlY3RzIHRoZSBwbGFuZSwgbm90IHdoZXRoZXIgaXQgKG9yIGl0cyBlbmQtcG9pbnRzKSBhcmUgY29wbGFuYXIgd2l0aCBpdC5cblxuXHRcdHZhciBzdGFydFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApO1xuXHRcdHZhciBlbmRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gKCBzdGFydFNpZ24gPCAwICYmIGVuZFNpZ24gPiAwICkgfHwgKCBlbmRTaWduIDwgMCAmJiBzdGFydFNpZ24gPiAwICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiBzcGhlcmUuaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3BsYW5hclBvaW50OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuY29uc3RhbnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4MygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4LCBvcHRpb25hbE5vcm1hbE1hdHJpeCApIHtcblxuXHRcdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdC8vIHRyYW5zZm9ybSBub3JtYWwgYmFzZWQgb24gdGhlb3J5IGhlcmU6XG5cdFx0XHQvLyBodHRwOi8vd3d3LnNvbmdoby5jYS9vcGVuZ2wvZ2xfbm9ybWFsdHJhbnNmb3JtLmh0bWxcblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBtMS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXHRcdFx0dmFyIG5vcm1hbCA9IHRoaXMubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIHJlY2FsY3VsYXRlIGNvbnN0YW50IChsaWtlIGluIHNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KVxuXHRcdFx0dGhpcy5jb25zdGFudCA9IC0gcmVmZXJlbmNlUG9pbnQuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5jb25zdGFudCA9IHRoaXMuY29uc3RhbnQgLSBvZmZzZXQuZG90KCB0aGlzLm5vcm1hbCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRyZXR1cm4gcGxhbmUubm9ybWFsLmVxdWFscyggdGhpcy5ub3JtYWwgKSAmJiAoIHBsYW5lLmNvbnN0YW50ID09PSB0aGlzLmNvbnN0YW50ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRnJ1c3R1bSggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHtcblxuXHR0aGlzLnBsYW5lcyA9IFtcblxuXHRcdCggcDAgIT09IHVuZGVmaW5lZCApID8gcDAgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAxICE9PSB1bmRlZmluZWQgKSA/IHAxIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMiAhPT0gdW5kZWZpbmVkICkgPyBwMiA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDMgIT09IHVuZGVmaW5lZCApID8gcDMgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA0ICE9PSB1bmRlZmluZWQgKSA/IHA0IDogbmV3IFBsYW5lKCksXG5cdFx0KCBwNSAhPT0gdW5kZWZpbmVkICkgPyBwNSA6IG5ldyBQbGFuZSgpXG5cblx0XTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGcnVzdHVtLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0cGxhbmVzWyAwIF0uY29weSggcDAgKTtcblx0XHRwbGFuZXNbIDEgXS5jb3B5KCBwMSApO1xuXHRcdHBsYW5lc1sgMiBdLmNvcHkoIHAyICk7XG5cdFx0cGxhbmVzWyAzIF0uY29weSggcDMgKTtcblx0XHRwbGFuZXNbIDQgXS5jb3B5KCBwNCApO1xuXHRcdHBsYW5lc1sgNSBdLmNvcHkoIHA1ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGZydXN0dW0gKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRwbGFuZXNbIGkgXS5jb3B5KCBmcnVzdHVtLnBsYW5lc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdO1xuXHRcdHZhciBtZTQgPSBtZVsgNCBdLCBtZTUgPSBtZVsgNSBdLCBtZTYgPSBtZVsgNiBdLCBtZTcgPSBtZVsgNyBdO1xuXHRcdHZhciBtZTggPSBtZVsgOCBdLCBtZTkgPSBtZVsgOSBdLCBtZTEwID0gbWVbIDEwIF0sIG1lMTEgPSBtZVsgMTEgXTtcblx0XHR2YXIgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdO1xuXG5cdFx0cGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c09iamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApXG5cdFx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzU3ByaXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcHJpdGUoIHNwcml0ZSApIHtcblxuXHRcdFx0c3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblx0XHR2YXIgY2VudGVyID0gc3BoZXJlLmNlbnRlcjtcblx0XHR2YXIgbmVnUmFkaXVzID0gLSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IG5lZ1JhZGl1cyApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHAxID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgcGxhbmUgPSBwbGFuZXNbIGkgXTtcblxuXHRcdFx0XHRwMS54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1pbi54IDogYm94Lm1heC54O1xuXHRcdFx0XHRwMi54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1heC54IDogYm94Lm1pbi54O1xuXHRcdFx0XHRwMS55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1pbi55IDogYm94Lm1heC55O1xuXHRcdFx0XHRwMi55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1heC55IDogYm94Lm1pbi55O1xuXHRcdFx0XHRwMS56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1pbi56IDogYm94Lm1heC56O1xuXHRcdFx0XHRwMi56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1heC56IDogYm94Lm1pbi56O1xuXG5cdFx0XHRcdHZhciBkMSA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggcDEgKTtcblx0XHRcdFx0dmFyIGQyID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMiApO1xuXG5cdFx0XHRcdC8vIGlmIGJvdGggb3V0c2lkZSBwbGFuZSwgbm8gaW50ZXJzZWN0aW9uXG5cblx0XHRcdFx0aWYgKCBkMSA8IDAgJiYgZDIgPCAwICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfbGlnaHRzLCBfb2JqZWN0cywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBfZ2wgPSBfcmVuZGVyZXIuY29udGV4dCxcblx0XHRfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGUsXG5cdFx0X2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpLFxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF9saWdodFNoYWRvd3MgPSBfbGlnaHRzLnNoYWRvd3MsXG5cblx0XHRfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXG5cdFx0X21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKSxcblxuXHRcdF9sb29rVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSxcblx0XHRfbGlnaHRQb3NpdGlvbldvcmxkID0gbmV3IFZlY3RvcjMoKSxcblxuXHRcdF9Nb3JwaGluZ0ZsYWcgPSAxLFxuXHRcdF9Ta2lubmluZ0ZsYWcgPSAyLFxuXG5cdFx0X051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyA9ICggX01vcnBoaW5nRmxhZyB8IF9Ta2lubmluZ0ZsYWcgKSArIDEsXG5cblx0XHRfZGVwdGhNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSxcblx0XHRfZGlzdGFuY2VNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSxcblxuXHRcdF9tYXRlcmlhbENhY2hlID0ge307XG5cblx0dmFyIGN1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHZhciBjdWJlVXBzID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxuXHRdO1xuXG5cdHZhciBjdWJlMkRWaWV3UG9ydHMgPSBbXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSxcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpXG5cdF07XG5cblx0Ly8gaW5pdFxuXG5cdHZhciBkZXB0aE1hdGVyaWFsVGVtcGxhdGUgPSBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoKTtcblx0ZGVwdGhNYXRlcmlhbFRlbXBsYXRlLmRlcHRoUGFja2luZyA9IFJHQkFEZXB0aFBhY2tpbmc7XG5cdGRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5jbGlwcGluZyA9IHRydWU7XG5cblx0dmFyIGRpc3RhbmNlU2hhZGVyID0gU2hhZGVyTGliWyBcImRpc3RhbmNlUkdCQVwiIF07XG5cdHZhciBkaXN0YW5jZVVuaWZvcm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggZGlzdGFuY2VTaGFkZXIudW5pZm9ybXMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHM7ICsrIGkgKSB7XG5cblx0XHR2YXIgdXNlTW9ycGhpbmcgPSAoIGkgJiBfTW9ycGhpbmdGbGFnICkgIT09IDA7XG5cdFx0dmFyIHVzZVNraW5uaW5nID0gKCBpICYgX1NraW5uaW5nRmxhZyApICE9PSAwO1xuXG5cdFx0dmFyIGRlcHRoTWF0ZXJpYWwgPSBkZXB0aE1hdGVyaWFsVGVtcGxhdGUuY2xvbmUoKTtcblx0XHRkZXB0aE1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9IHVzZU1vcnBoaW5nO1xuXHRcdGRlcHRoTWF0ZXJpYWwuc2tpbm5pbmcgPSB1c2VTa2lubmluZztcblxuXHRcdF9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDtcblxuXHRcdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7XG5cdFx0XHRkZWZpbmVzOiB7XG5cdFx0XHRcdCdVU0VfU0hBRE9XTUFQJzogJydcblx0XHRcdH0sXG5cdFx0XHR1bmlmb3JtczogZGlzdGFuY2VVbmlmb3Jtcyxcblx0XHRcdHZlcnRleFNoYWRlcjogZGlzdGFuY2VTaGFkZXIudmVydGV4U2hhZGVyLFxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGRpc3RhbmNlU2hhZGVyLmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0bW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZyxcblx0XHRcdHNraW5uaW5nOiB1c2VTa2lubmluZyxcblx0XHRcdGNsaXBwaW5nOiB0cnVlXG5cdFx0fSApO1xuXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzWyBpIF0gPSBkaXN0YW5jZU1hdGVyaWFsO1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcblx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDtcblxuXHR0aGlzLnJlbmRlclJldmVyc2VTaWRlZCA9IHRydWU7XG5cdHRoaXMucmVuZGVyU2luZ2xlU2lkZWQgPSB0cnVlO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0aWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblx0XHRpZiAoIHNjb3BlLmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNjb3BlLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGlmICggX2xpZ2h0U2hhZG93cy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuZGlzYWJsZSggX2dsLkJMRU5EICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGRlcHRoIG1hcFxuXG5cdFx0dmFyIGZhY2VDb3VudCwgaXNQb2ludExpZ2h0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IF9saWdodFNoYWRvd3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IF9saWdodFNoYWRvd3NbIGkgXTtcblx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG5cdFx0XHR2YXIgc2hhZG93TWF0cml4ID0gc2hhZG93Lm1hdHJpeDtcblxuXHRcdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRzaGFkb3dDYW1lcmEucG9zaXRpb24uY29weSggX2xpZ2h0UG9zaXRpb25Xb3JsZCApO1xuXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6ZSApO1xuXHRcdFx0X3NoYWRvd01hcFNpemUubWluKCBfbWF4U2hhZG93TWFwU2l6ZSApO1xuXG5cdFx0XHRpZiAoIGxpZ2h0ICYmIGxpZ2h0LmlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHRmYWNlQ291bnQgPSA2O1xuXHRcdFx0XHRpc1BvaW50TGlnaHQgPSB0cnVlO1xuXG5cdFx0XHRcdHZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDtcblx0XHRcdFx0dmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTtcblxuXHRcdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcblx0XHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyAgeHpYWlxuXHRcdFx0XHQvLyAgIHkgWVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxuXG5cdFx0XHRcdC8vIHBvc2l0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnggKj0gNC4wO1xuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDtcblxuXG5cdFx0XHRcdC8vIGZvciBwb2ludCBsaWdodHMgd2Ugc2V0IHRoZSBzaGFkb3cgbWF0cml4IHRvIGJlIGEgdHJhbnNsYXRpb24tb25seSBtYXRyaXhcblx0XHRcdFx0Ly8gZXF1YWwgdG8gaW52ZXJzZSBvZiB0aGUgbGlnaHQncyBwb3NpdGlvblxuXG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIF9saWdodFBvc2l0aW9uV29ybGQueSwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnogKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmYWNlQ291bnQgPSAxO1xuXHRcdFx0XHRpc1BvaW50TGlnaHQgPSBmYWxzZTtcblxuXHRcdFx0XHRfbG9va1RhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApO1xuXHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHNoYWRvdyBtYXRyaXhcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXguc2V0KFxuXHRcdFx0XHRcdDAuNSwgMC4wLCAwLjAsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuNSwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjAsIDAuNSwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjAsIDEuMFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblx0XHRcdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBwYXJzID0geyBtaW5GaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlciwgZm9ybWF0OiBSR0JBRm9ybWF0IH07XG5cblx0XHRcdFx0c2hhZG93Lm1hcCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCggX3NoYWRvd01hcFNpemUueCwgX3NoYWRvd01hcFNpemUueSwgcGFycyApO1xuXHRcdFx0XHRzaGFkb3cubWFwLnRleHR1cmUubmFtZSA9IGxpZ2h0Lm5hbWUgKyBcIi5zaGFkb3dNYXBcIjtcblxuXHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2hhZG93LmlzU3BvdExpZ2h0U2hhZG93ICkge1xuXG5cdFx0XHRcdHNoYWRvdy51cGRhdGUoIGxpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd01hcCA9IHNoYWRvdy5tYXA7XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xuXHRcdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdC8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3Jcblx0XHRcdC8vIHJ1biBhIHNpbmdsZSBwYXNzIGlmIG5vdFxuXG5cdFx0XHRmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0XHRfbG9va1RhcmdldC5jb3B5KCBzaGFkb3dDYW1lcmEucG9zaXRpb24gKTtcblx0XHRcdFx0XHRfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0dmFyIHZwRGltZW5zaW9ucyA9IGN1YmUyRFZpZXdQb3J0c1sgZmFjZSBdO1xuXHRcdFx0XHRcdF9zdGF0ZS52aWV3cG9ydCggdnBEaW1lbnNpb25zICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cblxuXHRcdFx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdFx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIHNldCBvYmplY3QgbWF0cmljZXMgJiBmcnVzdHVtIGN1bGxpbmdcblxuXHRcdFx0XHRyZW5kZXJPYmplY3QoIHNjZW5lLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFJlc3RvcmUgR0wgc3RhdGUuXG5cdFx0dmFyIGNsZWFyQ29sb3IgPSBfcmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcigpO1xuXHRcdHZhciBjbGVhckFscGhhID0gX3JlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcblx0XHRfcmVuZGVyZXIuc2V0Q2xlYXJDb2xvciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0c2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR9O1xuXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgbGlnaHRQb3NpdGlvbldvcmxkICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHJlc3VsdCA9IG51bGw7XG5cblx0XHR2YXIgbWF0ZXJpYWxWYXJpYW50cyA9IF9kZXB0aE1hdGVyaWFscztcblx0XHR2YXIgY3VzdG9tTWF0ZXJpYWwgPSBvYmplY3QuY3VzdG9tRGVwdGhNYXRlcmlhbDtcblxuXHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRtYXRlcmlhbFZhcmlhbnRzID0gX2Rpc3RhbmNlTWF0ZXJpYWxzO1xuXHRcdFx0Y3VzdG9tTWF0ZXJpYWwgPSBvYmplY3QuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggISBjdXN0b21NYXRlcmlhbCApIHtcblxuXHRcdFx0dmFyIHVzZU1vcnBoaW5nID0gZmFsc2U7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoID4gMDtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOiBUSFJFRS5Ta2lubmVkTWVzaCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxzZTonLCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdXNlU2tpbm5pbmcgPSBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbC5za2lubmluZztcblxuXHRcdFx0dmFyIHZhcmlhbnRJbmRleCA9IDA7XG5cblx0XHRcdGlmICggdXNlTW9ycGhpbmcgKSB2YXJpYW50SW5kZXggfD0gX01vcnBoaW5nRmxhZztcblx0XHRcdGlmICggdXNlU2tpbm5pbmcgKSB2YXJpYW50SW5kZXggfD0gX1NraW5uaW5nRmxhZztcblxuXHRcdFx0cmVzdWx0ID0gbWF0ZXJpYWxWYXJpYW50c1sgdmFyaWFudEluZGV4IF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXN1bHQgPSBjdXN0b21NYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggX3JlbmRlcmVyLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0Ly8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVmbGVjdGluZyB0aGVcblx0XHRcdC8vIGFwcHJvcHJpYXRlIHN0YXRlXG5cblx0XHRcdHZhciBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkO1xuXG5cdFx0XHR2YXIgbWF0ZXJpYWxzRm9yVmFyaWFudCA9IF9tYXRlcmlhbENhY2hlWyBrZXlBIF07XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzRm9yVmFyaWFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnQgPSB7fTtcblx0XHRcdFx0X21hdGVyaWFsQ2FjaGVbIGtleUEgXSA9IG1hdGVyaWFsc0ZvclZhcmlhbnQ7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGNhY2hlZE1hdGVyaWFsID0gbWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdO1xuXG5cdFx0XHRpZiAoIGNhY2hlZE1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2FjaGVkTWF0ZXJpYWwgPSByZXN1bHQuY2xvbmUoKTtcblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdID0gY2FjaGVkTWF0ZXJpYWw7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0ID0gY2FjaGVkTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRyZXN1bHQudmlzaWJsZSA9IG1hdGVyaWFsLnZpc2libGU7XG5cdFx0cmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTtcblxuXHRcdHZhciBzaWRlID0gbWF0ZXJpYWwuc2lkZTtcblxuXHRcdGlmICggc2NvcGUucmVuZGVyU2luZ2xlU2lkZWQgJiYgc2lkZSA9PSBEb3VibGVTaWRlICkge1xuXG5cdFx0XHRzaWRlID0gRnJvbnRTaWRlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBzY29wZS5yZW5kZXJSZXZlcnNlU2lkZWQgKSB7XG5cblx0XHRcdGlmICggc2lkZSA9PT0gRnJvbnRTaWRlICkgc2lkZSA9IEJhY2tTaWRlO1xuXHRcdFx0ZWxzZSBpZiAoIHNpZGUgPT09IEJhY2tTaWRlICkgc2lkZSA9IEZyb250U2lkZTtcblxuXHRcdH1cblxuXHRcdHJlc3VsdC5zaWRlID0gc2lkZTtcblxuXHRcdHJlc3VsdC5jbGlwU2hhZG93cyA9IG1hdGVyaWFsLmNsaXBTaGFkb3dzO1xuXHRcdHJlc3VsdC5jbGlwcGluZ1BsYW5lcyA9IG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgJiYgcmVzdWx0LnVuaWZvcm1zLmxpZ2h0UG9zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlc3VsdC51bmlmb3Jtcy5saWdodFBvcy52YWx1ZS5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICYmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ICYmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApICkge1xuXG5cdFx0XHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgayA9IDAsIGtsID0gZ3JvdXBzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGsgXTtcblx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ3JvdXBNYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cdFx0XHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCApO1xuXHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgbnVsbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0cmVuZGVyT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0dGhpcy5vcmlnaW4gPSAoIG9yaWdpbiAhPT0gdW5kZWZpbmVkICkgPyBvcmlnaW4gOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmRpcmVjdGlvbiA9ICggZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgKSA/IGRpcmVjdGlvbiA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIG9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIGRpcmVjdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCByYXkgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCByYXkub3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggcmF5LmRpcmVjdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCB2ICkuc3ViKCB0aGlzLm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyZWNhc3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVjYXN0KCB0ICkge1xuXG5cdFx0XHR0aGlzLm9yaWdpbi5jb3B5KCB0aGlzLmF0KCB0LCB2MSApICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXN1bHQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cdFx0dmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gcmVzdWx0LmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMub3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VTcVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB2MS5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRcdC8vIHBvaW50IGJlaGluZCB0aGUgcmF5XG5cblx0XHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2MS5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdFx0cmV0dXJuIHYxLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGlzdGFuY2VTcVRvU2VnbWVudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNlZ0NlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHNlZ0RpciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1NlZ21lbnQoIHYwLCB2MSwgb3B0aW9uYWxQb2ludE9uUmF5LCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlRGlzdFJheVNlZ21lbnQuaFxuXHRcdFx0Ly8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnRcblx0XHRcdC8vIGRlZmluZWQgYnkgdjAgYW5kIHYxXG5cdFx0XHQvLyBJdCBjYW4gYWxzbyBzZXQgdHdvIG9wdGlvbmFsIHRhcmdldHMgOlxuXHRcdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBzZWdtZW50XG5cblx0XHRcdHNlZ0NlbnRlci5jb3B5KCB2MCApLmFkZCggdjEgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0XHRzZWdEaXIuY29weSggdjEgKS5zdWIoIHYwICkubm9ybWFsaXplKCk7XG5cdFx0XHRkaWZmLmNvcHkoIHRoaXMub3JpZ2luICkuc3ViKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0dmFyIHNlZ0V4dGVudCA9IHYwLmRpc3RhbmNlVG8oIHYxICkgKiAwLjU7XG5cdFx0XHR2YXIgYTAxID0gLSB0aGlzLmRpcmVjdGlvbi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGIwID0gZGlmZi5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cdFx0XHR2YXIgYjEgPSAtIGRpZmYuZG90KCBzZWdEaXIgKTtcblx0XHRcdHZhciBjID0gZGlmZi5sZW5ndGhTcSgpO1xuXHRcdFx0dmFyIGRldCA9IE1hdGguYWJzKCAxIC0gYTAxICogYTAxICk7XG5cdFx0XHR2YXIgczAsIHMxLCBzcXJEaXN0LCBleHREZXQ7XG5cblx0XHRcdGlmICggZGV0ID4gMCApIHtcblxuXHRcdFx0XHQvLyBUaGUgcmF5IGFuZCBzZWdtZW50IGFyZSBub3QgcGFyYWxsZWwuXG5cblx0XHRcdFx0czAgPSBhMDEgKiBiMSAtIGIwO1xuXHRcdFx0XHRzMSA9IGEwMSAqIGIwIC0gYjE7XG5cdFx0XHRcdGV4dERldCA9IHNlZ0V4dGVudCAqIGRldDtcblxuXHRcdFx0XHRpZiAoIHMwID49IDAgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHMxID49IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyByZWdpb24gMFxuXHRcdFx0XHRcdFx0XHQvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuXG5cblx0XHRcdFx0XHRcdFx0dmFyIGludkRldCA9IDEgLyBkZXQ7XG5cdFx0XHRcdFx0XHRcdHMwICo9IGludkRldDtcblx0XHRcdFx0XHRcdFx0czEgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gczAgKiAoIHMwICsgYTAxICogczEgKyAyICogYjAgKSArIHMxICogKCBhMDEgKiBzMCArIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAxXG5cblx0XHRcdFx0XHRcdFx0czEgPSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDVcblxuXHRcdFx0XHRcdFx0czEgPSAtIHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggczEgPD0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiA0XG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCAtIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcblx0XHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IC0gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAzXG5cblx0XHRcdFx0XHRcdHMwID0gMDtcblx0XHRcdFx0XHRcdHMxID0gTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gMlxuXG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIFJheSBhbmQgc2VnbWVudCBhcmUgcGFyYWxsZWwuXG5cblx0XHRcdFx0czEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50O1xuXHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25SYXkgKSB7XG5cblx0XHRcdFx0b3B0aW9uYWxQb2ludE9uUmF5LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHMwICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25TZWdtZW50LmNvcHkoIHNlZ0RpciApLm11bHRpcGx5U2NhbGFyKCBzMSApLmFkZCggc2VnQ2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNxckRpc3Q7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0U3BoZXJlKCBzcGhlcmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLm9yaWdpbiApO1xuXHRcdFx0dmFyIHRjYSA9IHYxLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBkMiA9IHYxLmRvdCggdjEgKSAtIHRjYSAqIHRjYTtcblx0XHRcdHZhciByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApO1xuXG5cdFx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0XHQvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDEgPSB0Y2EgKyB0aGM7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxuXHRcdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQwIGlzIGJlaGluZCB0aGUgcmF5OlxuXHRcdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxuXHRcdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdFx0aWYgKCB0MCA8IDAgKSByZXR1cm4gdGhpcy5hdCggdDEsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0XHRcdC8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwXG5cdFx0XHRyZXR1cm4gdGhpcy5hdCggdDAsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCggc3BoZXJlLmNlbnRlciApIDw9IHNwaGVyZS5yYWRpdXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR2YXIgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxuXHRcdFx0aWYgKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICkgPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gTnVsbCBpcyBwcmVmZXJhYmxlIHRvIHVuZGVmaW5lZCBzaW5jZSB1bmRlZmluZWQgbWVhbnMuLi4uIGl0IGlzIHVuZGVmaW5lZFxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciB0ID0gLSAoIHRoaXMub3JpZ2luLmRvdCggcGxhbmUubm9ybWFsICkgKyBwbGFuZS5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XG5cblx0XHQvLyBSZXR1cm4gaWYgdGhlIHJheSBuZXZlciBpbnRlcnNlY3RzIHRoZSBwbGFuZVxuXG5cdFx0cmV0dXJuIHQgPj0gMCA/IHQgOiAgbnVsbDtcblxuXHR9LFxuXG5cdGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5kaXN0YW5jZVRvUGxhbmUoIHBsYW5lICk7XG5cblx0XHRpZiAoIHQgPT09IG51bGwgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0XG5cblx0XHR2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yICogZGlzdFRvUG9pbnQgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdClcblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xuXG5cdFx0dmFyIGludmRpcnggPSAxIC8gdGhpcy5kaXJlY3Rpb24ueCxcblx0XHRcdGludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSxcblx0XHRcdGludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejtcblxuXHRcdHZhciBvcmlnaW4gPSB0aGlzLm9yaWdpbjtcblxuXHRcdGlmICggaW52ZGlyeCA+PSAwICkge1xuXG5cdFx0XHR0bWluID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblx0XHRcdHRtYXggPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH1cblxuXHRcdGlmICggaW52ZGlyeSA+PSAwICkge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gVGhlc2UgbGluZXMgYWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdG1pbiBvciB0bWF4IGlzIE5hTlxuXHRcdC8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1cm5zIHRydWUgaWYgeCBpcyBOYU5cblxuXHRcdGlmICggdHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHltaW47XG5cblx0XHRpZiAoIHR5bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR5bWF4O1xuXG5cdFx0aWYgKCBpbnZkaXJ6ID49IDAgKSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH1cblxuXHRcdGlmICggKCB0bWluID4gdHptYXggKSB8fCAoIHR6bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XG5cblx0XHRpZiAoIHR6bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluO1xuXG5cdFx0aWYgKCB0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0em1heDtcblxuXHRcdC8vcmV0dXJuIHBvaW50IGNsb3Nlc3QgdG8gdGhlIHJheSAocG9zaXRpdmUgc2lkZSlcblxuXHRcdGlmICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLmF0KCB0bWluID49IDAgPyB0bWluIDogdG1heCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KCBib3gsIHYgKSAhPT0gbnVsbDtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0VHJpYW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGUgdGhlIG9mZnNldCBvcmlnaW4sIGVkZ2VzLCBhbmQgbm9ybWFsLlxuXHRcdHZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZWRnZTEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0VHJpYW5nbGUoIGEsIGIsIGMsIGJhY2tmYWNlQ3VsbGluZywgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVJbnRyUmF5M1RyaWFuZ2xlMy5oXG5cblx0XHRcdGVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdGVkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHQvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbixcblx0XHRcdC8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxOKVxuXHRcdFx0dmFyIERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggbm9ybWFsICk7XG5cdFx0XHR2YXIgc2lnbjtcblxuXHRcdFx0aWYgKCBEZE4gPiAwICkge1xuXG5cdFx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHNpZ24gPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xuXG5cdFx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHRcdERkTiA9IC0gRGROO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRcdHZhciBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMi5jcm9zc1ZlY3RvcnMoIGRpZmYsIGVkZ2UyICkgKTtcblxuXHRcdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApO1xuXG5cdFx0XHQvLyBiMiA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZEUxeFEgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdFx0dmFyIFFkTiA9IC0gc2lnbiAqIGRpZmYuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0Ly8gdCA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXg0ICkge1xuXG5cdFx0dGhpcy5kaXJlY3Rpb24uYWRkKCB0aGlzLm9yaWdpbiApLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLnN1YiggdGhpcy5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRXVsZXIoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9yZGVyO1xuXG59XG5cbkV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07XG5cbkV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVonO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b3JkZXI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fb3JkZXI7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdGlzRXVsZXI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0dmFyIGNsYW1wID0gX01hdGguY2xhbXA7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cztcblx0XHR2YXIgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHR2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTtcblx0XHR2YXIgbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0XHRtYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYsIG9yZGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0cmVvcmRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0dmFyIHEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0XHRxLnNldEZyb21FdWxlciggdGhpcyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvVmVjdG9yMzogZnVuY3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdGlmICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRcdHJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGF5ZXJzKCkge1xuXG5cdHRoaXMubWFzayA9IDEgfCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApO1xuXG5cdH0sXG5cblx0dGVzdDogZnVuY3Rpb24gKCBsYXllcnMgKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBlbGVwaGFudGF0d29yayAvIHd3dy5lbGVwaGFudGF0d29yay5jaFxuICovXG5cbnZhciBvYmplY3QzRElkID0gMDtcblxuZnVuY3Rpb24gT2JqZWN0M0QoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBvYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ09iamVjdDNEJztcblxuXHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuXHR0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7XG5cblx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XG5cdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xuXHRxdWF0ZXJuaW9uLm9uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHBvc2l0aW9uXG5cdFx0fSxcblx0XHRyb3RhdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiByb3RhdGlvblxuXHRcdH0sXG5cdFx0cXVhdGVybmlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBxdWF0ZXJuaW9uXG5cdFx0fSxcblx0XHRzY2FsZToge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBzY2FsZVxuXHRcdH0sXG5cdFx0bW9kZWxWaWV3TWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDQoKVxuXHRcdH0sXG5cdFx0bm9ybWFsTWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDMoKVxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7XG5cdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlO1xuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcblxuXHR0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlO1xuXHR0aGlzLnJlbmRlck9yZGVyID0gMDtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cblx0dGhpcy5vbkJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLm9uQWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbiAoKSB7fTtcblxufVxuXG5PYmplY3QzRC5EZWZhdWx0VXAgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXG5PYmplY3QuYXNzaWduKCBPYmplY3QzRC5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRpc09iamVjdDNEOiB0cnVlLFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMubWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdHRoaXMubWF0cml4LmRlY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHQvLyBhc3N1bWVzIHEgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHEgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIG9iamVjdCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR2YXIgcTEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZU9uQXhpcyggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5tdWx0aXBseSggcTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkge1xuXG5cdFx0XHR2MS5jb3B5KCBheGlzICkuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzLnF1YXRlcm5pb24gKTtcblxuXHRcdFx0dGhpcy5wb3NpdGlvbi5hZGQoIHYxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSApICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVYKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWSggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVooIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR3b3JsZFRvTG9jYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gd29ybGRUb0xvY2FsKCB2ZWN0b3IgKSB7XG5cblx0XHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtMS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gVGhpcyByb3V0aW5lIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyB3aXRoIHJvdGF0ZWQgYW5kL29yIHRyYW5zbGF0ZWQgcGFyZW50KHMpXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgKSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3IsIHRoaXMudXAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHZlY3RvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy51cCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0xICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLlwiLCBvYmplY3QgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0b2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2FkZGVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC5cIiwgb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gbnVsbDtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3JlbW92ZWQnIH0gKTtcblxuXHRcdFx0dGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdHZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Z2V0V29ybGRRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRRdWF0ZXJuaW9uKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCByZXN1bHQsIHNjYWxlICk7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRSb3RhdGlvbiggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgRXVsZXIoKTtcblxuXHRcdFx0dGhpcy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdGhpcy5yb3RhdGlvbi5vcmRlciwgZmFsc2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldFdvcmxkU2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkU2NhbGUoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHJlc3VsdCApO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LnNldCggMCwgMCwgMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCkge30sXG5cblx0dHJhdmVyc2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRjYWxsYmFjayggdGhpcyApO1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZVZpc2libGU6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRjYWxsYmFjayggdGhpcyApO1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2VWaXNpYmxlKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dHJhdmVyc2VBbmNlc3RvcnM6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHRpZiAoIHBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Y2FsbGJhY2soIHBhcmVudCApO1xuXG5cdFx0XHRwYXJlbnQudHJhdmVyc2VBbmNlc3RvcnMoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWF0cml4LmNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgfHwgZm9yY2UgKSB7XG5cblx0XHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyggdGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHRcdGZvcmNlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjaGlsZHJlblxuXG5cdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdC8vIG1ldGEgaXMgJycgd2hlbiBjYWxsZWQgZnJvbSBKU09OLnN0cmluZ2lmeVxuXHRcdHZhciBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhID09PSAnJyApO1xuXG5cdFx0dmFyIG91dHB1dCA9IHt9O1xuXG5cdFx0Ly8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy5cblx0XHQvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdFxuXHRcdC8vIGJlaW5nIHNlcmlhbGl6ZWQuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpemUgbWV0YSBvYmpcblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdGdlb21ldHJpZXM6IHt9LFxuXHRcdFx0XHRtYXRlcmlhbHM6IHt9LFxuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge31cblx0XHRcdH07XG5cblx0XHRcdG91dHB1dC5tZXRhZGF0YSA9IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnT2JqZWN0Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJ1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdC8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb25cblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdG9iamVjdC51dWlkID0gdGhpcy51dWlkO1xuXHRcdG9iamVjdC50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblx0XHRpZiAoIHRoaXMuY2FzdFNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5jYXN0U2hhZG93ID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMucmVjZWl2ZVNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0b2JqZWN0Lm1hdHJpeCA9IHRoaXMubWF0cml4LnRvQXJyYXkoKTtcblxuXHRcdC8vXG5cblx0XHRmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7XG5cblx0XHRcdGlmICggbGlicmFyeVsgZWxlbWVudC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW1lbnQudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5nZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUoIG1ldGEuZ2VvbWV0cmllcywgdGhpcy5nZW9tZXRyeSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm1hdGVyaWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdGhpcy5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdHZhciB1dWlkcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHV1aWRzLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHV1aWRzO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRvYmplY3QuY2hpbGRyZW4gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmNoaWxkcmVuLnB1c2goIHRoaXMuY2hpbGRyZW5bIGkgXS50b0pTT04oIG1ldGEgKS5vYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyaWVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5nZW9tZXRyaWVzICk7XG5cdFx0XHR2YXIgbWF0ZXJpYWxzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5tYXRlcmlhbHMgKTtcblx0XHRcdHZhciB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcblx0XHRcdHZhciBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdG91dHB1dC5vYmplY3QgPSBvYmplY3Q7XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0Ly8gZXh0cmFjdCBkYXRhIGZyb20gdGhlIGNhY2hlIGhhc2hcblx0XHQvLyByZW1vdmUgbWV0YWRhdGEgb24gZWFjaCBpdGVtXG5cdFx0Ly8gYW5kIHJldHVybiBhcyBhcnJheVxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0gY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcblxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIHJlY3Vyc2l2ZSApIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB1bmRlZmluZWQgKSByZWN1cnNpdmUgPSB0cnVlO1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTtcblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggc291cmNlLnF1YXRlcm5pb24gKTtcblx0XHR0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5zY2FsZSApO1xuXG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXHRcdHRoaXMubWF0cml4V29ybGQuY29weSggc291cmNlLm1hdHJpeFdvcmxkICk7XG5cblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGROZWVkc1VwZGF0ZTtcblxuXHRcdHRoaXMubGF5ZXJzLm1hc2sgPSBzb3VyY2UubGF5ZXJzLm1hc2s7XG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cblx0XHR0aGlzLmNhc3RTaGFkb3cgPSBzb3VyY2UuY2FzdFNoYWRvdztcblx0XHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBzb3VyY2UucmVjZWl2ZVNoYWRvdztcblxuXHRcdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHNvdXJjZS5mcnVzdHVtQ3VsbGVkO1xuXHRcdHRoaXMucmVuZGVyT3JkZXIgPSBzb3VyY2UucmVuZGVyT3JkZXI7XG5cblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2hpbGQgPSBzb3VyY2UuY2hpbGRyZW5bIGkgXTtcblx0XHRcdFx0dGhpcy5hZGQoIGNoaWxkLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIExpbmUzKCBzdGFydCwgZW5kICkge1xuXG5cdHRoaXMuc3RhcnQgPSAoIHN0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IHN0YXJ0IDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5lbmQgPSAoIGVuZCAhPT0gdW5kZWZpbmVkICkgPyBlbmQgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpbmUzLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBzdGFydCwgZW5kICkge1xuXG5cdFx0dGhpcy5zdGFydC5jb3B5KCBzdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGVuZCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdFx0dGhpcy5zdGFydC5jb3B5KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGRlbHRhOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyggdGhpcy5lbmQgKTtcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggcmVzdWx0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydFAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGFydEVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRzdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRcdHN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0XHRcdHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7XG5cdFx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTtcblxuXHRcdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdFx0dCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICk7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCByZXN1bHQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLmVuZC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHJldHVybiBsaW5lLnN0YXJ0LmVxdWFscyggdGhpcy5zdGFydCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFRyaWFuZ2xlKCBhLCBiLCBjICkge1xuXG5cdHRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5iID0gKCBiICE9PSB1bmRlZmluZWQgKSA/IGIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmMgPSAoIGMgIT09IHVuZGVmaW5lZCApID8gYyA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHtcblxuXHRub3JtYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbm9ybWFsKCBhLCBiLCBjLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHJlc3VsdC5zdWJWZWN0b3JzKCBjLCBiICk7XG5cdFx0XHR2MC5zdWJWZWN0b3JzKCBhLCBiICk7XG5cdFx0XHRyZXN1bHQuY3Jvc3MoIHYwICk7XG5cblx0XHRcdHZhciByZXN1bHRMZW5ndGhTcSA9IHJlc3VsdC5sZW5ndGhTcSgpO1xuXHRcdFx0aWYgKCByZXN1bHRMZW5ndGhTcSA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdC5tdWx0aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggcmVzdWx0TGVuZ3RoU3EgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQuc2V0KCAwLCAwLCAwICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHQvLyBzdGF0aWMvaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGN1bGF0ZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlc1xuXHQvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbFxuXHRiYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGJhcnljb29yZEZyb21Qb2ludCggcG9pbnQsIGEsIGIsIGMsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCBjLCBhICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0XHR2Mi5zdWJWZWN0b3JzKCBwb2ludCwgYSApO1xuXG5cdFx0XHR2YXIgZG90MDAgPSB2MC5kb3QoIHYwICk7XG5cdFx0XHR2YXIgZG90MDEgPSB2MC5kb3QoIHYxICk7XG5cdFx0XHR2YXIgZG90MDIgPSB2MC5kb3QoIHYyICk7XG5cdFx0XHR2YXIgZG90MTEgPSB2MS5kb3QoIHYxICk7XG5cdFx0XHR2YXIgZG90MTIgPSB2MS5kb3QoIHYyICk7XG5cblx0XHRcdHZhciBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdC8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZVxuXHRcdFx0aWYgKCBkZW5vbSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT9cblx0XHRcdFx0Ly8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBtYXliZSBzaG91bGQgYmUgcmV0dXJuaW5nIHVuZGVmaW5lZFxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0LnNldCggLSAyLCAtIDEsIC0gMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcblx0XHRcdHZhciB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207XG5cdFx0XHR2YXIgdiA9ICggZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIgKSAqIGludkRlbm9tO1xuXG5cdFx0XHQvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBtdXN0IGFsd2F5cyBzdW0gdG8gMVxuXHRcdFx0cmV0dXJuIHJlc3VsdC5zZXQoIDEgLSB1IC0gdiwgdiwgdSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IFRyaWFuZ2xlLmJhcnljb29yZEZyb21Qb2ludCggcG9pbnQsIGEsIGIsIGMsIHYxICk7XG5cblx0XHRcdHJldHVybiAoIHJlc3VsdC54ID49IDAgKSAmJiAoIHJlc3VsdC55ID49IDAgKSAmJiAoICggcmVzdWx0LnggKyByZXN1bHQueSApIDw9IDEgKTtcblxuXHRcdH07XG5cblx0fSgpXG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIGEsIGIsIGMgKSB7XG5cblx0XHR0aGlzLmEuY29weSggYSApO1xuXHRcdHRoaXMuYi5jb3B5KCBiICk7XG5cdFx0dGhpcy5jLmNvcHkoIGMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50c0FuZEluZGljZXM6IGZ1bmN0aW9uICggcG9pbnRzLCBpMCwgaTEsIGkyICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIHBvaW50c1sgaTAgXSApO1xuXHRcdHRoaXMuYi5jb3B5KCBwb2ludHNbIGkxIF0gKTtcblx0XHR0aGlzLmMuY29weSggcG9pbnRzWyBpMiBdICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIHRyaWFuZ2xlLmEgKTtcblx0XHR0aGlzLmIuY29weSggdHJpYW5nbGUuYiApO1xuXHRcdHRoaXMuYy5jb3B5KCB0cmlhbmdsZS5jICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFyZWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcmVhKCkge1xuXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCB0aGlzLmMsIHRoaXMuYiApO1xuXHRcdFx0djEuc3ViVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKTtcblxuXHRcdFx0cmV0dXJuIHYwLmNyb3NzKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bWlkcG9pbnQ6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gcmVzdWx0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcblxuXHR9LFxuXG5cdG5vcm1hbDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5ub3JtYWwoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHRwbGFuZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUGxhbmUoKTtcblxuXHRcdHJldHVybiByZXN1bHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRiYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmJhcnljb29yZEZyb21Qb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmNvbnRhaW5zUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcGxhbmUgPSBuZXcgUGxhbmUoKTtcblx0XHR2YXIgZWRnZUxpc3QgPSBbIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSwgbmV3IExpbmUzKCkgXTtcblx0XHR2YXIgcHJvamVjdGVkUG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcblxuXHRcdFx0Ly8gcHJvamVjdCB0aGUgcG9pbnQgb250byB0aGUgcGxhbmUgb2YgdGhlIHRyaWFuZ2xlXG5cblx0XHRcdHBsYW5lLnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXHRcdFx0cGxhbmUucHJvamVjdFBvaW50KCBwb2ludCwgcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0Ly8gY2hlY2sgaWYgdGhlIHByb2plY3Rpb24gbGllcyB3aXRoaW4gdGhlIHRyaWFuZ2xlXG5cblx0XHRcdGlmKCB0aGlzLmNvbnRhaW5zUG9pbnQoIHByb2plY3RlZFBvaW50ICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gaWYgc28sIHRoaXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnRcblxuXHRcdFx0XHRyZXN1bHQuY29weSggcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRzaWRlIHRoZSB0cmlhbmdsZS4gdGhlIHJlc3VsdCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgdHJpYW5nbGUncyBlZGdlcyBvciB2ZXJ0aWNlc1xuXG5cdFx0XHRcdGVkZ2VMaXN0WyAwIF0uc2V0KCB0aGlzLmEsIHRoaXMuYiApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMSBdLnNldCggdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7XG5cblx0XHRcdFx0Zm9yKCB2YXIgaSA9IDA7IGkgPCBlZGdlTGlzdC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRlZGdlTGlzdFsgaSBdLmNsb3Nlc3RQb2ludFRvUG9pbnQoIHByb2plY3RlZFBvaW50LCB0cnVlLCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHByb2plY3RlZFBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmKCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdFx0XHRyZXN1bHQuY29weSggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGUuYS5lcXVhbHMoIHRoaXMuYSApICYmIHRyaWFuZ2xlLmIuZXF1YWxzKCB0aGlzLmIgKSAmJiB0cmlhbmdsZS5jLmVxdWFscyggdGhpcy5jICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0dGhpcy5hID0gYTtcblx0dGhpcy5iID0gYjtcblx0dGhpcy5jID0gYztcblxuXHR0aGlzLm5vcm1hbCA9ICggbm9ybWFsICYmIG5vcm1hbC5pc1ZlY3RvcjMgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudmVydGV4Tm9ybWFscyA9IEFycmF5LmlzQXJyYXkoIG5vcm1hbCApID8gbm9ybWFsIDogW107XG5cblx0dGhpcy5jb2xvciA9ICggY29sb3IgJiYgY29sb3IuaXNDb2xvciApID8gY29sb3IgOiBuZXcgQ29sb3IoKTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBBcnJheS5pc0FycmF5KCBjb2xvciApID8gY29sb3IgOiBbXTtcblxuXHR0aGlzLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHtcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmEgPSBzb3VyY2UuYTtcblx0XHR0aGlzLmIgPSBzb3VyY2UuYjtcblx0XHR0aGlzLmMgPSBzb3VyY2UuYztcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHNvdXJjZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXRlcmlhbEluZGV4ID0gc291cmNlLm1hdGVyaWFsSW5kZXg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Tm9ybWFsc1sgaSBdID0gc291cmNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Q29sb3JzWyBpIF0gPSBzb3VyY2UudmVydGV4Q29sb3JzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICBzaGFkaW5nOiBUSFJFRS5TbW9vdGhTaGFkaW5nLFxuICogIGRlcHRoVGVzdDogPGJvb2w+LFxuICogIGRlcHRoV3JpdGU6IDxib29sPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaEJhc2ljTWF0ZXJpYWw7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0fVxuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDtcblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxuXHR0aGlzLmR5bmFtaWMgPSBmYWxzZTtcblx0dGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07XG5cblx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0c2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5pdGVtU2l6ZSA6IDA7XG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xuXG5cdH0sXG5cblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcblx0XHR0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5pdGVtU2l6ZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLmFycmF5LnNldCggYXJyYXkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNvbG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNvbG9yID0gY29sb3JzWyBpIF07XG5cblx0XHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0Y29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5yO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuZztcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlJbmRpY2VzQXJyYXk6IGZ1bmN0aW9uICggaW5kaWNlcyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmRleCA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gaW5kZXguYTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGluZGV4LmI7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5jO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yMnNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3Iuejtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmZ1bmN0aW9uIEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7XG5cblx0dGhpcy5pbmRpY2VzID0gW107XG5cdHRoaXMudmVydGljZXMgPSBbXTtcblx0dGhpcy5ub3JtYWxzID0gW107XG5cdHRoaXMuY29sb3JzID0gW107XG5cdHRoaXMudXZzID0gW107XG5cdHRoaXMudXZzMiA9IFtdO1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSB7fTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHQvLyB0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERpcmVjdEdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGNvbXB1dGVHcm91cHM6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgZ3JvdXA7XG5cdFx0dmFyIGdyb3VwcyA9IFtdO1xuXHRcdHZhciBtYXRlcmlhbEluZGV4ID0gdW5kZWZpbmVkO1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0Ly8gbWF0ZXJpYWxzXG5cblx0XHRcdGlmICggZmFjZS5tYXRlcmlhbEluZGV4ICE9PSBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlLm1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBncm91cCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Z3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDtcblx0XHRcdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z3JvdXAgPSB7XG5cdFx0XHRcdFx0c3RhcnQ6IGkgKiAzLFxuXHRcdFx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXhcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBncm91cCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0Z3JvdXBzLnB1c2goIGdyb3VwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmdyb3VwcyA9IGdyb3VwcztcblxuXHR9LFxuXG5cdGZyb21HZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdHZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2cztcblxuXHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSBmYWNlVmVydGV4VXZzWyAwIF0gJiYgZmFjZVZlcnRleFV2c1sgMCBdLmxlbmd0aCA+IDA7XG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdjIgPSBmYWNlVmVydGV4VXZzWyAxIF0gJiYgZmFjZVZlcnRleFV2c1sgMSBdLmxlbmd0aCA+IDA7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cdFx0dmFyIG1vcnBoVGFyZ2V0c0xlbmd0aCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzUG9zaXRpb247XG5cblx0XHRpZiAoIG1vcnBoVGFyZ2V0c0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMucG9zaXRpb24gPSBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdH1cblxuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBnZW9tZXRyeS5tb3JwaE5vcm1hbHM7XG5cdFx0dmFyIG1vcnBoTm9ybWFsc0xlbmd0aCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzTm9ybWFsO1xuXG5cdFx0aWYgKCBtb3JwaE5vcm1hbHNMZW5ndGggPiAwICkge1xuXG5cdFx0XHRtb3JwaFRhcmdldHNOb3JtYWwgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhOb3JtYWxzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMubm9ybWFsID0gbW9ycGhUYXJnZXRzTm9ybWFsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbnNcblxuXHRcdHZhciBza2luSW5kaWNlcyA9IGdlb21ldHJ5LnNraW5JbmRpY2VzO1xuXHRcdHZhciBza2luV2VpZ2h0cyA9IGdlb21ldHJ5LnNraW5XZWlnaHRzO1xuXG5cdFx0dmFyIGhhc1NraW5JbmRpY2VzID0gc2tpbkluZGljZXMubGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGg7XG5cdFx0dmFyIGhhc1NraW5XZWlnaHRzID0gc2tpbldlaWdodHMubGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHQvL1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGZhY2UuYSBdLCB2ZXJ0aWNlc1sgZmFjZS5iIF0sIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR0aGlzLm5vcm1hbHMucHVzaCggdmVydGV4Tm9ybWFsc1sgMCBdLCB2ZXJ0ZXhOb3JtYWxzWyAxIF0sIHZlcnRleE5vcm1hbHNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDtcblxuXHRcdFx0XHR0aGlzLm5vcm1hbHMucHVzaCggbm9ybWFsLCBub3JtYWwsIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhDb2xvcnMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMuY29sb3JzLnB1c2goIHZlcnRleENvbG9yc1sgMCBdLCB2ZXJ0ZXhDb2xvcnNbIDEgXSwgdmVydGV4Q29sb3JzWyAyIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgY29sb3IgPSBmYWNlLmNvbG9yO1xuXG5cdFx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yLCBjb2xvciwgY29sb3IgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0aWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdiAnLCBpICk7XG5cblx0XHRcdFx0XHR0aGlzLnV2cy5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2MiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMSBdWyBpIF07XG5cblx0XHRcdFx0aWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMudXZzMi5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYyICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzMi5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG1vcnBoc1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaFRhcmdldHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBqIF0udmVydGljZXM7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb25bIGogXS5wdXNoKCBtb3JwaFRhcmdldFsgZmFjZS5hIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhOb3JtYWxzTGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaiBdLnZlcnRleE5vcm1hbHNbIGkgXTtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNOb3JtYWxbIGogXS5wdXNoKCBtb3JwaE5vcm1hbC5hLCBtb3JwaE5vcm1hbC5iLCBtb3JwaE5vcm1hbC5jICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2tpbnNcblxuXHRcdFx0aWYgKCBoYXNTa2luSW5kaWNlcyApIHtcblxuXHRcdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBmYWNlLmEgXSwgc2tpbkluZGljZXNbIGZhY2UuYiBdLCBza2luSW5kaWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NraW5XZWlnaHRzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGZhY2UuYSBdLCBza2luV2VpZ2h0c1sgZmFjZS5iIF0sIHNraW5XZWlnaHRzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVHcm91cHMoIGdlb21ldHJ5ICk7XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkge1xuXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7XG5cblx0dmFyIG1heCA9IGFycmF5WyAwIF07XG5cblx0Zm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcblxuXHRcdGlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBtYXg7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIGNvdW50ID0gMDtcbmZ1bmN0aW9uIEdlb21ldHJ5SWRDb3VudCgpIHsgcmV0dXJuIGNvdW50Kys7IH1cblxuZnVuY3Rpb24gR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBHZW9tZXRyeUlkQ291bnQoKSB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdHZW9tZXRyeSc7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLmZhY2VzID0gW107XG5cdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggR2VvbWV0cnkucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0aXNHZW9tZXRyeTogdHJ1ZSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHR2ZXJ0ZXguYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblx0XHRcdGZhY2Uubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF0uYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBzY2FsZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7XG5cblx0XHRcdG9iai5sb29rQXQoIHZlY3RvciApO1xuXG5cdFx0XHRvYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4ICE9PSBudWxsID8gZ2VvbWV0cnkuaW5kZXguYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2cyA9IGF0dHJpYnV0ZXMudXYgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2czIgPSBhdHRyaWJ1dGVzLnV2MiAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51djIuYXJyYXkgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gW107XG5cblx0XHR2YXIgdGVtcE5vcm1hbHMgPSBbXTtcblx0XHR2YXIgdGVtcFVWcyA9IFtdO1xuXHRcdHZhciB0ZW1wVVZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMywgaiArPSAyICkge1xuXG5cdFx0XHRzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9zaXRpb25zWyBpIF0sIHBvc2l0aW9uc1sgaSArIDEgXSwgcG9zaXRpb25zWyBpICsgMiBdICkgKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcE5vcm1hbHMucHVzaCggbmV3IFZlY3RvcjMoIG5vcm1hbHNbIGkgXSwgbm9ybWFsc1sgaSArIDEgXSwgbm9ybWFsc1sgaSArIDIgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjb2xvcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5jb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGkgXSwgY29sb3JzWyBpICsgMSBdLCBjb2xvcnNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcFVWcy5wdXNoKCBuZXcgVmVjdG9yMiggdXZzWyBqIF0sIHV2c1sgaiArIDEgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcFVWczIucHVzaCggbmV3IFZlY3RvcjIoIHV2czJbIGogXSwgdXZzMlsgaiArIDEgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFkZEZhY2UoIGEsIGIsIGMsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gbm9ybWFscyAhPT0gdW5kZWZpbmVkID8gWyB0ZW1wTm9ybWFsc1sgYSBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBiIF0uY2xvbmUoKSwgdGVtcE5vcm1hbHNbIGMgXS5jbG9uZSgpIF0gOiBbXTtcblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBjb2xvcnMgIT09IHVuZGVmaW5lZCA/IFsgc2NvcGUuY29sb3JzWyBhIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBiIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cblx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhDb2xvcnMsIG1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0c2NvcGUuZmFjZXMucHVzaCggZmFjZSApO1xuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDAgXS5wdXNoKCBbIHRlbXBVVnNbIGEgXS5jbG9uZSgpLCB0ZW1wVVZzWyBiIF0uY2xvbmUoKSwgdGVtcFVWc1sgYyBdLmNsb25lKCkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDEgXS5wdXNoKCBbIHRlbXBVVnMyWyBhIF0uY2xvbmUoKSwgdGVtcFVWczJbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzMlsgYyBdLmNsb25lKCkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgc3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcblxuXHRcdFx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBqIF0sIGluZGljZXNbIGogKyAxIF0sIGluZGljZXNbIGogKyAyIF0sIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGFkZEZhY2UoIGosIGogKyAxLCBqICsgMiwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGluZGljZXNbIGkgXSwgaW5kaWNlc1sgaSArIDEgXSwgaW5kaWNlc1sgaSArIDIgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0YWRkRmFjZSggaSwgaSArIDEsIGkgKyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0dmFyIG9mZnNldCA9IHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCkubmVnYXRlKCk7XG5cblx0XHR0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApO1xuXG5cdFx0cmV0dXJuIG9mZnNldDtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtcblx0XHR2YXIgcmFkaXVzID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM7XG5cblx0XHR2YXIgcyA9IHJhZGl1cyA9PT0gMCA/IDEgOiAxLjAgLyByYWRpdXM7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHRtYXRyaXguc2V0KFxuXHRcdFx0cywgMCwgMCwgLSBzICogY2VudGVyLngsXG5cdFx0XHQwLCBzLCAwLCAtIHMgKiBjZW50ZXIueSxcblx0XHRcdDAsIDAsIHMsIC0gcyAqIGNlbnRlci56LFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHR0aGlzLmFwcGx5TWF0cml4KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0dmFyIHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHR2YXIgdkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0Y2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7XG5cdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRjYi5ub3JtYWxpemUoKTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwuY29weSggY2IgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdGlmICggYXJlYVdlaWdodGVkID09PSB1bmRlZmluZWQgKSBhcmVhV2VpZ2h0ZWQgPSB0cnVlO1xuXG5cdFx0dmFyIHYsIHZsLCBmLCBmbCwgZmFjZSwgdmVydGljZXM7XG5cblx0XHR2ZXJ0aWNlcyA9IG5ldyBBcnJheSggdGhpcy52ZXJ0aWNlcy5sZW5ndGggKTtcblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgKSB7XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzIHdlaWdodGVkIGJ5IHRyaWFuZ2xlIGFyZWFzXG5cdFx0XHQvLyBodHRwOi8vd3d3LmlxdWlsZXpsZXMub3JnL3d3dy9hcnRpY2xlcy9ub3JtYWxzL25vcm1hbHMuaHRtXG5cblx0XHRcdHZhciB2QSwgdkIsIHZDO1xuXHRcdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0dkEgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdFx0dkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdFx0dkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdFx0YWIuc3ViVmVjdG9ycyggdkEsIHZCICk7XG5cdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGNiICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGNiICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGNiICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkge1xuXG5cdFx0XHR2ZXJ0aWNlc1sgdiBdLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggdmVydGljZXNbIGZhY2UuYiBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSB2ZXJ0aWNlc1sgZmFjZS5hIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gdmVydGljZXNbIGZhY2UuYiBdLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXSA9IHZlcnRpY2VzWyBmYWNlLmMgXS5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBmLCBmbCwgZmFjZTtcblxuXHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVNb3JwaE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpLCBpbCwgZiwgZmwsIGZhY2U7XG5cblx0XHQvLyBzYXZlIG9yaWdpbmFsIG5vcm1hbHNcblx0XHQvLyAtIGNyZWF0ZSB0ZW1wIHZhcmlhYmxlcyBvbiBmaXJzdCBhY2Nlc3Ncblx0XHQvLyAgIG90aGVyd2lzZSBqdXN0IGNvcHkgKGZvciBmYXN0ZXIgcmVwZWF0ZWQgY2FsbHMpXG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgKSBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdICkge1xuXG5cdFx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyB1c2UgdGVtcCBnZW9tZXRyeSB0byBjb21wdXRlIGZhY2UgYW5kIHZlcnRleCBub3JtYWxzIGZvciBlYWNoIG1vcnBoXG5cblx0XHR2YXIgdG1wR2VvID0gbmV3IEdlb21ldHJ5KCk7XG5cdFx0dG1wR2VvLmZhY2VzID0gdGhpcy5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBjcmVhdGUgb24gZmlyc3QgYWNjZXNzXG5cblx0XHRcdGlmICggISB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gPSB7fTtcblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyA9IFtdO1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHR2YXIgZHN0Tm9ybWFsc0ZhY2UgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzO1xuXHRcdFx0XHR2YXIgZHN0Tm9ybWFsc1ZlcnRleCA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IHsgYTogbmV3IFZlY3RvcjMoKSwgYjogbmV3IFZlY3RvcjMoKSwgYzogbmV3IFZlY3RvcjMoKSB9O1xuXG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc0ZhY2UucHVzaCggZmFjZU5vcm1hbCApO1xuXHRcdFx0XHRcdGRzdE5vcm1hbHNWZXJ0ZXgucHVzaCggdmVydGV4Tm9ybWFscyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbW9ycGhOb3JtYWxzID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXTtcblxuXHRcdFx0Ly8gc2V0IHZlcnRpY2VzIHRvIG1vcnBoIHRhcmdldFxuXG5cdFx0XHR0bXBHZW8udmVydGljZXMgPSB0aGlzLm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXG5cdFx0XHQvLyBjb21wdXRlIG1vcnBoIG5vcm1hbHNcblxuXHRcdFx0dG1wR2VvLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0dG1wR2VvLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0XHRcdC8vIHN0b3JlIG1vcnBoIG5vcm1hbHNcblxuXHRcdFx0dmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHRmYWNlTm9ybWFsID0gbW9ycGhOb3JtYWxzLmZhY2VOb3JtYWxzWyBmIF07XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMgPSBtb3JwaE5vcm1hbHMudmVydGV4Tm9ybWFsc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmEuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAwIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5iLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYy5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXN0b3JlIG9yaWdpbmFsIG5vcm1hbHNcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGZhY2Uubm9ybWFsID0gZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbDtcblx0XHRcdGZhY2UudmVydGV4Tm9ybWFscyA9IGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGQgPSAwO1xuXHRcdHZhciB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGlmICggaSA+IDAgKSB7XG5cblx0XHRcdFx0ZCArPSB2ZXJ0aWNlc1sgaSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIC0gMSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5saW5lRGlzdGFuY2VzWyBpIF0gPSBkO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKCB0aGlzLnZlcnRpY2VzICk7XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsTWF0cml4LFxuXHRcdFx0dmVydGV4T2Zmc2V0ID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0XHR2ZXJ0aWNlczEgPSB0aGlzLnZlcnRpY2VzLFxuXHRcdFx0dmVydGljZXMyID0gZ2VvbWV0cnkudmVydGljZXMsXG5cdFx0XHRmYWNlczEgPSB0aGlzLmZhY2VzLFxuXHRcdFx0ZmFjZXMyID0gZ2VvbWV0cnkuZmFjZXMsXG5cdFx0XHR1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHR1dnMyID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgMCBdLFxuXHRcdFx0Y29sb3JzMSA9IHRoaXMuY29sb3JzLFxuXHRcdFx0Y29sb3JzMiA9IGdlb21ldHJ5LmNvbG9ycztcblxuXHRcdGlmICggbWF0ZXJpYWxJbmRleE9mZnNldCA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxJbmRleE9mZnNldCA9IDA7XG5cblx0XHRpZiAoIG1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHZlcnRpY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzMlsgaSBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Q29weSA9IHZlcnRleC5jbG9uZSgpO1xuXG5cdFx0XHRpZiAoIG1hdHJpeCAhPT0gdW5kZWZpbmVkICkgdmVydGV4Q29weS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0XHR2ZXJ0aWNlczEucHVzaCggdmVydGV4Q29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY29sb3JzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29sb3JzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Y29sb3JzMS5wdXNoKCBjb2xvcnMyWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmFjZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGZhY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlczJbIGkgXSwgZmFjZUNvcHksIG5vcm1hbCwgY29sb3IsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLFxuXHRcdFx0XHRmYWNlVmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdGZhY2VDb3B5ID0gbmV3IEZhY2UzKCBmYWNlLmEgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYiArIHZlcnRleE9mZnNldCwgZmFjZS5jICsgdmVydGV4T2Zmc2V0ICk7XG5cdFx0XHRmYWNlQ29weS5ub3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmYWNlQ29weS5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0bm9ybWFsID0gZmFjZVZlcnRleE5vcm1hbHNbIGogXS5jbG9uZSgpO1xuXG5cdFx0XHRcdGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZmFjZUNvcHkudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmYWNlQ29weS5jb2xvci5jb3B5KCBmYWNlLmNvbG9yICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Q29sb3JzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGNvbG9yID0gZmFjZVZlcnRleENvbG9yc1sgaiBdO1xuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhDb2xvcnMucHVzaCggY29sb3IuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5Lm1hdGVyaWFsSW5kZXggPSBmYWNlLm1hdGVyaWFsSW5kZXggKyBtYXRlcmlhbEluZGV4T2Zmc2V0O1xuXG5cdFx0XHRmYWNlczEucHVzaCggZmFjZUNvcHkgKTtcblxuXHRcdH1cblxuXHRcdC8vIHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdXZzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHV2ID0gdXZzMlsgaSBdLCB1dkNvcHkgPSBbXTtcblxuXHRcdFx0aWYgKCB1diA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB1di5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR1dkNvcHkucHVzaCggdXZbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dXZzMS5wdXNoKCB1dkNvcHkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlTWVzaDogZnVuY3Rpb24gKCBtZXNoICkge1xuXG5cdFx0aWYgKCAoIG1lc2ggJiYgbWVzaC5pc01lc2ggKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRtZXNoLm1hdHJpeEF1dG9VcGRhdGUgJiYgbWVzaC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMubWVyZ2UoIG1lc2guZ2VvbWV0cnksIG1lc2gubWF0cml4ICk7XG5cblx0fSxcblxuXHQvKlxuXHQgKiBDaGVja3MgZm9yIGR1cGxpY2F0ZSB2ZXJ0aWNlcyB3aXRoIGhhc2htYXAuXG5cdCAqIER1cGxpY2F0ZWQgdmVydGljZXMgYXJlIHJlbW92ZWRcblx0ICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC5cblx0ICovXG5cblx0bWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9zaXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpXG5cdFx0dmFyIHVuaXF1ZSA9IFtdLCBjaGFuZ2VzID0gW107XG5cblx0XHR2YXIgdiwga2V5O1xuXHRcdHZhciBwcmVjaXNpb25Qb2ludHMgPSA0OyAvLyBudW1iZXIgb2YgZGVjaW1hbCBwb2ludHMsIGUuZy4gNCBmb3IgZXBzaWxvbiBvZiAwLjAwMDFcblx0XHR2YXIgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTtcblx0XHR2YXIgaSwgaWwsIGZhY2U7XG5cdFx0dmFyIGluZGljZXMsIGosIGpsO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0diA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdGtleSA9IE1hdGgucm91bmQoIHYueCAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi55ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnogKiBwcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCB2ZXJ0aWNlc01hcFsga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlc01hcFsga2V5IF0gPSBpO1xuXHRcdFx0XHR1bmlxdWUucHVzaCggdGhpcy52ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IHVuaXF1ZS5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ0R1cGxpY2F0ZSB2ZXJ0ZXggZm91bmQuICcsIGksICcgY291bGQgYmUgdXNpbmcgJywgdmVydGljZXNNYXBba2V5XSk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IGNoYW5nZXNbIHZlcnRpY2VzTWFwWyBrZXkgXSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIGlmIGZhY2VzIGFyZSBjb21wbGV0ZWx5IGRlZ2VuZXJhdGUgYWZ0ZXIgbWVyZ2luZyB2ZXJ0aWNlcywgd2Vcblx0XHQvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LlxuXHRcdHZhciBmYWNlSW5kaWNlc1RvUmVtb3ZlID0gW107XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXG5cdFx0XHRmYWNlLmEgPSBjaGFuZ2VzWyBmYWNlLmEgXTtcblx0XHRcdGZhY2UuYiA9IGNoYW5nZXNbIGZhY2UuYiBdO1xuXHRcdFx0ZmFjZS5jID0gY2hhbmdlc1sgZmFjZS5jIF07XG5cblx0XHRcdGluZGljZXMgPSBbIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgXTtcblxuXHRcdFx0Ly8gaWYgYW55IGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhcmUgZm91bmQgaW4gYSBGYWNlM1xuXHRcdFx0Ly8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWRcblx0XHRcdGZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpbmRpY2VzWyBuIF0gPT09IGluZGljZXNbICggbiArIDEgKSAlIDMgXSApIHtcblxuXHRcdFx0XHRcdGZhY2VJbmRpY2VzVG9SZW1vdmUucHVzaCggaSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IGZhY2VJbmRpY2VzVG9SZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC0tICkge1xuXG5cdFx0XHR2YXIgaWR4ID0gZmFjZUluZGljZXNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHR0aGlzLmZhY2VzLnNwbGljZSggaWR4LCAxICk7XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IHRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBVc2UgdW5pcXVlIHNldCBvZiB2ZXJ0aWNlc1xuXG5cdFx0dmFyIGRpZmYgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIHVuaXF1ZS5sZW5ndGg7XG5cdFx0dGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTtcblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9LFxuXG5cdHNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGZhY2VzID0gdGhpcy5mYWNlcztcblx0XHR2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0Ly8gdGFnIGZhY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGZhY2VzWyBpIF0uX2lkID0gaTtcblxuXHRcdH1cblxuXHRcdC8vIHNvcnQgZmFjZXNcblxuXHRcdGZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkge1xuXG5cdFx0XHRyZXR1cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4O1xuXG5cdFx0fVxuXG5cdFx0ZmFjZXMuc29ydCggbWF0ZXJpYWxJbmRleFNvcnQgKTtcblxuXHRcdC8vIHNvcnQgdXZzXG5cblx0XHR2YXIgdXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdHZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07XG5cblx0XHR2YXIgbmV3VXZzMSwgbmV3VXZzMjtcblxuXHRcdGlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdO1xuXHRcdGlmICggdXZzMiAmJiB1dnMyLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDtcblxuXHRcdFx0aWYgKCBuZXdVdnMxICkgbmV3VXZzMS5wdXNoKCB1dnMxWyBpZCBdICk7XG5cdFx0XHRpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTtcblxuXHRcdH1cblxuXHRcdGlmICggbmV3VXZzMSApIHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdID0gbmV3VXZzMTtcblx0XHRpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIG5vcm1hbHNIYXNoID0ge307XG5cdFx0dmFyIGNvbG9ycyA9IFtdO1xuXHRcdHZhciBjb2xvcnNIYXNoID0ge307XG5cdFx0dmFyIHV2cyA9IFtdO1xuXHRcdHZhciB1dnNIYXNoID0ge307XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBoYXNNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHR2YXIgaGFzRmFjZVV2ID0gZmFsc2U7IC8vIGRlcHJlY2F0ZWRcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR2YXIgaGFzRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4gMDtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Tm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZUNvbG9yID0gZmFjZS5jb2xvci5yICE9PSAxIHx8IGZhY2UuY29sb3IuZyAhPT0gMSB8fCBmYWNlLmNvbG9yLmIgIT09IDE7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID4gMDtcblxuXHRcdFx0dmFyIGZhY2VUeXBlID0gMDtcblxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZFxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7XG5cblx0XHRcdGZhY2VzLnB1c2goIGZhY2VUeXBlICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Tm9ybWFsSW5kZXgoIGZhY2Uubm9ybWFsICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldENvbG9ySW5kZXgoIGZhY2UuY29sb3IgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkge1xuXG5cdFx0XHRyZXR1cm4gZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEgPDwgcG9zaXRpb24gKSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Tm9ybWFsSW5kZXgoIG5vcm1hbCApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBub3JtYWwueC50b1N0cmluZygpICsgbm9ybWFsLnkudG9TdHJpbmcoKSArIG5vcm1hbC56LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG5vcm1hbHNIYXNoWyBoYXNoIF0gPSBub3JtYWxzLmxlbmd0aCAvIDM7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRDb2xvckluZGV4KCBjb2xvciApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggY29sb3JzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnNIYXNoWyBoYXNoIF0gPSBjb2xvcnMubGVuZ3RoO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLmdldEhleCgpICk7XG5cblx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSB1di54LnRvU3RyaW5nKCkgKyB1di55LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggdXZzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7fTtcblxuXHRcdGRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xuXHRcdGRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFscztcblx0XHRpZiAoIGNvbG9ycy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLmNvbG9ycyA9IGNvbG9ycztcblx0XHRpZiAoIHV2cy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZzIF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRkYXRhLmRhdGEuZmFjZXMgPSBmYWNlcztcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBpLCBpbCwgaiwgamwsIGssIGtsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblx0XHR0aGlzLmNvbG9ycyA9IFtdO1xuXHRcdHRoaXMuZmFjZXMgPSBbXTtcblx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblx0XHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdFx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXHRcdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdHZhciBjb2xvcnMgPSBzb3VyY2UuY29sb3JzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvcnNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0dmFyIGZhY2VzID0gc291cmNlLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHZlcnRleCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJjZS5mYWNlVmVydGV4VXZzWyBpIF07XG5cblx0XHRcdGlmICggdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGogXSwgdXZzQ29weSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGsgPSAwLCBrbCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdHZhciB1diA9IHV2c1sgayBdO1xuXG5cdFx0XHRcdFx0dXZzQ29weS5wdXNoKCB1di5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdLnB1c2goIHV2c0NvcHkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IHt9O1xuXHRcdFx0bW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cblx0XHRcdC8vIHZlcnRpY2VzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBub3JtYWxzXG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFsID0ge307XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTtcblx0XHRcdFx0XHR2YXIgZGVzdFZlcnRleE5vcm1hbCA9IHt9O1xuXG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5hID0gc3JjVmVydGV4Tm9ybWFsLmEuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNWZXJ0ZXhOb3JtYWwuYi5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmFjZSBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIHdlaWdodHNcblxuXHRcdHZhciBza2luV2VpZ2h0cyA9IHNvdXJjZS5za2luV2VpZ2h0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiBpbmRpY2VzXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBzb3VyY2Uuc2tpbkluZGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luSW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGxpbmUgZGlzdGFuY2VzXG5cblx0XHR2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lRGlzdGFuY2VzLnB1c2goIGxpbmVEaXN0YW5jZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgZmxhZ3NcblxuXHRcdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gc291cmNlLnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBzb3VyY2UuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gc291cmNlLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IEdlb21ldHJ5SWRDb3VudCgpIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLmluZGV4ID0gbnVsbDtcblx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cblx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHR0aGlzLmRyYXdSYW5nZSA9IHsgc3RhcnQ6IDAsIGNvdW50OiBJbmZpbml0eSB9O1xuXG59XG5cbkJ1ZmZlckdlb21ldHJ5Lk1heEluZGV4ID0gNjU1MzU7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSwgYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNCdWZmZXJBdHRyaWJ1dGUgKSA9PT0gZmFsc2UgJiYgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkQXR0cmlidXRlKCkgbm93IGV4cGVjdHMgKCBuYW1lLCBhdHRyaWJ1dGUgKS4nICk7XG5cblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcmd1bWVudHNbIDEgXSwgYXJndW1lbnRzWyAyIF0gKSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG5hbWUgPT09ICdpbmRleCcgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZTogVXNlIC5zZXRJbmRleCgpIGZvciBpbmRleCBhdHRyaWJ1dGUuJyApO1xuXHRcdFx0dGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHR9LFxuXG5cdHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRHcm91cDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XG5cblx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdGNvdW50OiBjb3VudCxcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwXG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRjbGVhckdyb3VwczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR9LFxuXG5cdHNldERyYXdSYW5nZTogZnVuY3Rpb24gKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gY291bnQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG5vcm1hbCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRpZiAoIG5vcm1hbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0XHRub3JtYWxNYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggbm9ybWFsICk7XG5cdFx0XHRub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBzY2FsZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7XG5cblx0XHRcdG9iai5sb29rQXQoIHZlY3RvciApO1xuXG5cdFx0XHRvYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdHZhciBvZmZzZXQgPSB0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcigpLm5lZ2F0ZSgpO1xuXG5cdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdHJldHVybiBvZmZzZXQ7XG5cblx0fSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlRnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdHZhciBkaXJlY3QgPSBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmVsZW1lbnRzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRkaXJlY3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGdlb21ldHJ5LmVsZW1lbnRzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGlyZWN0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpcmVjdC52ZXJ0aWNlc05lZWRVcGRhdGUgPSBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3Qubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC51dnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRnZW9tZXRyeSA9IGRpcmVjdDtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmNvbG9yO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLnV2O1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUFycmF5KCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSApIHtcblxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUdyb3Vwcyggb2JqZWN0Lmdlb21ldHJ5ICk7XG5cdFx0XHR0aGlzLmdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0Z2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHRnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ID0gbmV3IERpcmVjdEdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KCBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ICk7XG5cblx0fSxcblxuXHRmcm9tRGlyZWN0R2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMyApO1xuXHRcdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKS5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgdXZzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkudXZzMi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgdXZzMiA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2czIubGVuZ3RoICogMiApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1djInLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMyLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2czIgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBUeXBlQXJyYXkgPSBhcnJheU1heCggZ2VvbWV0cnkuaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJBcnJheSA6IFVpbnQxNkFycmF5O1xuXHRcdFx0dmFyIGluZGljZXMgPSBuZXcgVHlwZUFycmF5KCBnZW9tZXRyeS5pbmRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHRcdHRoaXMuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKS5jb3B5SW5kaWNlc0FycmF5KCBnZW9tZXRyeS5pbmRpY2VzICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggbW9ycGhUYXJnZXQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xuXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0XHRib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHQvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXG5cblx0XHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0WCggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApO1xuXHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaiBdO1xuXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHRcdHZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7XG5cblx0XHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApO1xuXHRcdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTtcblxuXHRcdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApO1xuXHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApO1xuXHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAyIF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDMgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDUgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNiBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNyBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgOCBdID0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4nLCBnZW9tZXRyeSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUxID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgYXR0cmlidXRlQXJyYXkxID0gYXR0cmlidXRlMS5hcnJheTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTIgPSBhdHRyaWJ1dGUyLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlU2l6ZSA9IGF0dHJpYnV0ZTIuaXRlbVNpemU7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaiA9IGF0dHJpYnV0ZVNpemUgKiBvZmZzZXQ7IGkgPCBhdHRyaWJ1dGVBcnJheTIubGVuZ3RoOyBpICsrLCBqICsrICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZUFycmF5MVsgaiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0dmFyIHgsIHksIHosIG47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR4ID0gbm9ybWFscy5nZXRYKCBpICk7XG5cdFx0XHR5ID0gbm9ybWFscy5nZXRZKCBpICk7XG5cdFx0XHR6ID0gbm9ybWFscy5nZXRaKCBpICk7XG5cblx0XHRcdG4gPSAxLjAgLyBNYXRoLnNxcnQoIHggKiB4ICsgeSAqIHkgKyB6ICogeiApO1xuXG5cdFx0XHRub3JtYWxzLnNldFhZWiggaSwgeCAqIG4sIHkgKiBuLCB6ICogbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9Ob25JbmRleGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdFx0dmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHR2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdHZhciBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnQnVmZmVyR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdCdWZmZXJHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEJ1ZmZlckdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0ZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9O1xuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBpbmRleC5hcnJheSApO1xuXG5cdFx0XHRkYXRhLmRhdGEuaW5kZXggPSB7XG5cdFx0XHRcdHR5cGU6IGluZGV4LmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhdHRyaWJ1dGUuYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmF0dHJpYnV0ZXNbIGtleSBdID0ge1xuXHRcdFx0XHRpdGVtU2l6ZTogYXR0cmlidXRlLml0ZW1TaXplLFxuXHRcdFx0XHR0eXBlOiBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdFx0YXJyYXk6IGFycmF5LFxuXHRcdFx0XHRub3JtYWxpemVkOiBhdHRyaWJ1dGUubm9ybWFsaXplZFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7XG5cdFx0XHRcdGNlbnRlcjogYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxcblx0XHRcdFx0cmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRpdXNcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKlxuXHRcdCAvLyBIYW5kbGUgcHJpbWl0aXZlc1xuXG5cdFx0IHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0IGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0IHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHQgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7XG5cblx0XHQgfVxuXG5cdFx0IHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7XG5cdFx0IHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTtcblx0XHQgcmV0dXJuIGdlb21ldHJ5O1xuXG5cdFx0IH1cblxuXHRcdCByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cdFx0ICovXG5cblx0XHRyZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgbmFtZSwgaSwgbDtcblxuXHRcdC8vIHJlc2V0XG5cblx0XHR0aGlzLmluZGV4ID0gbnVsbDtcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMuZ3JvdXBzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIGluZGV4XG5cblx0XHR2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIG1vcnBoQXR0cmlidXRlWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBkcmF3IHJhbmdlXG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHNvdXJjZS5kcmF3UmFuZ2Uuc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaCc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdHRoaXMuZHJhd01vZGUgPSBUcmlhbmdsZXNEcmF3TW9kZTtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbk1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWVzaCxcblxuXHRpc01lc2g6IHRydWUsXG5cblx0c2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gdmFsdWU7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5kcmF3TW9kZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gdGhpcy5nZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cblx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcblxuXHRcdFx0Zm9yICggdmFyIG0gPSAwLCBtbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBtb3JwaFRhcmdldHNbIG0gXS5uYW1lIF0gPSBtO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR2YXIgdkEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZW1wQSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR2YXIgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50V29ybGQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdXZJbnRlcnNlY3Rpb24oIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzICkge1xuXG5cdFx0XHRUcmlhbmdsZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTtcblxuXHRcdFx0dXYxLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueCApO1xuXHRcdFx0dXYyLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueSApO1xuXHRcdFx0dXYzLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueiApO1xuXG5cdFx0XHR1djEuYWRkKCB1djIgKS5hZGQoIHV2MyApO1xuXG5cdFx0XHRyZXR1cm4gdXYxLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgcEEsIHBCLCBwQywgcG9pbnQgKSB7XG5cblx0XHRcdHZhciBpbnRlcnNlY3Q7XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRcdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQywgcEIsIHBBLCB0cnVlLCBwb2ludCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91YmxlU2lkZSwgcG9pbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGludGVyc2VjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xuXG5cdFx0XHRpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkoIHBvaW50ICk7XG5cdFx0XHRpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdGlvblBvaW50V29ybGQgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybiBudWxsO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdHBvaW50OiBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNsb25lKCksXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICkge1xuXG5cdFx0XHR2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYSApO1xuXHRcdFx0dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGIgKTtcblx0XHRcdHZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBjICk7XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgdkEsIHZCLCB2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0aWYgKCB1diApIHtcblxuXHRcdFx0XHRcdHV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApO1xuXHRcdFx0XHRcdHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0XHRcdHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYyApO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCB2QSwgdkIsIHZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjLCBUcmlhbmdsZS5ub3JtYWwoIHZBLCB2QiwgdkMgKSApO1xuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gYTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaW50ZXJzZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0Ly8gQ2hlY2sgYm91bmRpbmdCb3ggYmVmb3JlIGNvbnRpbnVpbmdcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHJheS5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGEsIGIsIGM7XG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0XHR2YXIgdXYgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2O1xuXHRcdFx0XHR2YXIgaSwgbDtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Ly8gaW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gaW5kZXguY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpbmRleC5nZXRYKCBpICk7XG5cdFx0XHRcdFx0XHRiID0gaW5kZXguZ2V0WCggaSArIDEgKTtcblx0XHRcdFx0XHRcdGMgPSBpbmRleC5nZXRYKCBpICsgMiApO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kaWNlcyBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRhID0gaTtcblx0XHRcdFx0XHRcdGIgPSBpICsgMTtcblx0XHRcdFx0XHRcdGMgPSBpICsgMjtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uaW5kZXggPSBhOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gcG9zaXRpb25zIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgZnZBLCBmdkIsIGZ2Qztcblx0XHRcdFx0dmFyIGlzTXVsdGlNYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdFx0XHR2YXIgdXZzO1xuXG5cdFx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdFx0XHRpZiAoIGZhY2VWZXJ0ZXhVdnMubGVuZ3RoID4gMCApIHV2cyA9IGZhY2VWZXJ0ZXhVdnM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGYgPSAwLCBmbCA9IGZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgZiBdO1xuXHRcdFx0XHRcdHZhciBmYWNlTWF0ZXJpYWwgPSBpc011bHRpTWF0ZXJpYWwgPyBtYXRlcmlhbFsgZmFjZS5tYXRlcmlhbEluZGV4IF0gOiBtYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGZ2QSA9IHZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdFx0XHRmdkIgPSB2ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHRcdFx0ZnZDID0gdmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdFx0aWYgKCBmYWNlTWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXHRcdFx0XHRcdFx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0XHRcdFx0XHR2QS5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZCLnNldCggMCwgMCwgMCApO1xuXHRcdFx0XHRcdFx0dkMuc2V0KCAwLCAwLCAwICk7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciB0ID0gMCwgdGwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyB0IDwgdGw7IHQgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgdCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHRhcmdldHMgPSBtb3JwaFRhcmdldHNbIHQgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdFx0XHR2QS5hZGRTY2FsZWRWZWN0b3IoIHRlbXBBLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYSBdLCBmdkEgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZCLmFkZFNjYWxlZFZlY3RvciggdGVtcEIuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5iIF0sIGZ2QiApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0XHRcdFx0dkMuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQy5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmMgXSwgZnZDICksIGluZmx1ZW5jZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZBLmFkZCggZnZBICk7XG5cdFx0XHRcdFx0XHR2Qi5hZGQoIGZ2QiApO1xuXHRcdFx0XHRcdFx0dkMuYWRkKCBmdkMgKTtcblxuXHRcdFx0XHRcdFx0ZnZBID0gdkE7XG5cdFx0XHRcdFx0XHRmdkIgPSB2Qjtcblx0XHRcdFx0XHRcdGZ2QyA9IHZDO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdXZzICYmIHV2c1sgZiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0XHR1dkEuY29weSggdXZzX2ZbIDAgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkIuY29weSggdXZzX2ZbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBCb3hHZW9tZXRyeVxuXG5mdW5jdGlvbiBCb3hHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm94R2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0ZGVwdGg6IGRlcHRoLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdGRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEJveEJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkJveEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEdlb21ldHJ5O1xuXG4vLyBCb3hCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm94QnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0ZGVwdGg6IGRlcHRoLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdGRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHNcblx0fTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdC8vIHNlZ21lbnRzXG5cblx0d2lkdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblx0ZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKSB8fCAxO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgbnVtYmVyT2ZWZXJ0aWNlcyA9IDA7XG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblxuXHQvLyBidWlsZCBlYWNoIHNpZGUgb2YgdGhlIGJveCBnZW9tZXRyeVxuXG5cdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIC0gMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCAgIHdpZHRoLCAgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDAgKTsgLy8gcHhcblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgICAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsICBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMSApOyAvLyBueFxuXHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAgIDEsICAgMSwgd2lkdGgsIGRlcHRoLCAgICBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGRlcHRoU2VnbWVudHMsICAyICk7IC8vIHB5XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsICAgMSwgLSAxLCB3aWR0aCwgZGVwdGgsICAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgIDMgKTsgLy8gbnlcblx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgICAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsICAgZGVwdGgsICB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHR2YXIgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDtcblx0XHR2YXIgc2VnbWVudEhlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdFx0dmFyIHdpZHRoSGFsZiA9IHdpZHRoIC8gMjtcblx0XHR2YXIgaGVpZ2h0SGFsZiA9IGhlaWdodCAvIDI7XG5cdFx0dmFyIGRlcHRoSGFsZiA9IGRlcHRoIC8gMjtcblxuXHRcdHZhciBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHRcdHZhciB2ZXJ0ZXhDb3VudGVyID0gMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHR2YXIgaXgsIGl5O1xuXG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcblxuXHRcdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRIZWlnaHQgLSBoZWlnaHRIYWxmO1xuXG5cdFx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0XHR2YXIgeCA9IGl4ICogc2VnbWVudFdpZHRoIC0gd2lkdGhIYWxmO1xuXG5cdFx0XHRcdC8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50XG5cblx0XHRcdFx0dmVjdG9yWyB1IF0gPSB4ICogdWRpcjtcblx0XHRcdFx0dmVjdG9yWyB2IF0gPSB5ICogdmRpcjtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aEhhbGY7XG5cblx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byB2ZXJ0ZXggYnVmZmVyXG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50XG5cblx0XHRcdFx0dmVjdG9yWyB1IF0gPSAwO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGggPiAwID8gMSA6IC0gMTtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIG5vcm1hbCBidWZmZXJcblxuXHRcdFx0XHRub3JtYWxzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHQvLyB1dnNcblxuXHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHRcdFx0Ly8gY291bnRlcnNcblxuXHRcdFx0XHR2ZXJ0ZXhDb3VudGVyICs9IDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGluZGljZXNcblxuXHRcdC8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNpbmdsZSBmYWNlXG5cdFx0Ly8gMi4gYSBzaW5nbGUgc2VnbWVudCBjb25zaXN0cyBvZiB0d28gZmFjZXNcblx0XHQvLyAzLiBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIHNpeCAoMiozKSBpbmRpY2VzIHBlciBzZWdtZW50XG5cblx0XHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciBhID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogaXk7XG5cdFx0XHRcdHZhciBiID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGMgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHRcdHZhciBkID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHQvLyBpbmNyZWFzZSBjb3VudGVyXG5cblx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIG1hdGVyaWFsSW5kZXggKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdFx0Ly8gdXBkYXRlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlc1xuXG5cdFx0bnVtYmVyT2ZWZXJ0aWNlcyArPSB2ZXJ0ZXhDb3VudGVyO1xuXG5cdH1cblxufVxuXG5Cb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFBsYW5lR2VvbWV0cnlcblxuZnVuY3Rpb24gUGxhbmVHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBsYW5lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5QbGFuZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lR2VvbWV0cnk7XG5cbi8vIFBsYW5lQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHdpZHRoX2hhbGYgPSB3aWR0aCAvIDI7XG5cdHZhciBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7XG5cblx0dmFyIGdyaWRYID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdHZhciBncmlkWSA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHR2YXIgZ3JpZFgxID0gZ3JpZFggKyAxO1xuXHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdHZhciBzZWdtZW50X3dpZHRoID0gd2lkdGggLyBncmlkWDtcblx0dmFyIHNlZ21lbnRfaGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0dmFyIGl4LCBpeTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHR2YXIgeSA9IGl5ICogc2VnbWVudF9oZWlnaHQgLSBoZWlnaHRfaGFsZjtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGl4ICogc2VnbWVudF93aWR0aCAtIHdpZHRoX2hhbGY7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIC0geSwgMCApO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcblx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGl4ICsgZ3JpZFgxICogaXk7XG5cdFx0XHR2YXIgYiA9IGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdHZhciBjID0gKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgZCA9ICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiovXG5cbmZ1bmN0aW9uIENhbWVyYSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NhbWVyYSc7XG5cblx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbkNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDYW1lcmEsXG5cblx0aXNDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGdyZWdnbWFuIC8gaHR0cDovL2dhbWVzLmdyZWdnbWFuLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQZXJzcGVjdGl2ZUNhbWVyYSc7XG5cblx0dGhpcy5mb3YgPSBmb3YgIT09IHVuZGVmaW5lZCA/IGZvdiA6IDUwO1xuXHR0aGlzLnpvb20gPSAxO1xuXG5cdHRoaXMubmVhciA9IG5lYXIgIT09IHVuZGVmaW5lZCA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gZmFyICE9PSB1bmRlZmluZWQgPyBmYXIgOiAyMDAwO1xuXHR0aGlzLmZvY3VzID0gMTA7XG5cblx0dGhpcy5hc3BlY3QgPSBhc3BlY3QgIT09IHVuZGVmaW5lZCA/IGFzcGVjdCA6IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5maWxtR2F1Z2UgPSAzNTtcdC8vIHdpZHRoIG9mIHRoZSBmaWxtIChkZWZhdWx0IGluIG1pbGxpbWV0ZXJzKVxuXHR0aGlzLmZpbG1PZmZzZXQgPSAwO1x0Ly8gaG9yaXpvbnRhbCBmaWxtIG9mZnNldCAoc2FtZSB1bml0IGFzIGdhdWdlKVxuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQZXJzcGVjdGl2ZUNhbWVyYSxcblxuXHRpc1BlcnNwZWN0aXZlQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5mb3YgPSBzb3VyY2UuZm92O1xuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XG5cblx0XHR0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHR0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7XG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgLmZpbG1HYXVnZS5cblx0ICpcblx0ICogVGhlIGRlZmF1bHQgZmlsbSBnYXVnZSBpcyAzNSwgc28gdGhhdCB0aGUgZm9jYWwgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZm9yXG5cdCAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLlxuXHQgKlxuXHQgKiBWYWx1ZXMgZm9yIGZvY2FsIGxlbmd0aCBhbmQgZmlsbSBnYXVnZSBtdXN0IGhhdmUgdGhlIHNhbWUgdW5pdC5cblx0ICovXG5cdHNldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLlxuXHQgKi9cblx0Z2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7XG5cblx0XHRyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7XG5cblx0fSxcblxuXHRnZXRFZmZlY3RpdmVGT1Y6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbihcblx0XHRcdFx0TWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tICk7XG5cblx0fSxcblxuXHRnZXRGaWxtV2lkdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBwb3J0cmFpdCBmb3JtYXQgKGFzcGVjdCA8IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlICogTWF0aC5taW4oIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHRnZXRGaWxtSGVpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZvcm1hdCAoYXNwZWN0ID4gMSlcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgLyBNYXRoLm1heCggdGhpcy5hc3BlY3QsIDEgKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIGFuIG9mZnNldCBpbiBhIGxhcmdlciBmcnVzdHVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktd2luZG93IG9yXG5cdCAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuXG5cdCAqXG5cdCAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAzeDIgbW9uaXRvcnMgYW5kIGVhY2ggbW9uaXRvciBpcyAxOTIweDEwODAgYW5kXG5cdCAqIHRoZSBtb25pdG9ycyBhcmUgaW4gZ3JpZCBsaWtlIHRoaXNcblx0ICpcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBBIHwgQiB8IEMgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICogICB8IEQgfCBFIHwgRiB8XG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKlxuXHQgKiB0aGVuIGZvciBlYWNoIG1vbml0b3IgeW91IHdvdWxkIGNhbGwgaXQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgdmFyIHcgPSAxOTIwO1xuXHQgKiAgIHZhciBoID0gMTA4MDtcblx0ICogICB2YXIgZnVsbFdpZHRoID0gdyAqIDM7XG5cdCAqICAgdmFyIGZ1bGxIZWlnaHQgPSBoICogMjtcblx0ICpcblx0ICogICAtLUEtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1CLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQy0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUQtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1FLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcsIGggKTtcblx0ICpcblx0ICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLlxuXHQgKi9cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHR0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHR0aGlzLnZpZXcgPSB7XG5cdFx0XHRmdWxsV2lkdGg6IGZ1bGxXaWR0aCxcblx0XHRcdGZ1bGxIZWlnaHQ6IGZ1bGxIZWlnaHQsXG5cdFx0XHRvZmZzZXRYOiB4LFxuXHRcdFx0b2Zmc2V0WTogeSxcblx0XHRcdHdpZHRoOiB3aWR0aCxcblx0XHRcdGhlaWdodDogaGVpZ2h0XG5cdFx0fTtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnZpZXcgPSBudWxsO1xuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5lYXIgPSB0aGlzLm5lYXIsXG5cdFx0XHR0b3AgPSBuZWFyICogTWF0aC50YW4oXG5cdFx0XHRcdFx0X01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb20sXG5cdFx0XHRoZWlnaHQgPSAyICogdG9wLFxuXHRcdFx0d2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodCxcblx0XHRcdGxlZnQgPSAtIDAuNSAqIHdpZHRoLFxuXHRcdFx0dmlldyA9IHRoaXMudmlldztcblxuXHRcdGlmICggdmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLFxuXHRcdFx0XHRmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0dG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cdFx0XHR3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0aGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDtcblxuXHRcdH1cblxuXHRcdHZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGFyb3NlIC8gaHR0cDovL2dpdGh1Yi5jb20vYXJvc2VcbiAqL1xuXG5mdW5jdGlvbiBPcnRob2dyYXBoaWNDYW1lcmEoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ09ydGhvZ3JhcGhpY0NhbWVyYSc7XG5cblx0dGhpcy56b29tID0gMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmxlZnQgPSBsZWZ0O1xuXHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdHRoaXMudG9wID0gdG9wO1xuXHR0aGlzLmJvdHRvbSA9IGJvdHRvbTtcblxuXHR0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAyMDAwO1xuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cbk9ydGhvZ3JhcGhpY0NhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT3J0aG9ncmFwaGljQ2FtZXJhLFxuXG5cdGlzT3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5sZWZ0ID0gc291cmNlLmxlZnQ7XG5cdFx0dGhpcy5yaWdodCA9IHNvdXJjZS5yaWdodDtcblx0XHR0aGlzLnRvcCA9IHNvdXJjZS50b3A7XG5cdFx0dGhpcy5ib3R0b20gPSBzb3VyY2UuYm90dG9tO1xuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcblxuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRWaWV3T2Zmc2V0OiBmdW5jdGlvbiggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0ZnVsbFdpZHRoOiBmdWxsV2lkdGgsXG5cdFx0XHRmdWxsSGVpZ2h0OiBmdWxsSGVpZ2h0LFxuXHRcdFx0b2Zmc2V0WDogeCxcblx0XHRcdG9mZnNldFk6IHksXG5cdFx0XHR3aWR0aDogd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGhlaWdodFxuXHRcdH07XG5cblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdGNsZWFyVmlld09mZnNldDogZnVuY3Rpb24oKSB7XG5cblx0XHR0aGlzLnZpZXcgPSBudWxsO1xuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBjeCA9ICggdGhpcy5yaWdodCArIHRoaXMubGVmdCApIC8gMjtcblx0XHR2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7XG5cblx0XHR2YXIgbGVmdCA9IGN4IC0gZHg7XG5cdFx0dmFyIHJpZ2h0ID0gY3ggKyBkeDtcblx0XHR2YXIgdG9wID0gY3kgKyBkeTtcblx0XHR2YXIgYm90dG9tID0gY3kgLSBkeTtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgem9vbVcgPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy53aWR0aCAvIHRoaXMudmlldy5mdWxsV2lkdGggKTtcblx0XHRcdHZhciB6b29tSCA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAvIHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7XG5cdFx0XHR2YXIgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcud2lkdGg7XG5cdFx0XHR2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuaGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFggLyB6b29tVyApO1xuXHRcdFx0cmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogKCB0aGlzLnZpZXcud2lkdGggLyB6b29tVyApO1xuXHRcdFx0dG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkgLyB6b29tSCApO1xuXHRcdFx0Ym90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cdFx0ZGF0YS5vYmplY3QubGVmdCA9IHRoaXMubGVmdDtcblx0XHRkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7XG5cdFx0ZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7XG5cdFx0ZGF0YS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b207XG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCApIHtcblxuXHR2YXIgYnVmZmVycyA9IHt9O1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1c2FnZSA9IGF0dHJpYnV0ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7XG5cblx0XHR2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHR2YXIgdHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggXCJVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheVwiICk7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5TSE9SVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5JTlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkJZVEU7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGJ1ZmZlcjogYnVmZmVyLFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5keW5hbWljID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHQvLyBOb3QgdXNpbmcgdXBkYXRlIHJhbmdlc1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJheSApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LicgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0XHRhcnJheS5zdWJhcnJheSggdXBkYXRlUmFuZ2Uub2Zmc2V0LCB1cGRhdGVSYW5nZS5vZmZzZXQgKyB1cGRhdGVSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdHVwZGF0ZVJhbmdlLmNvdW50ID0gMDsgLy8gcmVzZXQgcmFuZ2VcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBnZXQoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHJldHVybiBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXTtcblxuXHRcdGlmICggZGF0YSApIHtcblxuXHRcdFx0Z2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApO1xuXG5cdFx0XHRkZWxldGUgYnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHR2YXIgZGF0YSA9IGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXSA9IGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkYXRhLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHtcblxuXHRcdFx0dXBkYXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICk7XG5cblx0XHRcdGRhdGEudmVyc2lvbiA9IGF0dHJpYnV0ZS52ZXJzaW9uO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHtcblxuXHR2YXIgb3BhcXVlID0gW107XG5cdHZhciBvcGFxdWVMYXN0SW5kZXggPSAtIDE7XG5cblx0dmFyIHRyYW5zcGFyZW50ID0gW107XG5cdHZhciB0cmFuc3BhcmVudExhc3RJbmRleCA9IC0gMTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0b3BhcXVlTGFzdEluZGV4ID0gLSAxO1xuXHRcdHRyYW5zcGFyZW50TGFzdEluZGV4ID0gLSAxO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgeiwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgYXJyYXksIGluZGV4O1xuXG5cdFx0Ly8gYWxsb2NhdGUgdGhlIG5leHQgcG9zaXRpb24gaW4gdGhlIGFwcHJvcHJpYXRlIGFycmF5XG5cblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ICkge1xuXG5cdFx0XHRhcnJheSA9IHRyYW5zcGFyZW50O1xuXHRcdFx0aW5kZXggPSArKyB0cmFuc3BhcmVudExhc3RJbmRleDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGFycmF5ID0gb3BhcXVlO1xuXHRcdFx0aW5kZXggPSArKyBvcGFxdWVMYXN0SW5kZXg7XG5cblx0XHR9XG5cblx0XHQvLyByZWN5Y2xlIGV4aXN0aW5nIHJlbmRlciBpdGVtIG9yIGdyb3cgdGhlIGFycmF5XG5cblx0XHR2YXIgcmVuZGVySXRlbSA9IGFycmF5WyBpbmRleCBdO1xuXG5cdFx0aWYgKCByZW5kZXJJdGVtICkge1xuXG5cdFx0XHRyZW5kZXJJdGVtLmlkID0gb2JqZWN0LmlkO1xuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBvYmplY3Q7XG5cdFx0XHRyZW5kZXJJdGVtLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cdFx0XHRyZW5kZXJJdGVtLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdFx0XHRyZW5kZXJJdGVtLnByb2dyYW0gPSBtYXRlcmlhbC5wcm9ncmFtO1xuXHRcdFx0cmVuZGVySXRlbS5yZW5kZXJPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjtcblx0XHRcdHJlbmRlckl0ZW0ueiA9IHo7XG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJJdGVtID0ge1xuXHRcdFx0XHRpZDogb2JqZWN0LmlkLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdCxcblx0XHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5LFxuXHRcdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXG5cdFx0XHRcdHByb2dyYW06IG1hdGVyaWFsLnByb2dyYW0sXG5cdFx0XHRcdHJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsXG5cdFx0XHRcdHo6IHosXG5cdFx0XHRcdGdyb3VwOiBncm91cFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gYXNzZXJ0KCBpbmRleCA9PT0gYXJyYXkubGVuZ3RoICk7XG5cdFx0XHRhcnJheS5wdXNoKCByZW5kZXJJdGVtICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZpbmlzaCgpIHtcblxuXHRcdG9wYXF1ZS5sZW5ndGggPSBvcGFxdWVMYXN0SW5kZXggKyAxO1xuXHRcdHRyYW5zcGFyZW50Lmxlbmd0aCA9IHRyYW5zcGFyZW50TGFzdEluZGV4ICsgMTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc29ydCgpIHtcblxuXHRcdG9wYXF1ZS5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApO1xuXHRcdHRyYW5zcGFyZW50LnNvcnQoIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wYXF1ZTogb3BhcXVlLFxuXHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCxcblxuXHRcdGluaXQ6IGluaXQsXG5cdFx0cHVzaDogcHVzaCxcblx0XHRmaW5pc2g6IGZpbmlzaCxcblxuXHRcdHNvcnQ6IHNvcnRcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3RzKCkge1xuXG5cdHZhciBsaXN0cyA9IHt9O1xuXG5cdGZ1bmN0aW9uIGdldCggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdHZhciBoYXNoID0gc2NlbmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7XG5cdFx0dmFyIGxpc3QgPSBsaXN0c1sgaGFzaCBdO1xuXG5cdFx0aWYgKCBsaXN0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJMaXN0czonLCBoYXNoICk7XG5cblx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XG5cdFx0XHRsaXN0c1sgaGFzaCBdID0gbGlzdDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBsaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0bGlzdHMgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mb1JlbmRlciApIHtcblxuXHR2YXIgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0dmFyIHR5cGUsIHNpemU7XG5cblx0ZnVuY3Rpb24gc2V0SW5kZXgoIGluZGV4ICkge1xuXG5cdFx0aWYgKCBpbmRleC5hcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0lOVDtcblx0XHRcdHNpemUgPSA0O1xuXG5cdFx0fSBlbHNlIGlmICggaW5kZXguYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUO1xuXHRcdFx0c2l6ZSA9IDI7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcblx0XHRcdHNpemUgPSAxO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogc2l6ZSApO1xuXG5cdFx0aW5mb1JlbmRlci5jYWxscyArKztcblx0XHRpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50O1xuXG5cdFx0aWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZhY2VzICs9IGNvdW50IC8gMztcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbi5kcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogc2l6ZSwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdGluZm9SZW5kZXIuY2FsbHMgKys7XG5cdFx0aW5mb1JlbmRlci52ZXJ0aWNlcyArPSBjb3VudCAqIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50O1xuXG5cdFx0aWYgKCBtb2RlID09PSBnbC5UUklBTkdMRVMgKSBpbmZvUmVuZGVyLmZhY2VzICs9IGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICogY291bnQgLyAzO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mb1JlbmRlciApIHtcblxuXHR2YXIgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHRnbC5kcmF3QXJyYXlzKCBtb2RlLCBzdGFydCwgY291bnQgKTtcblxuXHRcdGluZm9SZW5kZXIuY2FsbHMgKys7XG5cdFx0aW5mb1JlbmRlci52ZXJ0aWNlcyArPSBjb3VudDtcblxuXHRcdGlmICggbW9kZSA9PT0gZ2wuVFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBjb3VudCAvIDM7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGNvdW50ID0gcG9zaXRpb24uZGF0YS5jb3VudDtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBzdGFydCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9XG5cblx0XHRpbmZvUmVuZGVyLmNhbGxzICsrO1xuXHRcdGluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQgKiBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdGlmICggbW9kZSA9PT0gZ2wuVFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNvdW50IC8gMztcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xuXHR0aGlzLnJlbmRlciA9IHJlbmRlcjtcblx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMR2VvbWV0cmllcyggZ2wsIGF0dHJpYnV0ZXMsIGluZm9NZW1vcnkgKSB7XG5cblx0dmFyIGdlb21ldHJpZXMgPSB7fTtcblx0dmFyIHdpcmVmcmFtZUF0dHJpYnV0ZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBvbkdlb21ldHJ5RGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBldmVudC50YXJnZXQ7XG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5pbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlcyApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmF0dHJpYnV0ZXNbIG5hbWUgXSApO1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xuXG5cdFx0ZGVsZXRlIGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHQvLyBUT0RPIFJlbW92ZSBkdXBsaWNhdGUgY29kZVxuXG5cdFx0dmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHRhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBidWZmZXJnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcblx0XHRcdGRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBidWZmZXJnZW9tZXRyeS5pZCBdO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGluZm9NZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0aW5mb01lbW9yeS5nZW9tZXRyaWVzICsrO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggaW5kZXgsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeUF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXSwgZ2wuQVJSQVlfQlVGRkVSICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXJyYXlbIGkgXSwgZ2wuQVJSQVlfQlVGRkVSICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSByZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0dmFyIGluZGljZXMgPSBbXTtcblxuXHRcdHZhciBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBjb25zb2xlLnRpbWUoICd3aXJlZnJhbWUnICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IGdlb21ldHJ5SW5kZXguYXJyYXk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IGFycmF5WyBpICsgMCBdO1xuXHRcdFx0XHR2YXIgYiA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0XHR2YXIgYyA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IGkgKyAwO1xuXHRcdFx0XHR2YXIgYiA9IGkgKyAxO1xuXHRcdFx0XHR2YXIgYyA9IGkgKyAyO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWVFbmQoICd3aXJlZnJhbWUnICk7XG5cblx0XHRhdHRyaWJ1dGUgPSBuZXcgKCBhcnJheU1heCggaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApO1xuXG5cdFx0YXR0cmlidXRlcy51cGRhdGUoIGF0dHJpYnV0ZSwgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIgKTtcblxuXHRcdHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBnZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cblx0XHRnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6IGdldFdpcmVmcmFtZUF0dHJpYnV0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkge1xuXG5cdHZhciBsaWdodHMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0XHRpZiAoIGxpZ2h0c1sgbGlnaHQuaWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVuaWZvcm1zO1xuXG5cdFx0XHRzd2l0Y2ggKCBsaWdodC50eXBlICkge1xuXG5cdFx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdFx0Y29uZUNvczogMCxcblx0XHRcdFx0XHRcdHBlbnVtYnJhQ29zOiAwLFxuXHRcdFx0XHRcdFx0ZGVjYXk6IDAsXG5cblx0XHRcdFx0XHRcdHNoYWRvdzogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdFx0ZGVjYXk6IDAsXG5cblx0XHRcdFx0XHRcdHNoYWRvdzogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdHNreUNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGdyb3VuZENvbG9yOiBuZXcgQ29sb3IoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGhhbGZXaWR0aDogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGhhbGZIZWlnaHQ6IG5ldyBWZWN0b3IzKClcblx0XHRcdFx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBzZXQgUmVjdEFyZWFMaWdodCBzaGFkb3cgdW5pZm9ybXNcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxpZ2h0c1sgbGlnaHQuaWQgXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRyZXR1cm4gdW5pZm9ybXM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xPYmplY3RzKCBnbCwgZ2VvbWV0cmllcywgaW5mb1JlbmRlciApIHtcblxuXHR2YXIgdXBkYXRlTGlzdCA9IHt9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGZyYW1lID0gaW5mb1JlbmRlci5mcmFtZTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggb2JqZWN0LCBnZW9tZXRyeSApO1xuXG5cdFx0Ly8gVXBkYXRlIG9uY2UgcGVyIGZyYW1lXG5cblx0XHRpZiAoIHVwZGF0ZUxpc3RbIGJ1ZmZlcmdlb21ldHJ5LmlkIF0gIT09IGZyYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0YnVmZmVyZ2VvbWV0cnkudXBkYXRlRnJvbU9iamVjdCggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHRcdHVwZGF0ZUxpc3RbIGJ1ZmZlcmdlb21ldHJ5LmlkIF0gPSBmcmFtZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cblx0XHR1cGRhdGVMaXN0ID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRjbGVhcjogY2xlYXJcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkge1xuXG5cdHZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xcbicgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRsaW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBsaW5lcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMU2hhZGVyKCBnbCwgdHlwZSwgc3RyaW5nICkge1xuXG5cdHZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTtcblxuXHRnbC5zaGFkZXJTb3VyY2UoIHNoYWRlciwgc3RyaW5nICk7XG5cdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xuXG5cdGlmICggZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTICkgPT09IGZhbHNlICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU2hhZGVyOiBTaGFkZXIgY291bGRuXFwndCBjb21waWxlLicgKTtcblxuXHR9XG5cblx0aWYgKCBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKSAhPT0gJycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpJywgdHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50JywgZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICksIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSApO1xuXG5cdH1cblxuXHQvLyAtLWVuYWJsZS1wcml2aWxlZ2VkLXdlYmdsLWV4dGVuc2lvblxuXHQvLyBjb25zb2xlLmxvZyggdHlwZSwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApO1xuXG5cdHJldHVybiBzaGFkZXI7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBwcm9ncmFtSWRDb3VudCA9IDA7XG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKSB7XG5cblx0c3dpdGNoICggZW5jb2RpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhckVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0xpbmVhcicsJyggdmFsdWUgKScgXTtcblx0XHRjYXNlIHNSR0JFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdzUkdCJywnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JNN0VuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQk0nLCcoIHZhbHVlLCA3LjAgKScgXTtcblx0XHRjYXNlIFJHQk0xNkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQk0nLCcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsJyggdmFsdWUsIDI1Ni4wICknIF07XG5cdFx0Y2FzZSBHYW1tYUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0dhbW1hJywnKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICknIF07XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gXCJ2ZWM0IFwiICsgZnVuY3Rpb25OYW1lICsgXCIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBcIiArIGNvbXBvbmVudHNbIDAgXSArIFwiVG9MaW5lYXJcIiArIGNvbXBvbmVudHNbIDEgXSArIFwiOyB9XCI7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gXCJ2ZWM0IFwiICsgZnVuY3Rpb25OYW1lICsgXCIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUb1wiICsgY29tcG9uZW50c1sgMCBdICsgY29tcG9uZW50c1sgMSBdICsgXCI7IH1cIjtcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gXCJMaW5lYXJcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBSZWluaGFyZFRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gXCJSZWluaGFyZFwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVuY2hhcnRlZDJUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9IFwiVW5jaGFydGVkMlwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gXCJPcHRpbWl6ZWRDaW5lb25cIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAnICsgdG9uZU1hcHBpbmcgKTtcblxuXHR9XG5cblx0cmV0dXJuIFwidmVjMyBcIiArIGZ1bmN0aW9uTmFtZSArIFwiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gXCIgKyB0b25lTWFwcGluZ05hbWUgKyBcIlRvbmVNYXBwaW5nKCBjb2xvciApOyB9XCI7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCByZW5kZXJlckV4dGVuc2lvbnMgKSB7XG5cblx0ZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307XG5cblx0dmFyIGNodW5rcyA9IFtcblx0XHQoIGV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgfHwgcGFyYW1ldGVycy5lbnZNYXBDdWJlVVYgfHwgcGFyYW1ldGVycy5idW1wTWFwIHx8IHBhcmFtZXRlcnMubm9ybWFsTWFwIHx8IHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgKSA/ICcjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZnJhZ0RlcHRoIHx8IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5kcmF3QnVmZmVycyApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kcmF3X2J1ZmZlcnMnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZScgOiAnJ1xuXHRdO1xuXG5cdHJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApIHtcblxuXHR2YXIgY2h1bmtzID0gW107XG5cblx0Zm9yICggdmFyIG5hbWUgaW4gZGVmaW5lcyApIHtcblxuXHRcdHZhciB2YWx1ZSA9IGRlZmluZXNbIG5hbWUgXTtcblxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRjaHVua3MucHVzaCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtLCBpZGVudGlmaWVycyApIHtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTtcblx0XHR2YXIgbmFtZSA9IGluZm8ubmFtZTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKFwiVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTpcIiwgbmFtZSwgaSApO1xuXG5cdFx0YXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGF0dHJpYnV0ZXM7XG5cbn1cblxuZnVuY3Rpb24gZmlsdGVyRW1wdHlMaW5lKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZyAhPT0gJyc7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUxpZ2h0TnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX0hFTUlfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyApO1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZXMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuXSspPi9nbTtcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRcdHZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcblxuXHRcdGlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gL2ZvciBcXCggaW50IGkgXFw9IChcXGQrKVxcOyBpIDwgKFxcZCspXFw7IGkgXFwrXFwrIFxcKSBcXHsoW1xcc1xcU10rPykoPz1cXH0pXFx9L2c7XG5cblx0ZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQgKSB7XG5cblx0XHR2YXIgdW5yb2xsID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHBhcnNlSW50KCBzdGFydCApOyBpIDwgcGFyc2VJbnQoIGVuZCApOyBpICsrICkge1xuXG5cdFx0XHR1bnJvbGwgKz0gc25pcHBldC5yZXBsYWNlKCAvXFxbIGkgXFxdL2csICdbICcgKyBpICsgJyBdJyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVucm9sbDtcblxuXHR9XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBsYWNlICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgY29kZSwgbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDtcblxuXHR2YXIgZXh0ZW5zaW9ucyA9IG1hdGVyaWFsLmV4dGVuc2lvbnM7XG5cdHZhciBkZWZpbmVzID0gbWF0ZXJpYWwuZGVmaW5lcztcblxuXHR2YXIgdmVydGV4U2hhZGVyID0gbWF0ZXJpYWwuX193ZWJnbFNoYWRlci52ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudFNoYWRlciA9IG1hdGVyaWFsLl9fd2ViZ2xTaGFkZXIuZnJhZ21lbnRTaGFkZXI7XG5cblx0dmFyIHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fVxuXG5cdHZhciBlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHR2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJztcblx0dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9FUVVJUkVDJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfU1BIRVJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmNvbWJpbmUgKSB7XG5cblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE1peE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2FtbWFGYWN0b3JEZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0b3IgOiAxLjA7XG5cblx0Ly8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7XG5cblx0Ly9cblxuXHR2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXIuZXh0ZW5zaW9ucyApO1xuXG5cdHZhciBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Ly9cblxuXHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHR2YXIgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblxuXHRpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xuXG5cdFx0XHRjdXN0b21FeHRlbnNpb25zLFxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgbWF0ZXJpYWwuX193ZWJnbFNoYWRlci5uYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBWRVJURVhfVEVYVFVSRVMnIDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCcjZGVmaW5lIE1BWF9CT05FUyAnICsgcGFyYW1ldGVycy5tYXhCb25lcyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcCAmJiBwYXJhbWV0ZXJzLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNraW5uaW5nID8gJyNkZWZpbmUgVVNFX1NLSU5OSU5HJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy51c2VWZXJ0ZXhUZXh0dXJlID8gJyNkZWZpbmUgQk9ORV9URVhUVVJFJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA/ICcjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1vcnBoTm9ybWFscyAmJiBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID09PSBmYWxzZSA/ICcjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBOVU1fQ0xJUFBJTkdfUExBTkVTICcgKyBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaXplQXR0ZW51YXRpb24gPyAnI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgbm9ybWFsOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfQ09MT1InLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOycsXG5cblx0XHRcdCdcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwxOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7JyxcblxuXHRcdFx0J1x0I2Vsc2UnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsnLFxuXG5cdFx0XHQnXHQjZW5kaWYnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfU0tJTk5JTkcnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xuXG5cdFx0XHRjdXN0b21FeHRlbnNpb25zLFxuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgZmxvYXQ7Jyxcblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBpbnQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIG1hdGVyaWFsLl9fd2ViZ2xTaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICcjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBOVU1fQ0xJUFBJTkdfUExBTkVTICcgKyBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzLFxuXHRcdFx0JyNkZWZpbmUgVU5JT05fQ0xJUFBJTkdfUExBTkVTICcgKyAocGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiksXG5cblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA/IFwiI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBXCIgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA/IFwiI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXCIgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHJlbmRlcmVyLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCAmJiByZW5kZXJlci5leHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2RlZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IFwiI2RlZmluZSBUT05FX01BUFBJTkdcIiA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdG9uZU1hcHBpbmcoKSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIFwidG9uZU1hcHBpbmdcIiwgcGFyYW1ldGVycy50b25lTWFwcGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGl0aGVyaW5nID8gJyNkZWZpbmUgRElUSEVSSU5HJyA6ICcnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgfHwgcGFyYW1ldGVycy5tYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApID8gU2hhZGVyQ2h1bmtbICdlbmNvZGluZ3NfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5jb2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0cGFyYW1ldGVycy5tYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyA/IGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggXCJsaW5lYXJUb091dHB1dFRleGVsXCIsIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA/IFwiI2RlZmluZSBERVBUSF9QQUNLSU5HIFwiICsgbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogJycsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9XG5cblx0dmVydGV4U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGlmICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0dmVydGV4U2hhZGVyID0gdW5yb2xsTG9vcHMoIHZlcnRleFNoYWRlciApO1xuXHRcdGZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0fVxuXG5cdHZhciB2ZXJ0ZXhHbHNsID0gcHJlZml4VmVydGV4ICsgdmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRHbHNsID0gcHJlZml4RnJhZ21lbnQgKyBmcmFnbWVudFNoYWRlcjtcblxuXHQvLyBjb25zb2xlLmxvZyggJypWRVJURVgqJywgdmVydGV4R2xzbCApO1xuXHQvLyBjb25zb2xlLmxvZyggJypGUkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTtcblxuXHR2YXIgZ2xWZXJ0ZXhTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleEdsc2wgKTtcblx0dmFyIGdsRnJhZ21lbnRTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRHbHNsICk7XG5cblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBGb3JjZSBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIHRvIGluZGV4IDAuXG5cblx0aWYgKCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgKTtcblxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdC8vIHByb2dyYW1zIHdpdGggbW9ycGhUYXJnZXRzIGRpc3BsYWNlIHBvc2l0aW9uIG91dCBvZiBhdHRyaWJ1dGUgMFxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgJ3Bvc2l0aW9uJyApO1xuXG5cdH1cblxuXHRnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdHZhciBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coIHByb2dyYW0gKTtcblx0dmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICk7XG5cdHZhciBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHR2YXIgcnVubmFibGUgPSB0cnVlO1xuXHR2YXIgaGF2ZURpYWdub3N0aWNzID0gdHJ1ZTtcblxuXHQvLyBjb25zb2xlLmxvZyggJyoqVkVSVEVYKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsVmVydGV4U2hhZGVyICkgKTtcblx0Ly8gY29uc29sZS5sb2coICcqKkZSQUdNRU5UKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsRnJhZ21lbnRTaGFkZXIgKSApO1xuXG5cdGlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRydW5uYWJsZSA9IGZhbHNlO1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAnLCBnbC5nZXRFcnJvcigpLCAnZ2wuVkFMSURBVEVfU1RBVFVTJywgZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTICksICdnbC5nZXRQcm9ncmFtSW5mb0xvZycsIHByb2dyYW1Mb2csIHZlcnRleExvZywgZnJhZ21lbnRMb2cgKTtcblxuXHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coKScsIHByb2dyYW1Mb2cgKTtcblxuXHR9IGVsc2UgaWYgKCB2ZXJ0ZXhMb2cgPT09ICcnIHx8IGZyYWdtZW50TG9nID09PSAnJyApIHtcblxuXHRcdGhhdmVEaWFnbm9zdGljcyA9IGZhbHNlO1xuXG5cdH1cblxuXHRpZiAoIGhhdmVEaWFnbm9zdGljcyApIHtcblxuXHRcdHRoaXMuZGlhZ25vc3RpY3MgPSB7XG5cblx0XHRcdHJ1bm5hYmxlOiBydW5uYWJsZSxcblx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblxuXHRcdFx0cHJvZ3JhbUxvZzogcHJvZ3JhbUxvZyxcblxuXHRcdFx0dmVydGV4U2hhZGVyOiB7XG5cblx0XHRcdFx0bG9nOiB2ZXJ0ZXhMb2csXG5cdFx0XHRcdHByZWZpeDogcHJlZml4VmVydGV4XG5cblx0XHRcdH0sXG5cblx0XHRcdGZyYWdtZW50U2hhZGVyOiB7XG5cblx0XHRcdFx0bG9nOiBmcmFnbWVudExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhGcmFnbWVudFxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHQvLyBjbGVhbiB1cFxuXG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuZGVsZXRlU2hhZGVyKCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIHVuaWZvcm0gbG9jYXRpb25zXG5cblx0dmFyIGNhY2hlZFVuaWZvcm1zO1xuXG5cdHRoaXMuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbigpIHtcblxuXHRcdGlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkVW5pZm9ybXMgPVxuXHRcdFx0XHRuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XG5cblx0fTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlZEF0dHJpYnV0ZXMgPSBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdH07XG5cblx0Ly8gZnJlZSByZXNvdXJjZVxuXG5cdHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0Z2wuZGVsZXRlUHJvZ3JhbSggcHJvZ3JhbSApO1xuXHRcdHRoaXMucHJvZ3JhbSA9IHVuZGVmaW5lZDtcblxuXHR9O1xuXG5cdC8vIERFUFJFQ0FURURcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAudW5pZm9ybXMgaXMgbm93IC5nZXRVbmlmb3JtcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0VW5pZm9ybXMoKTtcblxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRhdHRyaWJ1dGVzOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLmF0dHJpYnV0ZXMgaXMgbm93IC5nZXRBdHRyaWJ1dGVzKCkuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRcdH1cblx0XHR9XG5cblx0fSApO1xuXG5cblx0Ly9cblxuXHR0aGlzLmlkID0gcHJvZ3JhbUlkQ291bnQgKys7XG5cdHRoaXMuY29kZSA9IGNvZGU7XG5cdHRoaXMudXNlZFRpbWVzID0gMTtcblx0dGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBnbFZlcnRleFNoYWRlcjtcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IGdsRnJhZ21lbnRTaGFkZXI7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIHByb2dyYW1zID0gW107XG5cblx0dmFyIHNoYWRlcklEcyA9IHtcblx0XHRNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJyxcblx0XHRNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLFxuXHRcdE1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0Jyxcblx0XHRNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdExpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnXG5cdH07XG5cblx0dmFyIHBhcmFtZXRlck5hbWVzID0gW1xuXHRcdFwicHJlY2lzaW9uXCIsIFwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlc1wiLCBcIm1hcFwiLCBcIm1hcEVuY29kaW5nXCIsIFwiZW52TWFwXCIsIFwiZW52TWFwTW9kZVwiLCBcImVudk1hcEVuY29kaW5nXCIsXG5cdFx0XCJsaWdodE1hcFwiLCBcImFvTWFwXCIsIFwiZW1pc3NpdmVNYXBcIiwgXCJlbWlzc2l2ZU1hcEVuY29kaW5nXCIsIFwiYnVtcE1hcFwiLCBcIm5vcm1hbE1hcFwiLCBcImRpc3BsYWNlbWVudE1hcFwiLCBcInNwZWN1bGFyTWFwXCIsXG5cdFx0XCJyb3VnaG5lc3NNYXBcIiwgXCJtZXRhbG5lc3NNYXBcIiwgXCJncmFkaWVudE1hcFwiLFxuXHRcdFwiYWxwaGFNYXBcIiwgXCJjb21iaW5lXCIsIFwidmVydGV4Q29sb3JzXCIsIFwiZm9nXCIsIFwidXNlRm9nXCIsIFwiZm9nRXhwXCIsXG5cdFx0XCJmbGF0U2hhZGluZ1wiLCBcInNpemVBdHRlbnVhdGlvblwiLCBcImxvZ2FyaXRobWljRGVwdGhCdWZmZXJcIiwgXCJza2lubmluZ1wiLFxuXHRcdFwibWF4Qm9uZXNcIiwgXCJ1c2VWZXJ0ZXhUZXh0dXJlXCIsIFwibW9ycGhUYXJnZXRzXCIsIFwibW9ycGhOb3JtYWxzXCIsXG5cdFx0XCJtYXhNb3JwaFRhcmdldHNcIiwgXCJtYXhNb3JwaE5vcm1hbHNcIiwgXCJwcmVtdWx0aXBsaWVkQWxwaGFcIixcblx0XHRcIm51bURpckxpZ2h0c1wiLCBcIm51bVBvaW50TGlnaHRzXCIsIFwibnVtU3BvdExpZ2h0c1wiLCBcIm51bUhlbWlMaWdodHNcIiwgXCJudW1SZWN0QXJlYUxpZ2h0c1wiLFxuXHRcdFwic2hhZG93TWFwRW5hYmxlZFwiLCBcInNoYWRvd01hcFR5cGVcIiwgXCJ0b25lTWFwcGluZ1wiLCAncGh5c2ljYWxseUNvcnJlY3RMaWdodHMnLFxuXHRcdFwiYWxwaGFUZXN0XCIsIFwiZG91YmxlU2lkZWRcIiwgXCJmbGlwU2lkZWRcIiwgXCJudW1DbGlwcGluZ1BsYW5lc1wiLCBcIm51bUNsaXBJbnRlcnNlY3Rpb25cIiwgXCJkZXB0aFBhY2tpbmdcIiwgXCJkaXRoZXJpbmdcIlxuXHRdO1xuXG5cblx0ZnVuY3Rpb24gYWxsb2NhdGVCb25lcyggb2JqZWN0ICkge1xuXG5cdFx0dmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xuXHRcdHZhciBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0cmV0dXJuIDEwMjQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBkZWZhdWx0IGZvciB3aGVuIG9iamVjdCBpcyBub3Qgc3BlY2lmaWVkXG5cdFx0XHQvLyAoIGZvciBleGFtcGxlIHdoZW4gcHJlYnVpbGRpbmcgc2hhZGVyIHRvIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBvYmplY3RzIClcblx0XHRcdC8vXG5cdFx0XHQvLyAgLSBsZWF2ZSBzb21lIGV4dHJhIHNwYWNlIGZvciBvdGhlciB1bmlmb3Jtc1xuXHRcdFx0Ly8gIC0gbGltaXQgaGVyZSBpcyBBTkdMRSdzIDI1NCBtYXggdW5pZm9ybSB2ZWN0b3JzXG5cdFx0XHQvLyAgICAodXAgdG8gNTQgc2hvdWxkIGJlIHNhZmUpXG5cblx0XHRcdHZhciBuVmVydGV4VW5pZm9ybXMgPSBjYXBhYmlsaXRpZXMubWF4VmVydGV4VW5pZm9ybXM7XG5cdFx0XHR2YXIgblZlcnRleE1hdHJpY2VzID0gTWF0aC5mbG9vciggKCBuVmVydGV4VW5pZm9ybXMgLSAyMCApIC8gNCApO1xuXG5cdFx0XHR2YXIgbWF4Qm9uZXMgPSBNYXRoLm1pbiggblZlcnRleE1hdHJpY2VzLCBib25lcy5sZW5ndGggKTtcblxuXHRcdFx0aWYgKCBtYXhCb25lcyA8IGJvbmVzLmxlbmd0aCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgJyArIGJvbmVzLmxlbmd0aCArICcgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICcgKyBtYXhCb25lcyArICcuJyApO1xuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF4Qm9uZXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hcCwgZ2FtbWFPdmVycmlkZUxpbmVhciApIHtcblxuXHRcdHZhciBlbmNvZGluZztcblxuXHRcdGlmICggISBtYXAgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IG1hcC5lbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRlbmNvZGluZyA9IG1hcC50ZXh0dXJlLmVuY29kaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBXZWJHTFJlbmRlcmVyLmdhbW1hSW5wdXQvZ2FtbWFPdXRwdXQgcGFyYW1ldGVyLCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LlxuXHRcdGlmICggZW5jb2RpbmcgPT09IExpbmVhckVuY29kaW5nICYmIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gR2FtbWFFbmNvZGluZztcblxuXHRcdH1cblxuXHRcdHJldHVybiBlbmNvZGluZztcblxuXHR9XG5cblx0dGhpcy5nZXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgbGlnaHRzLCBmb2csIG5DbGlwUGxhbmVzLCBuQ2xpcEludGVyc2VjdGlvbiwgb2JqZWN0ICkge1xuXG5cdFx0dmFyIHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07XG5cblx0XHQvLyBoZXVyaXN0aWNzIHRvIGNyZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZVxuXHRcdC8vIChub3QgdG8gYmxvdyBvdmVyIG1heExpZ2h0cyBidWRnZXQpXG5cblx0XHR2YXIgbWF4Qm9uZXMgPSBvYmplY3QuaXNTa2lubmVkTWVzaCA/IGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIDogMDtcblx0XHR2YXIgcHJlY2lzaW9uID0gcmVuZGVyZXIuZ2V0UHJlY2lzaW9uKCk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0cHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0ge1xuXG5cdFx0XHRzaGFkZXJJRDogc2hhZGVySUQsXG5cblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLFxuXHRcdFx0b3V0cHV0RW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkgPyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1dCApLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCxcblx0XHRcdGVudk1hcE1vZGU6IG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyxcblx0XHRcdGVudk1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbnZNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgfHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgKSApLFxuXHRcdFx0bGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdGRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXHRcdFx0cm91Z2huZXNzTWFwOiAhISBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsXG5cdFx0XHRtZXRhbG5lc3NNYXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCxcblx0XHRcdHNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCxcblx0XHRcdGFscGhhTWFwOiAhISBtYXRlcmlhbC5hbHBoYU1hcCxcblxuXHRcdFx0Z3JhZGllbnRNYXA6ICEhIG1hdGVyaWFsLmdyYWRpZW50TWFwLFxuXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxuXG5cdFx0XHR2ZXJ0ZXhDb2xvcnM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyxcblxuXHRcdFx0Zm9nOiAhISBmb2csXG5cdFx0XHR1c2VGb2c6IG1hdGVyaWFsLmZvZyxcblx0XHRcdGZvZ0V4cDogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuc2hhZGluZyA9PT0gRmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRcdHNraW5uaW5nOiBtYXRlcmlhbC5za2lubmluZyAmJiBtYXhCb25lcyA+IDAsXG5cdFx0XHRtYXhCb25lczogbWF4Qm9uZXMsXG5cdFx0XHR1c2VWZXJ0ZXhUZXh0dXJlOiBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsXG5cdFx0XHRtb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFscyxcblx0XHRcdG1heE1vcnBoVGFyZ2V0czogcmVuZGVyZXIubWF4TW9ycGhUYXJnZXRzLFxuXHRcdFx0bWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bUNsaXBwaW5nUGxhbmVzOiBuQ2xpcFBsYW5lcyxcblx0XHRcdG51bUNsaXBJbnRlcnNlY3Rpb246IG5DbGlwSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgbGlnaHRzLnNoYWRvd3MubGVuZ3RoID4gMCxcblx0XHRcdHNoYWRvd01hcFR5cGU6IHJlbmRlcmVyLnNoYWRvd01hcC50eXBlLFxuXG5cdFx0XHR0b25lTWFwcGluZzogcmVuZGVyZXIudG9uZU1hcHBpbmcsXG5cdFx0XHRwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czogcmVuZGVyZXIucGh5c2ljYWxseUNvcnJlY3RMaWdodHMsXG5cblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLFxuXG5cdFx0XHRhbHBoYVRlc3Q6IG1hdGVyaWFsLmFscGhhVGVzdCxcblx0XHRcdGRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLFxuXHRcdFx0ZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSxcblxuXHRcdFx0ZGVwdGhQYWNraW5nOiAoIG1hdGVyaWFsLmRlcHRoUGFja2luZyAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiBmYWxzZVxuXG5cdFx0fTtcblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQcm9ncmFtQ29kZSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGFkZXJJRCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgKTtcblx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLnZlcnRleFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIG1hdGVyaWFsLmRlZmluZXMgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbmFtZSApO1xuXHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5kZWZpbmVzWyBuYW1lIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzWyBwYXJhbWV0ZXJOYW1lc1sgaSBdIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheS5qb2luKCk7XG5cblx0fTtcblxuXHR0aGlzLmFjcXVpcmVQcm9ncmFtID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgcGFyYW1ldGVycywgY29kZSApIHtcblxuXHRcdHZhciBwcm9ncmFtO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7XG5cblx0XHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1JbmZvO1xuXHRcdFx0XHQrKyBwcm9ncmFtLnVzZWRUaW1lcztcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgY29kZSwgbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblx0XHRcdHByb2dyYW1zLnB1c2goIHByb2dyYW0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH07XG5cblx0dGhpcy5yZWxlYXNlUHJvZ3JhbSA9IGZ1bmN0aW9uICggcHJvZ3JhbSApIHtcblxuXHRcdGlmICggLS0gcHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBmcm9tIHVub3JkZXJlZCBzZXRcblx0XHRcdHZhciBpID0gcHJvZ3JhbXMuaW5kZXhPZiggcHJvZ3JhbSApO1xuXHRcdFx0cHJvZ3JhbXNbIGkgXSA9IHByb2dyYW1zWyBwcm9ncmFtcy5sZW5ndGggLSAxIF07XG5cdFx0XHRwcm9ncmFtcy5wb3AoKTtcblxuXHRcdFx0Ly8gRnJlZSBXZWJHTCByZXNvdXJjZXNcblx0XHRcdHByb2dyYW0uZGVzdHJveSgpO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0Ly8gRXhwb3NlZCBmb3IgcmVzb3VyY2UgbW9uaXRvcmluZyAmIGVycm9yIGZlZWRiYWNrIHZpYSByZW5kZXJlci5pbmZvOlxuXHR0aGlzLnByb2dyYW1zID0gcHJvZ3JhbXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgcGFyYW1UaHJlZVRvR0wsIGluZm9NZW1vcnkgKSB7XG5cblx0dmFyIF9pc1dlYkdMMiA9ICggdHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIF9nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGNsYW1wVG9NYXhTaXplKCBpbWFnZSwgbWF4U2l6ZSApIHtcblxuXHRcdGlmICggaW1hZ2Uud2lkdGggPiBtYXhTaXplIHx8IGltYWdlLmhlaWdodCA+IG1heFNpemUgKSB7XG5cblx0XHRcdC8vIFdhcm5pbmc6IFNjYWxpbmcgdGhyb3VnaCB0aGUgY2FudmFzIHdpbGwgb25seSB3b3JrIHdpdGggaW1hZ2VzIHRoYXQgdXNlXG5cdFx0XHQvLyBwcmVtdWx0aXBsaWVkIGFscGhhLlxuXG5cdFx0XHR2YXIgc2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0dmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0Y2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggaW1hZ2Uud2lkdGggKiBzY2FsZSApO1xuXHRcdFx0Y2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3IoIGltYWdlLmhlaWdodCAqIHNjYWxlICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIHRvbyBiaWcgKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBjYW52YXMud2lkdGggKyAneCcgKyBjYW52YXMuaGVpZ2h0LCBpbWFnZSApO1xuXG5cdFx0XHRyZXR1cm4gY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0cmV0dXJuIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKSAmJiBfTWF0aC5pc1Bvd2VyT2ZUd28oIGltYWdlLmhlaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBtYWtlUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBfTWF0aC5uZWFyZXN0UG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKTtcblx0XHRcdGNhbnZhcy5oZWlnaHQgPSBfTWF0aC5uZWFyZXN0UG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBjYW52YXMud2lkdGggKyAneCcgKyBjYW52YXMuaGVpZ2h0LCBpbWFnZSApO1xuXG5cdFx0XHRyZXR1cm4gY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkge1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHQvLyBGYWxsYmFjayBmaWx0ZXJzIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuXG5cdGZ1bmN0aW9uIGZpbHRlckZhbGxiYWNrKCBmICkge1xuXG5cdFx0aWYgKCBmID09PSBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdHJldHVybiBfZ2wuTkVBUkVTVDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBfZ2wuTElORUFSO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGluZm9NZW1vcnkudGV4dHVyZXMgLS07XG5cblxuXHR9XG5cblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7XG5cblx0XHRyZW5kZXJUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0aW5mb01lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0Ly8gY3ViZSB0ZXh0dXJlXG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAyRCB0ZXh0dXJlXG5cblx0XHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXNcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdGlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cblx0Ly9cblxuXG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0dmFyIGltYWdlID0gdGV4dHVyZS5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCcsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW1hZ2UuY29tcGxldGUgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUnLCB0ZXh0dXJlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdFx0aWYgKCAhIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdFx0XHRpbmZvTWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblxuXHRcdFx0XHR2YXIgaXNDb21wcmVzc2VkID0gKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApO1xuXHRcdFx0XHR2YXIgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRcdFx0dmFyIGN1YmVJbWFnZSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZVsgaSBdLCBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemUgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sXG5cdFx0XHRcdGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0XHRnbEZvcm1hdCA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0XHRnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBjdWJlSW1hZ2VbIGkgXS53aWR0aCwgY3ViZUltYWdlWyBpIF0uaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXS5kYXRhICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gY3ViZUltYWdlWyBpIF0ubWlwbWFwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IG1pcG1hcHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggc3RhdGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpXCIgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdFx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVQYXJhbWV0ZXJzKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0aWYgKCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLndyYXBTICkgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS53cmFwVCApICk7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmUubWFnRmlsdGVyICkgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmUubWluRmlsdGVyICkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIF9nbC5DTEFNUF9UT19FREdFICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS53cmFwUyBhbmQgVGV4dHVyZS53cmFwVCBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLkNsYW1wVG9FZGdlV3JhcHBpbmcuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWFnRmlsdGVyICkgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWluRmlsdGVyICkgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4nLCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47XG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUuYW5pc290cm9weSA+IDEgfHwgcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJmKCB0ZXh0dXJlVHlwZSwgZXh0ZW5zaW9uLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbiggdGV4dHVyZS5hbmlzb3Ryb3B5LCBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpICkgKTtcblx0XHRcdFx0cHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ID0gdGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9IHRydWU7XG5cblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0aW5mb01lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfQUxJR05NRU5ULCB0ZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xuXG5cdFx0dmFyIGltYWdlID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2UsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgJiYgaXNQb3dlck9mVHdvKCBpbWFnZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0aW1hZ2UgPSBtYWtlUG93ZXJPZlR3byggaW1hZ2UgKTtcblxuXHRcdH1cblxuXHRcdHZhciBpc1Bvd2VyT2ZUd29JbWFnZSA9IGlzUG93ZXJPZlR3byggaW1hZ2UgKSxcblx0XHRnbEZvcm1hdCA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdGdsVHlwZSA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdHZhciBtaXBtYXAsIG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7XG5cblx0XHRpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7XG5cblx0XHRcdC8vIHBvcHVsYXRlIGRlcHRoIHRleHR1cmUgd2l0aCBkdW1teSBkYXRhXG5cblx0XHRcdHZhciBpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQ7XG5cblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhX2lzV2ViR0wyICkgdGhyb3cgbmV3IEVycm9yKCdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyk7XG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDMyRjtcblxuXHRcdFx0fSBlbHNlIGlmICggX2lzV2ViR0wyICkge1xuXG5cdFx0XHRcdC8vIFdlYkdMIDIuMCByZXF1aXJlcyBzaWduZWQgaW50ZXJuYWxmb3JtYXQgZm9yIGdsVGV4SW1hZ2UyRFxuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQxNjtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCAmJiBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLkRFUFRIX0NPTVBPTkVOVCApIHtcblxuXHRcdFx0XHQvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmVcblx0XHRcdFx0Ly8gREVQVEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9JTlRcblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZFNob3J0VHlwZSAmJiB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHQgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXRcblx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHQgICAgICAgIGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKVwiICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcylcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzUG93ZXJPZlR3b0ltYWdlICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHQvLyBSZW5kZXIgdGFyZ2V0c1xuXG5cdC8vIFNldHVwIHN0b3JhZ2UgZm9yIHRhcmdldCB0ZXh0dXJlIGFuZCBiaW5kIGl0IHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQgKSB7XG5cblx0XHR2YXIgZ2xGb3JtYXQgPSBwYXJhbVRocmVlVG9HTCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHBhcmFtVGhyZWVUb0dMKCByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlICk7XG5cdFx0c3RhdGUudGV4SW1hZ2UyRCggdGV4dHVyZVRhcmdldCwgMCwgZ2xGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCwgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICkuX193ZWJnbFRleHR1cmUsIDAgKTtcblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0dXAgc3RvcmFnZSBmb3IgaW50ZXJuYWwgZGVwdGgvc3RlbmNpbCBidWZmZXJzIGFuZCBiaW5kIHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmICEgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7XG5cblx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEZJWE1FOiBXZSBkb24ndCBzdXBwb3J0ICFkZXB0aCAhc3RlbmNpbFxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5SR0JBNCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCByZXNvdXJjZXMgZm9yIGEgRGVwdGggVGV4dHVyZSBmb3IgYSBGQk8gKG5lZWRzIGFuIGV4dGVuc2lvbilcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICk7XG5cdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQhJyk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3JlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUnKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggIXByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmUgfHxcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCAhPT0gcmVuZGVyVGFyZ2V0LndpZHRoIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0ICkge1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHNldFRleHR1cmUyRCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSwgMCApO1xuXG5cdFx0dmFyIHdlYmdsRGVwdGhUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5URVhUVVJFXzJELCB3ZWJnbERlcHRoVGV4dHVyZSwgMCApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5URVhUVVJFXzJELCB3ZWJnbERlcHRoVGV4dHVyZSwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQnKVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBTZXR1cCBHTCByZXNvdXJjZXMgZm9yIGEgbm9uLXRleHR1cmUgZGVwdGggYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycpO1xuXG5cdFx0XHRzZXR1cERlcHRoVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdICk7XG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldCB1cCBHTCByZXNvdXJjZXMgZm9yIHRoZSByZW5kZXIgdGFyZ2V0XG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0aW5mb01lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApO1xuXHRcdHZhciBpc1RhcmdldFBvd2VyT2ZUd28gPSBpc1Bvd2VyT2ZUd28oIHJlbmRlclRhcmdldCApO1xuXG5cdFx0Ly8gU2V0dXAgZnJhbWVidWZmZXJcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGNvbG9yIGJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1RhcmdldFBvd2VyT2ZUd28gKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQICk7XG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV8yRCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApO1xuXHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQgKTtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNUYXJnZXRQb3dlck9mVHdvICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCApO1xuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblxuXHRcdGlmICggdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKSAmJlxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJlxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHR2YXIgdGFyZ2V0ID0gKHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUpID8gX2dsLlRFWFRVUkVfQ1VCRV9NQVAgOiBfZ2wuVEVYVFVSRV8yRDtcblx0XHRcdHZhciB3ZWJnbFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCB3ZWJnbFRleHR1cmUgKTtcblx0XHRcdF9nbC5nZW5lcmF0ZU1pcG1hcCggdGFyZ2V0ICk7XG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlID0gc2V0VGV4dHVyZUN1YmU7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljID0gc2V0VGV4dHVyZUN1YmVEeW5hbWljO1xuXHR0aGlzLnNldHVwUmVuZGVyVGFyZ2V0ID0gc2V0dXBSZW5kZXJUYXJnZXQ7XG5cdHRoaXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwID0gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBmb3JkYWNpb3VzIC8gZm9yZGFjaW91cy5naXRodWIuaW9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7XG5cblx0dmFyIHByb3BlcnRpZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCApIHtcblxuXHRcdHZhciB1dWlkID0gb2JqZWN0LnV1aWQ7XG5cdFx0dmFyIG1hcCA9IHByb3BlcnRpZXNbIHV1aWQgXTtcblxuXHRcdGlmICggbWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hcCA9IHt9O1xuXHRcdFx0cHJvcGVydGllc1sgdXVpZCBdID0gbWFwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7XG5cblx0XHRkZWxldGUgcHJvcGVydGllc1sgb2JqZWN0LnV1aWQgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cblx0XHRwcm9wZXJ0aWVzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0Y2xlYXI6IGNsZWFyXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMU3RhdGUoIGdsLCBleHRlbnNpb25zLCBwYXJhbVRocmVlVG9HTCApIHtcblxuXHRmdW5jdGlvbiBDb2xvckJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0dmFyIGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yLnNldCggciwgZywgYiwgYSApO1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5jb3B5KCBjb2xvciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5kZXB0aE1hc2soIGRlcHRoTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5ORVZFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HUkVBVEVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgXHQhPT0gc3RlbmNpbFJlZiBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsXHQgIT09IHN0ZW5jaWxGYWlsIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhclN0ZW5jaWwoIHN0ZW5jaWwgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XG5cdHZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTtcblxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblxuXHR2YXIgY2FwYWJpbGl0aWVzID0ge307XG5cblx0dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR2YXIgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7XG5cblx0dmFyIGN1cnJlbnRGbGlwU2lkZWQgPSBudWxsO1xuXHR2YXIgY3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHR2YXIgY3VycmVudExpbmVXaWR0aCA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDtcblx0dmFyIGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50U2Npc3NvclRlc3QgPSBudWxsO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblxuXHR2YXIgdmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eV2ViR0xcXCAoWzAtOV0pLy5leGVjKCBnbC5nZXRQYXJhbWV0ZXIoIGdsLlZFUlNJT04gKSApWyAxIF0gKTtcblx0dmFyIGxpbmVXaWR0aEF2YWlsYWJsZSA9IHBhcnNlRmxvYXQoIHZlcnNpb24gKSA+PSAxLjA7XG5cblx0dmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdHZhciBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdHZhciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7XG5cdHZhciBjdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdldCwgY291bnQgKSB7XG5cblx0XHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0dmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHR2YXIgZW1wdHlUZXh0dXJlcyA9IHt9O1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGNvbG9yQnVmZmVyLnNldENsZWFyKCAwLCAwLCAwLCAxICk7XG5cdFx0ZGVwdGhCdWZmZXIuc2V0Q2xlYXIoIDEgKTtcblx0XHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBMZXNzRXF1YWxEZXB0aCApO1xuXG5cdFx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRcdHNldEN1bGxGYWNlKCBDdWxsRmFjZUJhY2sgKTtcblx0XHRlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXHRcdHNldEJsZW5kaW5nKCBOb3JtYWxCbGVuZGluZyApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpbml0QXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG5ld0F0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0bmV3QXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRuZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHtcblxuXHRcdFx0Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdICE9PSAwICkge1xuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHRleHRlbnNpb24udmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRyaWJ1dGUsIDAgKTtcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gbWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgIT09IGw7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSAhPT0gbmV3QXR0cmlidXRlc1sgaSBdICkge1xuXG5cdFx0XHRcdGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApO1xuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGUoIGlkICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7XG5cblx0XHRcdGdsLmVuYWJsZSggaWQgKTtcblx0XHRcdGNhcGFiaWxpdGllc1sgaWQgXSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc2FibGUoIGlkICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5kaXNhYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gZmFsc2U7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpIHtcblxuXHRcdGlmICggY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID09PSBudWxsICkge1xuXG5cdFx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBbXTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICkgKSB7XG5cblx0XHRcdFx0dmFyIGZvcm1hdHMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLkNPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZm9ybWF0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMucHVzaCggZm9ybWF0c1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRCbGVuZGluZyggYmxlbmRpbmcsIGJsZW5kRXF1YXRpb24sIGJsZW5kU3JjLCBibGVuZERzdCwgYmxlbmRFcXVhdGlvbkFscGhhLCBibGVuZFNyY0FscGhhLCBibGVuZERzdEFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRpZiAoIGJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLkJMRU5EICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gY3VycmVudEJsZW5kaW5nIHx8IHByZW11bHRpcGxpZWRBbHBoYSAhPT0gY3VycmVudFByZW11bHRpcGxlZEFscGhhICkge1xuXG5cdFx0XHRpZiAoIGJsZW5kaW5nID09PSBBZGRpdGl2ZUJsZW5kaW5nICkge1xuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5TUkNfQUxQSEEsIGdsLk9ORSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggYmxlbmRpbmcgPT09IFN1YnRyYWN0aXZlQmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBibGVuZGluZyA9PT0gTXVsdGlwbHlCbGVuZGluZyApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiwgZ2wuWkVSTywgZ2wuU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZztcblx0XHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgPT09IEN1c3RvbUJsZW5kaW5nICkge1xuXG5cdFx0XHRibGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGEgfHwgYmxlbmRFcXVhdGlvbjtcblx0XHRcdGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjO1xuXHRcdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XG5cblx0XHRcdGlmICggYmxlbmRFcXVhdGlvbiAhPT0gY3VycmVudEJsZW5kRXF1YXRpb24gfHwgYmxlbmRFcXVhdGlvbkFscGhhICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkge1xuXG5cdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggcGFyYW1UaHJlZVRvR0woIGJsZW5kRXF1YXRpb24gKSwgcGFyYW1UaHJlZVRvR0woIGJsZW5kRXF1YXRpb25BbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBibGVuZEVxdWF0aW9uO1xuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYmxlbmRTcmMgIT09IGN1cnJlbnRCbGVuZFNyYyB8fCBibGVuZERzdCAhPT0gY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IGN1cnJlbnRCbGVuZFNyY0FscGhhIHx8IGJsZW5kRHN0QWxwaGEgIT09IGN1cnJlbnRCbGVuZERzdEFscGhhICkge1xuXG5cdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBwYXJhbVRocmVlVG9HTCggYmxlbmRTcmMgKSwgcGFyYW1UaHJlZVRvR0woIGJsZW5kRHN0ICksIHBhcmFtVGhyZWVUb0dMKCBibGVuZFNyY0FscGhhICksIHBhcmFtVGhyZWVUb0dMKCBibGVuZERzdEFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gYmxlbmREc3Q7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYTtcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XG5cblx0XHRtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlXG5cdFx0XHQ/IGRpc2FibGUoIGdsLkNVTExfRkFDRSApXG5cdFx0XHQ6IGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRzZXRGbGlwU2lkZWQoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICk7XG5cblx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZVxuXHRcdFx0PyBzZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKVxuXHRcdFx0OiBzZXRCbGVuZGluZyggTm9CbGVuZGluZyApO1xuXG5cdFx0ZGVwdGhCdWZmZXIuc2V0RnVuYyggbWF0ZXJpYWwuZGVwdGhGdW5jICk7XG5cdFx0ZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XG5cdFx0ZGVwdGhCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApO1xuXHRcdGNvbG9yQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcblxuXHRcdHNldFBvbHlnb25PZmZzZXQoIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQsIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IsIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyApO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHNldEZsaXBTaWRlZCggZmxpcFNpZGVkICkge1xuXG5cdFx0aWYgKCBjdXJyZW50RmxpcFNpZGVkICE9PSBmbGlwU2lkZWQgKSB7XG5cblx0XHRcdGlmICggZmxpcFNpZGVkICkge1xuXG5cdFx0XHRcdGdsLmZyb250RmFjZSggZ2wuQ1cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNDVyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldEN1bGxGYWNlKCBjdWxsRmFjZSApIHtcblxuXHRcdGlmICggY3VsbEZhY2UgIT09IEN1bGxGYWNlTm9uZSApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkge1xuXG5cdFx0XHRcdGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5CQUNLICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlQgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UX0FORF9CQUNLICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdH1cblxuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRMaW5lV2lkdGgoIHdpZHRoICkge1xuXG5cdFx0aWYgKCB3aWR0aCAhPT0gY3VycmVudExpbmVXaWR0aCApIHtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGhBdmFpbGFibGUgKSBnbC5saW5lV2lkdGgoIHdpZHRoICk7XG5cblx0XHRcdGN1cnJlbnRMaW5lV2lkdGggPSB3aWR0aDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UG9seWdvbk9mZnNldCggcG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyApIHtcblxuXHRcdGlmICggcG9seWdvbk9mZnNldCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7XG5cblx0XHRcdGlmICggY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcblxuXHRcdFx0XHRnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7XG5cblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBmYWN0b3I7XG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0cztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRTY2lzc29yVGVzdCgpIHtcblxuXHRcdHJldHVybiBjdXJyZW50U2Npc3NvclRlc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFNjaXNzb3JUZXN0KCBzY2lzc29yVGVzdCApIHtcblxuXHRcdGN1cnJlbnRTY2lzc29yVGVzdCA9IHNjaXNzb3JUZXN0O1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyB0ZXh0dXJlXG5cblx0ZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkge1xuXG5cdFx0aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcblxuXHRcdFx0Z2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7XG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ID09PSBudWxsICkge1xuXG5cdFx0XHRhY3RpdmVUZXh0dXJlKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0Y3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdID0gYm91bmRUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJnbFR5cGUgXSApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGluaXQ6IGluaXQsXG5cdFx0aW5pdEF0dHJpYnV0ZXM6IGluaXRBdHRyaWJ1dGVzLFxuXHRcdGVuYWJsZUF0dHJpYnV0ZTogZW5hYmxlQXR0cmlidXRlLFxuXHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3I6IGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IsXG5cdFx0ZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6IGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzLFxuXHRcdGVuYWJsZTogZW5hYmxlLFxuXHRcdGRpc2FibGU6IGRpc2FibGUsXG5cdFx0Z2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMsXG5cblx0XHRzZXRCbGVuZGluZzogc2V0QmxlbmRpbmcsXG5cdFx0c2V0TWF0ZXJpYWw6IHNldE1hdGVyaWFsLFxuXG5cdFx0c2V0RmxpcFNpZGVkOiBzZXRGbGlwU2lkZWQsXG5cdFx0c2V0Q3VsbEZhY2U6IHNldEN1bGxGYWNlLFxuXG5cdFx0c2V0TGluZVdpZHRoOiBzZXRMaW5lV2lkdGgsXG5cdFx0c2V0UG9seWdvbk9mZnNldDogc2V0UG9seWdvbk9mZnNldCxcblxuXHRcdGdldFNjaXNzb3JUZXN0OiBnZXRTY2lzc29yVGVzdCxcblx0XHRzZXRTY2lzc29yVGVzdDogc2V0U2Npc3NvclRlc3QsXG5cblx0XHRhY3RpdmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLFxuXHRcdGJpbmRUZXh0dXJlOiBiaW5kVGV4dHVyZSxcblx0XHRjb21wcmVzc2VkVGV4SW1hZ2UyRDogY29tcHJlc3NlZFRleEltYWdlMkQsXG5cdFx0dGV4SW1hZ2UyRDogdGV4SW1hZ2UyRCxcblxuXHRcdHNjaXNzb3I6IHNjaXNzb3IsXG5cdFx0dmlld3BvcnQ6IHZpZXdwb3J0LFxuXG5cdFx0cmVzZXQ6IHJlc2V0XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xDYXBhYmlsaXRpZXMoIGdsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBtYXhBbmlzb3Ryb3B5O1xuXG5cdGZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7XG5cblx0XHRpZiAoIG1heEFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdG1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1heEFuaXNvdHJvcHkgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICkge1xuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XG5cblx0XHRcdGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdoaWdocCc7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJlY2lzaW9uID0gJ21lZGl1bXAnO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiZcblx0XHRcdCAgICAgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdtZWRpdW1wJztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICdsb3dwJztcblxuXHR9XG5cblx0dmFyIHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7XG5cdHZhciBtYXhQcmVjaXNpb24gPSBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApO1xuXG5cdGlmICggbWF4UHJlY2lzaW9uICE9PSBwcmVjaXNpb24gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOicsIHByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgbWF4UHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XG5cdFx0cHJlY2lzaW9uID0gbWF4UHJlY2lzaW9uO1xuXG5cdH1cblxuXHR2YXIgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZSAmJiAhISBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7XG5cdHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSApO1xuXG5cdHZhciBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyApO1xuXHR2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTtcblx0dmFyIG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKTtcblxuXHR2YXIgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdHZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHR2YXIgZmxvYXRWZXJ0ZXhUZXh0dXJlcyA9IHZlcnRleFRleHR1cmVzICYmIGZsb2F0RnJhZ21lbnRUZXh0dXJlcztcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKCBnbCApIHtcblxuXHR2YXIgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBleHRlbnNpb25zWyBuYW1lIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uc1sgbmFtZSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBleHRlbnNpb247XG5cblx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfZGVwdGhfdGV4dHVyZSc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgbmFtZSArICcgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGV4dGVuc2lvbnNbIG5hbWUgXSA9IGV4dGVuc2lvbjtcblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQ2xpcHBpbmcoKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcyxcblxuXHRcdGdsb2JhbFN0YXRlID0gbnVsbCxcblx0XHRudW1HbG9iYWxQbGFuZXMgPSAwLFxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlLFxuXG5cdFx0cGxhbmUgPSBuZXcgUGxhbmUoKSxcblx0XHR2aWV3Tm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKSxcblxuXHRcdHVuaWZvcm0gPSB7IHZhbHVlOiBudWxsLCBuZWVkc1VwZGF0ZTogZmFsc2UgfTtcblxuXHR0aGlzLnVuaWZvcm0gPSB1bmlmb3JtO1xuXHR0aGlzLm51bVBsYW5lcyA9IDA7XG5cdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gMDtcblxuXHR0aGlzLmluaXQgPSBmdW5jdGlvbiggcGxhbmVzLCBlbmFibGVMb2NhbENsaXBwaW5nLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgZW5hYmxlZCA9XG5cdFx0XHRwbGFuZXMubGVuZ3RoICE9PSAwIHx8XG5cdFx0XHRlbmFibGVMb2NhbENsaXBwaW5nIHx8XG5cdFx0XHQvLyBlbmFibGUgc3RhdGUgb2YgcHJldmlvdXMgZnJhbWUgLSB0aGUgY2xpcHBpbmcgY29kZSBoYXMgdG9cblx0XHRcdC8vIHJ1biBhbm90aGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlc2V0IHRoZSBzdGF0ZTpcblx0XHRcdG51bUdsb2JhbFBsYW5lcyAhPT0gMCB8fFxuXHRcdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQ7XG5cblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGVuYWJsZUxvY2FsQ2xpcHBpbmc7XG5cblx0XHRnbG9iYWxTdGF0ZSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCAwICk7XG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxlbmd0aDtcblxuXHRcdHJldHVybiBlbmFibGVkO1xuXG5cdH07XG5cblx0dGhpcy5iZWdpblNoYWRvd3MgPSBmdW5jdGlvbigpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlO1xuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xuXHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U3RhdGUgPSBmdW5jdGlvbiggcGxhbmVzLCBjbGlwSW50ZXJzZWN0aW9uLCBjbGlwU2hhZG93cywgY2FtZXJhLCBjYWNoZSwgZnJvbUNhY2hlICkge1xuXG5cdFx0aWYgKCAhIGxvY2FsQ2xpcHBpbmdFbmFibGVkIHx8XG5cdFx0XHRcdHBsYW5lcyA9PT0gbnVsbCB8fCBwbGFuZXMubGVuZ3RoID09PSAwIHx8XG5cdFx0XHRcdHJlbmRlcmluZ1NoYWRvd3MgJiYgISBjbGlwU2hhZG93cyApIHtcblx0XHRcdC8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmdcblxuXHRcdFx0aWYgKCByZW5kZXJpbmdTaGFkb3dzICkge1xuXHRcdFx0XHQvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGluZ1xuXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLFxuXHRcdFx0XHRsR2xvYmFsID0gbkdsb2JhbCAqIDQsXG5cblx0XHRcdFx0ZHN0QXJyYXkgPSBjYWNoZS5jbGlwcGluZ1N0YXRlIHx8IG51bGw7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1ZSBzdGF0ZVxuXG5cdFx0XHRkc3RBcnJheSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBsR2xvYmFsLCBmcm9tQ2FjaGUgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBsR2xvYmFsOyArKyBpICkge1xuXG5cdFx0XHRcdGRzdEFycmF5WyBpIF0gPSBnbG9iYWxTdGF0ZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNhY2hlLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTtcblx0XHRcdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gY2xpcEludGVyc2VjdGlvbiA/IHRoaXMubnVtUGxhbmVzIDogMDtcblx0XHRcdHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7XG5cblx0XHR9XG5cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG5cblx0XHRpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkge1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZ2xvYmFsU3RhdGU7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG51bUdsb2JhbFBsYW5lcztcblx0XHRzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkge1xuXG5cdFx0dmFyIG5QbGFuZXMgPSBwbGFuZXMgIT09IG51bGwgPyBwbGFuZXMubGVuZ3RoIDogMCxcblx0XHRcdGRzdEFycmF5ID0gbnVsbDtcblxuXHRcdGlmICggblBsYW5lcyAhPT0gMCApIHtcblxuXHRcdFx0ZHN0QXJyYXkgPSB1bmlmb3JtLnZhbHVlO1xuXG5cdFx0XHRpZiAoIHNraXBUcmFuc2Zvcm0gIT09IHRydWUgfHwgZHN0QXJyYXkgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGZsYXRTaXplID0gZHN0T2Zmc2V0ICsgblBsYW5lcyAqIDQsXG5cdFx0XHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cblx0XHRcdFx0dmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRpZiAoIGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkge1xuXG5cdFx0XHRcdFx0ZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0O1xuXHRcdFx0XHRcdFx0XHRcdFx0aSAhPT0gblBsYW5lczsgKysgaSwgaTQgKz0gNCApIHtcblxuXHRcdFx0XHRcdHBsYW5lLmNvcHkoIHBsYW5lc1sgaSBdICkuXG5cdFx0XHRcdFx0XHRcdGFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xuXHRcdFx0XHRcdGRzdEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XG5cdFx0XG5cdFx0cmV0dXJuIGRzdEFycmF5O1xuXG5cdH1cblxufVxuXG4vLyBpbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZSc7XG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlcmVyKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcicsIFJFVklTSU9OICk7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIF9jYW52YXMgPSBwYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jYW52YXMgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlO1xuXG5cdHZhciBsaWdodHMgPSBbXTtcblxuXHR2YXIgY3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXG5cdHZhciBtb3JwaEluZmx1ZW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICk7XG5cblx0dmFyIHNwcml0ZXMgPSBbXTtcblx0dmFyIGxlbnNGbGFyZXMgPSBbXTtcblxuXHQvLyBwdWJsaWMgcHJvcGVydGllc1xuXG5cdHRoaXMuZG9tRWxlbWVudCA9IF9jYW52YXM7XG5cdHRoaXMuY29udGV4dCA9IG51bGw7XG5cblx0Ly8gY2xlYXJpbmdcblxuXHR0aGlzLmF1dG9DbGVhciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyQ29sb3IgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJTdGVuY2lsID0gdHJ1ZTtcblxuXHQvLyBzY2VuZSBncmFwaFxuXG5cdHRoaXMuc29ydE9iamVjdHMgPSB0cnVlO1xuXG5cdC8vIHVzZXItZGVmaW5lZCBjbGlwcGluZ1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTtcblx0dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsbHkgYmFzZWQgc2hhZGluZ1xuXG5cdHRoaXMuZ2FtbWFGYWN0b3IgPSAyLjA7XHQvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0dGhpcy5nYW1tYUlucHV0ID0gZmFsc2U7XG5cdHRoaXMuZ2FtbWFPdXRwdXQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbCBsaWdodHNcblxuXHR0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID0gZmFsc2U7XG5cblx0Ly8gdG9uZSBtYXBwaW5nXG5cblx0dGhpcy50b25lTWFwcGluZyA9IExpbmVhclRvbmVNYXBwaW5nO1xuXHR0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XG5cdHRoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50ID0gMS4wO1xuXG5cdC8vIG1vcnBoc1xuXG5cdHRoaXMubWF4TW9ycGhUYXJnZXRzID0gODtcblx0dGhpcy5tYXhNb3JwaE5vcm1hbHMgPSA0O1xuXG5cdC8vIGludGVybmFsIHByb3BlcnRpZXNcblxuXHR2YXIgX3RoaXMgPSB0aGlzLFxuXG5cdFx0Ly8gaW50ZXJuYWwgc3RhdGUgY2FjaGVcblxuXHRcdF9jdXJyZW50UHJvZ3JhbSA9IG51bGwsXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsLFxuXHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLFxuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMSxcblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnLFxuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbCxcblxuXHRcdF9jdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGwsXG5cblx0XHRfY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKSxcblxuXHRcdC8vXG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDAsXG5cblx0XHQvL1xuXG5cdFx0X2NsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICksXG5cdFx0X2NsZWFyQWxwaGEgPSAwLFxuXG5cdFx0X3dpZHRoID0gX2NhbnZhcy53aWR0aCxcblx0XHRfaGVpZ2h0ID0gX2NhbnZhcy5oZWlnaHQsXG5cblx0XHRfcGl4ZWxSYXRpbyA9IDEsXG5cblx0XHRfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKSxcblx0XHRfc2Npc3NvclRlc3QgPSBmYWxzZSxcblxuXHRcdF92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKSxcblxuXHRcdC8vIGZydXN0dW1cblxuXHRcdF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblxuXHRcdC8vIGNsaXBwaW5nXG5cblx0XHRfY2xpcHBpbmcgPSBuZXcgV2ViR0xDbGlwcGluZygpLFxuXHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblx0XHRfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblxuXHRcdC8vIGNhbWVyYSBtYXRyaWNlcyBjYWNoZVxuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLFxuXG5cdFx0X3ZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLFxuXHRcdF9tYXRyaXg0ID0gbmV3IE1hdHJpeDQoKSxcblx0XHRfbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpLFxuXG5cdFx0Ly8gbGlnaHQgYXJyYXlzIGNhY2hlXG5cblx0XHRfbGlnaHRzID0ge1xuXG5cdFx0XHRoYXNoOiAnJyxcblxuXHRcdFx0YW1iaWVudDogWyAwLCAwLCAwIF0sXG5cdFx0XHRkaXJlY3Rpb25hbDogW10sXG5cdFx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sXG5cdFx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogW10sXG5cdFx0XHRzcG90OiBbXSxcblx0XHRcdHNwb3RTaGFkb3dNYXA6IFtdLFxuXHRcdFx0c3BvdFNoYWRvd01hdHJpeDogW10sXG5cdFx0XHRyZWN0QXJlYTogW10sXG5cdFx0XHRwb2ludDogW10sXG5cdFx0XHRwb2ludFNoYWRvd01hcDogW10sXG5cdFx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0XHRoZW1pOiBbXSxcblxuXHRcdFx0c2hhZG93czogW11cblxuXHRcdH0sXG5cblx0XHQvLyBpbmZvXG5cblx0XHRfaW5mb01lbW9yeSA9IHtcblx0XHRcdGdlb21ldHJpZXM6IDAsXG5cdFx0XHR0ZXh0dXJlczogMFxuXHRcdH0sXG5cblx0XHRfaW5mb1JlbmRlciA9IHtcblxuXHRcdFx0ZnJhbWU6IDAsXG5cdFx0XHRjYWxsczogMCxcblx0XHRcdHZlcnRpY2VzOiAwLFxuXHRcdFx0ZmFjZXM6IDAsXG5cdFx0XHRwb2ludHM6IDBcblxuXHRcdH07XG5cblx0dGhpcy5pbmZvID0ge1xuXG5cdFx0cmVuZGVyOiBfaW5mb1JlbmRlcixcblx0XHRtZW1vcnk6IF9pbmZvTWVtb3J5LFxuXHRcdHByb2dyYW1zOiBudWxsXG5cblx0fTtcblxuXG5cdC8vIGluaXRpYWxpemVcblxuXHR2YXIgX2dsO1xuXG5cdHRyeSB7XG5cblx0XHR2YXIgY29udGV4dEF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRhbHBoYTogX2FscGhhLFxuXHRcdFx0ZGVwdGg6IF9kZXB0aCxcblx0XHRcdHN0ZW5jaWw6IF9zdGVuY2lsLFxuXHRcdFx0YW50aWFsaWFzOiBfYW50aWFsaWFzLFxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBfcHJlbXVsdGlwbGllZEFscGhhLFxuXHRcdFx0cHJlc2VydmVEcmF3aW5nQnVmZmVyOiBfcHJlc2VydmVEcmF3aW5nQnVmZmVyXG5cdFx0fTtcblxuXHRcdF9nbCA9IF9jb250ZXh0IHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKSB8fCBfY2FudmFzLmdldENvbnRleHQoICdleHBlcmltZW50YWwtd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuJztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aHJvdyAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4nO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBTb21lIGV4cGVyaW1lbnRhbC13ZWJnbCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhdmUgZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0XG5cblx0XHRpZiAoIF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRyZXR1cm4geyAncmFuZ2VNaW4nOiAxLCAncmFuZ2VNYXgnOiAxLCAncHJlY2lzaW9uJzogMSB9O1xuXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0X2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XG5cblx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvciApO1xuXG5cdH1cblxuXHR2YXIgZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXG5cdGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICk7XG5cdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKTtcblx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cdGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5Lk1heEluZGV4ID0gNDI5NDk2NzI5NjtcblxuXHR9XG5cblx0dmFyIGNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggX2dsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICk7XG5cblx0dmFyIHN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1UaHJlZVRvR0wgKTtcblxuXHR2YXIgcHJvcGVydGllcyA9IG5ldyBXZWJHTFByb3BlcnRpZXMoKTtcblx0dmFyIHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgcGFyYW1UaHJlZVRvR0wsIF9pbmZvTWVtb3J5ICk7XG5cdHZhciBhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmlidXRlcyggX2dsICk7XG5cdHZhciBnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBfaW5mb01lbW9yeSApO1xuXHR2YXIgb2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIF9nbCwgZ2VvbWV0cmllcywgX2luZm9SZW5kZXIgKTtcblx0dmFyIHByb2dyYW1DYWNoZSA9IG5ldyBXZWJHTFByb2dyYW1zKCB0aGlzLCBjYXBhYmlsaXRpZXMgKTtcblx0dmFyIGxpZ2h0Q2FjaGUgPSBuZXcgV2ViR0xMaWdodHMoKTtcblx0dmFyIHJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoKTtcblxuXHR0aGlzLmluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7XG5cblx0dmFyIGJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgX2luZm9SZW5kZXIgKTtcblx0dmFyIGluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBfaW5mb1JlbmRlciApO1xuXG5cdC8vXG5cblx0dmFyIGJhY2tncm91bmRQbGFuZUNhbWVyYSwgYmFja2dyb3VuZFBsYW5lTWVzaDtcblx0dmFyIGJhY2tncm91bmRCb3hDYW1lcmEsIGJhY2tncm91bmRCb3hNZXNoO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IF9waXhlbFJhdGlvIDogMTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0RGVmYXVsdEdMU3RhdGUoKSB7XG5cblx0XHRzdGF0ZS5pbml0KCk7XG5cblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBfY2xlYXJDb2xvci5yLCBfY2xlYXJDb2xvci5nLCBfY2xlYXJDb2xvci5iLCBfY2xlYXJBbHBoYSwgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZXNldEdMU3RhdGUoKSB7XG5cblx0XHRfY3VycmVudFByb2dyYW0gPSBudWxsO1xuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbDtcblxuXHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7XG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xuXG5cdFx0c3RhdGUucmVzZXQoKTtcblxuXHR9XG5cblx0c2V0RGVmYXVsdEdMU3RhdGUoKTtcblxuXHR0aGlzLmNvbnRleHQgPSBfZ2w7XG5cdHRoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzO1xuXHR0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuXHR0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXHR0aGlzLnN0YXRlID0gc3RhdGU7XG5cblx0Ly8gc2hhZG93IG1hcFxuXG5cdHZhciBzaGFkb3dNYXAgPSBuZXcgV2ViR0xTaGFkb3dNYXAoIHRoaXMsIF9saWdodHMsIG9iamVjdHMsIGNhcGFiaWxpdGllcyApO1xuXG5cdHRoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwO1xuXG5cblx0Ly8gUGx1Z2luc1xuXG5cdHZhciBzcHJpdGVQbHVnaW4gPSBuZXcgU3ByaXRlUGx1Z2luKCB0aGlzLCBzcHJpdGVzICk7XG5cdHZhciBsZW5zRmxhcmVQbHVnaW4gPSBuZXcgTGVuc0ZsYXJlUGx1Z2luKCB0aGlzLCBsZW5zRmxhcmVzICk7XG5cblx0Ly8gQVBJXG5cblx0dGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2dsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0TWF4QW5pc290cm9weSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQcmVjaXNpb24gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfcGl4ZWxSYXRpbztcblxuXHR9O1xuXG5cdHRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5zZXRTaXplKCBfdmlld3BvcnQueiwgX3ZpZXdwb3J0LncsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IF93aWR0aCxcblx0XHRcdGhlaWdodDogX2hlaWdodFxuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9jYW52YXMud2lkdGggPSB3aWR0aCAqIF9waXhlbFJhdGlvO1xuXHRcdF9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogX3BpeGVsUmF0aW87XG5cblx0XHRpZiAoIHVwZGF0ZVN0eWxlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0X2NhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4Jztcblx0XHRcdF9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0Vmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRzdGF0ZS52aWV3cG9ydCggX3ZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRzdGF0ZS5zY2lzc29yKCBfc2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7XG5cblx0fTtcblxuXHQvLyBDbGVhcmluZ1xuXG5cdHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY2xlYXJDb2xvcjtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0X2NsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXG5cdFx0X2NsZWFyQWxwaGEgPSBhbHBoYSAhPT0gdW5kZWZpbmVkID8gYWxwaGEgOiAxO1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggX2NsZWFyQ29sb3IuciwgX2NsZWFyQ29sb3IuZywgX2NsZWFyQ29sb3IuYiwgX2NsZWFyQWxwaGEsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY2xlYXJBbHBoYTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICggYWxwaGEgKSB7XG5cblx0XHRfY2xlYXJBbHBoYSA9IGFscGhhO1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggX2NsZWFyQ29sb3IuciwgX2NsZWFyQ29sb3IuZywgX2NsZWFyQ29sb3IuYiwgX2NsZWFyQWxwaGEsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDtcblx0XHRpZiAoIHN0ZW5jaWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5cdFx0X2dsLmNsZWFyKCBiaXRzICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdH07XG5cblx0Ly8gUmVzZXRcblxuXHR0aGlzLnJlc2V0R0xTdGF0ZSA9IHJlc2V0R0xTdGF0ZTtcblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblxuXHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdHJlc2V0R0xTdGF0ZSgpO1xuXHRcdHNldERlZmF1bHRHTFN0YXRlKCk7XG5cblx0XHRwcm9wZXJ0aWVzLmNsZWFyKCk7XG5cdFx0b2JqZWN0cy5jbGVhcigpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbk1hdGVyaWFsRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7XG5cblx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciBkZWFsbG9jYXRpb25cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTtcblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICkge1xuXG5cdFx0dmFyIHByb2dyYW1JbmZvID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkucHJvZ3JhbTtcblxuXHRcdG1hdGVyaWFsLnByb2dyYW0gPSB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHByb2dyYW1JbmZvICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW1DYWNoZS5yZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbUluZm8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQnVmZmVyIHJlbmRlcmluZ1xuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcblxuXHRcdG9iamVjdC5yZW5kZXIoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUgPSBmdW5jdGlvbiAoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIGJ1ZmZlcnMgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgJiYgISBidWZmZXJzLnBvc2l0aW9uICkgYnVmZmVycy5wb3NpdGlvbiA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNOb3JtYWxzICYmICEgYnVmZmVycy5ub3JtYWwgKSBidWZmZXJzLm5vcm1hbCA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgJiYgISBidWZmZXJzLnV2ICkgYnVmZmVycy51diA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgJiYgISBidWZmZXJzLmNvbG9yICkgYnVmZmVycy5jb2xvciA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5wb3NpdGlvbiApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5wb3NpdGlvbkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24gKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMubm9ybWFsICk7XG5cblx0XHRcdGlmICggISBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICYmXG5cdFx0XHRcdCEgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICYmXG5cdFx0XHRcdG1hdGVyaWFsLnNoYWRpbmcgPT09IEZsYXRTaGFkaW5nICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG9iamVjdC5jb3VudCAqIDM7IGkgPCBsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBvYmplY3Qubm9ybWFsQXJyYXk7XG5cblx0XHRcdFx0XHR2YXIgbnggPSAoIGFycmF5WyBpICsgMCBdICsgYXJyYXlbIGkgKyAzIF0gKyBhcnJheVsgaSArIDYgXSApIC8gMztcblx0XHRcdFx0XHR2YXIgbnkgPSAoIGFycmF5WyBpICsgMSBdICsgYXJyYXlbIGkgKyA0IF0gKyBhcnJheVsgaSArIDcgXSApIC8gMztcblx0XHRcdFx0XHR2YXIgbnogPSAoIGFycmF5WyBpICsgMiBdICsgYXJyYXlbIGkgKyA1IF0gKyBhcnJheVsgaSArIDggXSApIC8gMztcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMCBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAxIF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDIgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAzIF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDQgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgNSBdID0gbno7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDYgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgNyBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA4IF0gPSBuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5ub3JtYWxBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgJiYgbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy51diApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC51dkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMudXYgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc0NvbG9ycyAmJiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5jb2xvciApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5jb2xvckFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdFx0X2dsLmRyYXdBcnJheXMoIF9nbC5UUklBTkdMRVMsIDAsIG9iamVjdC5jb3VudCApO1xuXG5cdFx0b2JqZWN0LmNvdW50ID0gMDtcblxuXHR9O1xuXG5cdGZ1bmN0aW9uIGFic051bWVyaWNhbFNvcnQoIGEsIGIgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIGJbIDAgXSApIC0gTWF0aC5hYnMoIGFbIDAgXSApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCA9IGZ1bmN0aW9uICggY2FtZXJhLCBmb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcblxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIGZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXHRcdHZhciBnZW9tZXRyeVByb2dyYW0gPSBnZW9tZXRyeS5pZCArICdfJyArIHByb2dyYW0uaWQgKyAnXycgKyAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApO1xuXG5cdFx0dmFyIHVwZGF0ZUJ1ZmZlcnMgPSBmYWxzZTtcblxuXHRcdGlmICggZ2VvbWV0cnlQcm9ncmFtICE9PSBfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSApIHtcblxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSBnZW9tZXRyeVByb2dyYW07XG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIHRhcmdldHNcblxuXHRcdHZhciBtb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0aWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gVE9ETyBSZW1vdmUgYWxsb2NhdGlvbnNcblxuXHRcdFx0dmFyIGFjdGl2ZUluZmx1ZW5jZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhUYXJnZXRJbmZsdWVuY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGluZmx1ZW5jZSA9IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdO1xuXHRcdFx0XHRhY3RpdmVJbmZsdWVuY2VzLnB1c2goIFsgaW5mbHVlbmNlLCBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhY3RpdmVJbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdFx0aWYgKCBhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aCA+IDggKSB7XG5cblx0XHRcdFx0YWN0aXZlSW5mbHVlbmNlcy5sZW5ndGggPSA4O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgaW5mbHVlbmNlID0gYWN0aXZlSW5mbHVlbmNlc1sgaSBdO1xuXHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IGluZmx1ZW5jZVsgMCBdO1xuXG5cdFx0XHRcdGlmICggaW5mbHVlbmNlWyAwIF0gIT09IDAgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kZXggPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICYmIG1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGksIG1vcnBoQXR0cmlidXRlcy5wb3NpdGlvblsgaW5kZXggXSApO1xuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxzID09PSB0cnVlICYmIG1vcnBoQXR0cmlidXRlcy5ub3JtYWwgKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpLCBtb3JwaEF0dHJpYnV0ZXMubm9ybWFsWyBpbmRleCBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApO1xuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxzID09PSB0cnVlICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IGFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoLCBpbCA9IG1vcnBoSW5mbHVlbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IDAuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIF9nbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApO1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciByYW5nZUZhY3RvciA9IDE7XG5cblx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcblx0XHRcdHJhbmdlRmFjdG9yID0gMjtcblxuXHRcdH1cblxuXHRcdHZhciByZW5kZXJlciA9IGJ1ZmZlclJlbmRlcmVyO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlQnVmZmVycyApIHtcblxuXHRcdFx0c2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGVzLmdldCggaW5kZXggKS5idWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBkYXRhQ291bnQgPSAwO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gaW5kZXguY291bnQ7XG5cblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDtcblxuXHRcdH1cblxuXHRcdHZhciByYW5nZVN0YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7XG5cdFx0dmFyIHJhbmdlQ291bnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2UuY291bnQgKiByYW5nZUZhY3RvcjtcblxuXHRcdHZhciBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQgKiByYW5nZUZhY3RvciA6IEluZmluaXR5O1xuXG5cdFx0dmFyIGRyYXdTdGFydCA9IE1hdGgubWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7XG5cdFx0dmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHR2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3U3RhcnQgKyAxICk7XG5cblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVzRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX1NUUklQICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVGYW5EcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9GQU4gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWxcblxuXHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX0xPT1AgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA+IDAgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIHN0YXJ0SW5kZXggKSB7XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkICkgc3RhcnRJbmRleCA9IDA7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSBtYXRlcmlhbC5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBwcm9ncmFtQXR0cmlidXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlID49IDAgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbGl6ZWQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5ub3JtYWxpemVkO1xuXHRcdFx0XHRcdHZhciBzaXplID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRcdFx0XHR2YXIgYXR0cmlidXRlUHJvcGVydGllcyA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZVByb3BlcnRpZXMuYnVmZmVyO1xuXHRcdFx0XHRcdHZhciB0eXBlID0gYXR0cmlidXRlUHJvcGVydGllcy50eXBlO1xuXHRcdFx0XHRcdHZhciBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGVQcm9wZXJ0aWVzLmJ5dGVzUGVyRWxlbWVudDtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0dmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsICggc3RhcnRJbmRleCAqIHN0cmlkZSArIG9mZnNldCApICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGdlb21ldHJ5QXR0cmlidXRlLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGdlb21ldHJ5QXR0cmlidXRlLm1lc2hQZXJBdHRyaWJ1dGUgKiBnZW9tZXRyeUF0dHJpYnV0ZS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlciApO1xuXHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIDAsIHN0YXJ0SW5kZXggKiBzaXplICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHR9XG5cblx0Ly8gQ29tcGlsZVxuXG5cdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGxpZ2h0cyA9IFtdO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGxpZ2h0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdFx0c2V0dXBMaWdodHMoIGxpZ2h0cywgY2FtZXJhICk7XG5cblx0XHRzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0Lm1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QubWF0ZXJpYWwubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbFsgaSBdLCBzY2VuZS5mb2csIG9iamVjdCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbCwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHR9O1xuXG5cdC8vIFJlbmRlcmluZ1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQsIGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRpZiAoIGNhbWVyYSAhPT0gdW5kZWZpbmVkICYmIGNhbWVyYS5pc0NhbWVyYSAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyByZXNldCBjYWNoaW5nIGZvciB0aGlzIGZyYW1lXG5cblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblx0XHRfY3VycmVudENhbWVyYSA9IG51bGw7XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdGlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRjYW1lcmEub25CZWZvcmVSZW5kZXIoIF90aGlzICk7XG5cblx0XHRpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgKSBjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdF9mcnVzdHVtLnNldEZyb21NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRsaWdodHMubGVuZ3RoID0gMDtcblx0XHRzcHJpdGVzLmxlbmd0aCA9IDA7XG5cdFx0bGVuc0ZsYXJlcy5sZW5ndGggPSAwO1xuXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gX2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcblxuXHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdC5maW5pc2goKTtcblxuXHRcdGlmICggX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnNvcnQoKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuYmVnaW5TaGFkb3dzKCk7XG5cblx0XHRzZXR1cFNoYWRvd3MoIGxpZ2h0cyApO1xuXG5cdFx0c2hhZG93TWFwLnJlbmRlciggc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0c2V0dXBMaWdodHMoIGxpZ2h0cywgY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpO1xuXG5cdFx0Ly9cblxuXHRcdF9pbmZvUmVuZGVyLmZyYW1lICsrO1xuXHRcdF9pbmZvUmVuZGVyLmNhbGxzID0gMDtcblx0XHRfaW5mb1JlbmRlci52ZXJ0aWNlcyA9IDA7XG5cdFx0X2luZm9SZW5kZXIuZmFjZXMgPSAwO1xuXHRcdF9pbmZvUmVuZGVyLnBvaW50cyA9IDA7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcblxuXHRcdGlmICggYmFja2dyb3VuZCA9PT0gbnVsbCApIHtcblxuXHRcdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggX2NsZWFyQ29sb3IuciwgX2NsZWFyQ29sb3IuZywgX2NsZWFyQ29sb3IuYiwgX2NsZWFyQWxwaGEsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkge1xuXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBiYWNrZ3JvdW5kLnIsIGJhY2tncm91bmQuZywgYmFja2dyb3VuZC5iLCAxLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xlYXIgfHwgZm9yY2VDbGVhciApIHtcblxuXHRcdFx0dGhpcy5jbGVhciggdGhpcy5hdXRvQ2xlYXJDb2xvciwgdGhpcy5hdXRvQ2xlYXJEZXB0aCwgdGhpcy5hdXRvQ2xlYXJTdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGJhY2tncm91bmRCb3hDYW1lcmEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kQm94Q2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cblx0XHRcdFx0YmFja2dyb3VuZEJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94QnVmZmVyR2VvbWV0cnkoIDUsIDUsIDUgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBTaGFkZXJMaWIuY3ViZS51bmlmb3Jtcyxcblx0XHRcdFx0XHRcdHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRcdFx0c2lkZTogQmFja1NpZGUsXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxuXHRcdFx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRmb2c6IGZhbHNlXG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YmFja2dyb3VuZEJveENhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdGJhY2tncm91bmRCb3hDYW1lcmEubWF0cml4V29ybGQuZXh0cmFjdFJvdGF0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdGJhY2tncm91bmRCb3hDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIGJhY2tncm91bmRCb3hDYW1lcmEubWF0cml4V29ybGQgKTtcblxuXG5cdFx0XHRiYWNrZ3JvdW5kQm94TWVzaC5tYXRlcmlhbC51bmlmb3Jtc1sgXCJ0Q3ViZVwiIF0udmFsdWUgPSBiYWNrZ3JvdW5kO1xuXHRcdFx0YmFja2dyb3VuZEJveE1lc2gubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGJhY2tncm91bmRCb3hDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBiYWNrZ3JvdW5kQm94TWVzaC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRvYmplY3RzLnVwZGF0ZSggYmFja2dyb3VuZEJveE1lc2ggKTtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBiYWNrZ3JvdW5kQm94Q2FtZXJhLCBudWxsLCBiYWNrZ3JvdW5kQm94TWVzaC5nZW9tZXRyeSwgYmFja2dyb3VuZEJveE1lc2gubWF0ZXJpYWwsIGJhY2tncm91bmRCb3hNZXNoLCBudWxsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGJhY2tncm91bmRQbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJhY2tncm91bmRQbGFuZUNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gMSwgMSwgMSwgLSAxLCAwLCAxICk7XG5cblx0XHRcdFx0YmFja2dyb3VuZFBsYW5lTWVzaCA9IG5ldyBNZXNoKFxuXHRcdFx0XHRcdG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCAyLCAyICksXG5cdFx0XHRcdFx0bmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCBmb2c6IGZhbHNlIH0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJhY2tncm91bmRQbGFuZU1lc2gubWF0ZXJpYWwubWFwID0gYmFja2dyb3VuZDtcblxuXHRcdFx0b2JqZWN0cy51cGRhdGUoIGJhY2tncm91bmRQbGFuZU1lc2ggKTtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBiYWNrZ3JvdW5kUGxhbmVDYW1lcmEsIG51bGwsIGJhY2tncm91bmRQbGFuZU1lc2guZ2VvbWV0cnksIGJhY2tncm91bmRQbGFuZU1lc2gubWF0ZXJpYWwsIGJhY2tncm91bmRQbGFuZU1lc2gsIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTtcblx0XHR2YXIgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7XG5cblx0XHRpZiAoIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3BhcXVlIHBhc3MgKGZyb250LXRvLWJhY2sgb3JkZXIpXG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRcdC8vIHRyYW5zcGFyZW50IHBhc3MgKGJhY2stdG8tZnJvbnQgb3JkZXIpXG5cblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY3VzdG9tIHJlbmRlciBwbHVnaW5zIChwb3N0IHBhc3MpXG5cblx0XHRzcHJpdGVQbHVnaW4ucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0bGVuc0ZsYXJlUGx1Z2luLnJlbmRlciggc2NlbmUsIGNhbWVyYSwgX2N1cnJlbnRWaWV3cG9ydCApO1xuXG5cdFx0Ly8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1pcG1hcCBmaWx0ZXJpbmdcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIGRlcHRoIGJ1ZmZlciB3cml0aW5nIGlzIGVuYWJsZWQgc28gaXQgY2FuIGJlIGNsZWFyZWQgb24gbmV4dCByZW5kZXJcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggdHJ1ZSApO1xuXG5cdFx0aWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSAmJiBjYW1lcmEuZW5hYmxlZCApIHtcblxuXHRcdFx0X3RoaXMuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7XG5cblx0XHR9XG5cblx0XHRjYW1lcmEub25BZnRlclJlbmRlciggX3RoaXMgKTtcblxuXHRcdC8vIF9nbC5maW5pc2goKTtcblxuXHR9O1xuXG5cdC8qXG5cdC8vIFRPRE8gRHVwbGljYXRlZCBjb2RlIChGcnVzdHVtKVxuXG5cdHZhciBfc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdGZ1bmN0aW9uIGlzT2JqZWN0Vmlld2FibGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKVxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICkuXG5cdFx0YXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3BoZXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzU3ByaXRlVmlld2FibGUoIHNwcml0ZSApIHtcblxuXHRcdF9zcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdF9zcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3BoZXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzU3BoZXJlVmlld2FibGUoIHNwaGVyZSApIHtcblxuXHRcdGlmICggISBfZnJ1c3R1bS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSApIHJldHVybiBmYWxzZTtcblxuXHRcdHZhciBudW1QbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzO1xuXG5cdFx0aWYgKCBudW1QbGFuZXMgPT09IDAgKSByZXR1cm4gdHJ1ZTtcblxuXHRcdHZhciBwbGFuZXMgPSBfdGhpcy5jbGlwcGluZ1BsYW5lcyxcblxuXHRcdFx0Y2VudGVyID0gc3BoZXJlLmNlbnRlcixcblx0XHRcdG5lZ1JhZCA9IC0gc3BoZXJlLnJhZGl1cyxcblx0XHRcdGkgPSAwO1xuXG5cdFx0ZG8ge1xuXG5cdFx0XHQvLyBvdXQgd2hlbiBkZWVwZXIgdGhhbiByYWRpdXMgaW4gdGhlIG5lZ2F0aXZlIGhhbGZzcGFjZVxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApIDwgbmVnUmFkICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fSB3aGlsZSAoICsrIGkgIT09IG51bVBsYW5lcyApO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXHQqL1xuXG5cdGZ1bmN0aW9uIHByb2plY3RPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdGlmICggISBvYmplY3QudmlzaWJsZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0bGlnaHRzLnB1c2goIG9iamVjdCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0c3ByaXRlcy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xlbnNGbGFyZSApIHtcblxuXHRcdFx0XHRsZW5zRmxhcmVzLnB1c2goIG9iamVjdCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHR2YXIgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xuXG5cdFx0XHRvYmplY3Qub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgJiYgY2FtZXJhLmVuYWJsZWQgKSB7XG5cblx0XHRcdFx0dmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdO1xuXHRcdFx0XHRcdHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kcztcblxuXHRcdFx0XHRcdF90aGlzLnNldFZpZXdwb3J0KFxuXHRcdFx0XHRcdFx0Ym91bmRzLnggKiBfd2lkdGggKiBfcGl4ZWxSYXRpbywgYm91bmRzLnkgKiBfaGVpZ2h0ICogX3BpeGVsUmF0aW8sXG5cdFx0XHRcdFx0XHRib3VuZHMueiAqIF93aWR0aCAqIF9waXhlbFJhdGlvLCBib3VuZHMudyAqIF9oZWlnaHQgKiBfcGl4ZWxSYXRpb1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0X3RoaXMuc2V0U2Npc3Nvcihcblx0XHRcdFx0XHRcdGJvdW5kcy54ICogX3dpZHRoICogX3BpeGVsUmF0aW8sIGJvdW5kcy55ICogX2hlaWdodCAqIF9waXhlbFJhdGlvLFxuXHRcdFx0XHRcdFx0Ym91bmRzLnogKiBfd2lkdGggKiBfcGl4ZWxSYXRpbywgYm91bmRzLncgKiBfaGVpZ2h0ICogX3BpeGVsUmF0aW9cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdF90aGlzLnNldFNjaXNzb3JUZXN0KCB0cnVlICk7XG5cblx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvYmplY3Qub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKSB7XG5cblx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXHRcdG9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XG5cblx0XHRpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0c3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0XHRcdHZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZS5mb2csIG1hdGVyaWFsLCBvYmplY3QgKTtcblxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblxuXHRcdFx0cmVuZGVyT2JqZWN0SW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgc2NlbmUuZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwgZm9nLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0ZXJzKFxuXHRcdFx0bWF0ZXJpYWwsIF9saWdodHMsIGZvZywgX2NsaXBwaW5nLm51bVBsYW5lcywgX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiwgb2JqZWN0ICk7XG5cblx0XHR2YXIgY29kZSA9IHByb2dyYW1DYWNoZS5nZXRQcm9ncmFtQ29kZSggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblxuXHRcdHZhciBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW07XG5cdFx0dmFyIHByb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5ldyBtYXRlcmlhbFxuXHRcdFx0bWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0fSBlbHNlIGlmICggcHJvZ3JhbS5jb2RlICE9PSBjb2RlICkge1xuXG5cdFx0XHQvLyBjaGFuZ2VkIGdsc2wgb3IgcGFyYW1ldGVyc1xuXHRcdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHJldHVybjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9ubHkgcmVidWlsZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbUNoYW5nZSApIHtcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRcdHZhciBzaGFkZXIgPSBTaGFkZXJMaWJbIHBhcmFtZXRlcnMuc2hhZGVySUQgXTtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuX193ZWJnbFNoYWRlciA9IHtcblx0XHRcdFx0XHRuYW1lOiBtYXRlcmlhbC50eXBlLFxuXHRcdFx0XHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzaGFkZXIudW5pZm9ybXMgKSxcblx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5fX3dlYmdsU2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogbWF0ZXJpYWwudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLl9fd2ViZ2xTaGFkZXIgPSBtYXRlcmlhbFByb3BlcnRpZXMuX193ZWJnbFNoYWRlcjtcblxuXHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggbWF0ZXJpYWwsIHBhcmFtZXRlcnMsIGNvZGUgKTtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHRcdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHByb2dyYW07XG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoVGFyZ2V0JyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuX193ZWJnbFNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmXG5cdFx0XHQhIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzO1xuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiA9IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb247XG5cdFx0XHR1bmlmb3Jtcy5jbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy51bmlmb3JtO1xuXG5cdFx0fVxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyA9IGZvZztcblxuXHRcdC8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMgY3JlYXRlZCBmb3JcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoID0gX2xpZ2h0cy5oYXNoO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdC8vIHdpcmUgdXAgdGhlIG1hdGVyaWFsIHRvIHRoaXMgcmVuZGVyZXIncyBsaWdodGluZyBzdGF0ZVxuXG5cdFx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci52YWx1ZSA9IF9saWdodHMuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5kaXJlY3Rpb25hbDtcblx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodHMudmFsdWUgPSBfbGlnaHRzLnNwb3Q7XG5cdFx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy52YWx1ZSA9IF9saWdodHMucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IF9saWdodHMucG9pbnQ7XG5cdFx0XHR1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5oZW1pO1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZSA9IF9saWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg7XG5cdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWFwLnZhbHVlID0gX2xpZ2h0cy5zcG90U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IF9saWdodHMuc3BvdFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZhbHVlID0gX2xpZ2h0cy5wb2ludFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWF0cml4LnZhbHVlID0gX2xpZ2h0cy5wb2ludFNoYWRvd01hdHJpeDtcblx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXNcblxuXHRcdH1cblxuXHRcdHZhciBwcm9nVW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0dW5pZm9ybXNMaXN0ID1cblx0XHRcdFx0V2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUoIHByb2dVbmlmb3Jtcy5zZXEsIHVuaWZvcm1zICk7XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID0gdW5pZm9ybXNMaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQcm9ncmFtKCBjYW1lcmEsIGZvZywgbWF0ZXJpYWwsIG9iamVjdCApIHtcblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzID0gMDtcblxuXHRcdHZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIHtcblxuXHRcdFx0aWYgKCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0XHR2YXIgdXNlQ2FjaGUgPVxuXHRcdFx0XHRcdGNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiZcblx0XHRcdFx0XHRtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkO1xuXG5cdFx0XHRcdC8vIHdlIG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3VwXG5cdFx0XHRcdC8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlXG5cdFx0XHRcdC8vICgjODQ2NSwgIzgzNzkpXG5cdFx0XHRcdF9jbGlwcGluZy5zZXRTdGF0ZShcblx0XHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcywgbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbiwgbWF0ZXJpYWwuY2xpcFNoYWRvd3MsXG5cdFx0XHRcdFx0Y2FtZXJhLCBtYXRlcmlhbFByb3BlcnRpZXMsIHVzZUNhY2hlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5mb2cgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyAhPT0gZm9nICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubGlnaHRzICYmIG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoICE9PSBfbGlnaHRzLmhhc2ggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gX2NsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApO1xuXHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaExpZ2h0cyA9IGZhbHNlO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSxcblx0XHRcdHBfdW5pZm9ybXMgPSBwcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHRtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLl9fd2ViZ2xTaGFkZXIudW5pZm9ybXM7XG5cblx0XHRpZiAoIHByb2dyYW0uaWQgIT09IF9jdXJyZW50UHJvZ3JhbSApIHtcblxuXHRcdFx0X2dsLnVzZVByb2dyYW0oIHByb2dyYW0ucHJvZ3JhbSApO1xuXHRcdFx0X2N1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbS5pZDtcblxuXHRcdFx0cmVmcmVzaFByb2dyYW0gPSB0cnVlO1xuXHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pZCAhPT0gX2N1cnJlbnRNYXRlcmlhbElkICkge1xuXG5cdFx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSBtYXRlcmlhbC5pZDtcblxuXHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaFByb2dyYW0gfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAncHJvamVjdGlvbk1hdHJpeCcsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbG9nRGVwdGhCdWZGQycsXG5cdFx0XHRcdFx0Mi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIgKSApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50Q2FtZXJhID0gY2FtZXJhO1xuXG5cdFx0XHRcdC8vIGxpZ2h0aW5nIHVuaWZvcm1zIGRlcGVuZCBvbiB0aGUgY2FtZXJhIHNvIGVuZm9yY2UgYW4gdXBkYXRlXG5cdFx0XHRcdC8vIG5vdywgaW4gY2FzZSB0aGlzIG1hdGVyaWFsIHN1cHBvcnRzIGxpZ2h0cyAtIG9yIGxhdGVyLCB3aGVuXG5cdFx0XHRcdC8vIHRoZSBuZXh0IG1hdGVyaWFsIHRoYXQgZG9lcyBnZXRzIGFjdGl2YXRlZDpcblxuXHRcdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1x0XHQvLyBzZXQgdG8gdHJ1ZSBvbiBtYXRlcmlhbCBjaGFuZ2Vcblx0XHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XHRcdC8vIHJlbWFpbnMgc2V0IHVudGlsIHVwZGF0ZSBkb25lXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbG9hZCBtYXRlcmlhbCBzcGVjaWZpYyB1bmlmb3Jtc1xuXHRcdFx0Ly8gKHNoYWRlciBtYXRlcmlhbCBhbHNvIGdldHMgdGhlbSBmb3IgdGhlIHNha2Ugb2YgZ2VuZXJpY2l0eSlcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdFx0dmFyIHVDYW1Qb3MgPSBwX3VuaWZvcm1zLm1hcC5jYW1lcmFQb3NpdGlvbjtcblxuXHRcdFx0XHRpZiAoIHVDYW1Qb3MgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHVDYW1Qb3Muc2V0VmFsdWUoIF9nbCxcblx0XHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5za2lubmluZyApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd2aWV3TWF0cml4JywgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nIHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZVxuXHRcdC8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUgdGV4dHVyZSBtdXN0IGdvIGJlZm9yZSBvdGhlciB0ZXh0dXJlc1xuXHRcdC8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuXG5cblx0XHRpZiAoIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXgnICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXhJbnZlcnNlJyApO1xuXG5cdFx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cblx0XHRcdGlmICggc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxuXHRcdFx0XHRcdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxuXHRcdFx0XHRcdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOClcblx0XHRcdFx0XHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXG5cdFx0XHRcdFx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcblxuXG5cdFx0XHRcdFx0XHR2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9uZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XG5cdFx0XHRcdFx0XHRzaXplID0gX01hdGgubmV4dFBvd2VyT2ZUd28oIE1hdGguY2VpbCggc2l6ZSApICk7XG5cdFx0XHRcdFx0XHRzaXplID0gTWF0aC5tYXgoIHNpemUsIDQgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbFxuXHRcdFx0XHRcdFx0Ym9uZU1hdHJpY2VzLnNldCggc2tlbGV0b24uYm9uZU1hdHJpY2VzICk7IC8vIGNvcHkgY3VycmVudCB2YWx1ZXNcblxuXHRcdFx0XHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBib25lTWF0cmljZXMsIHNpemUsIHNpemUsIFJHQkFGb3JtYXQsIEZsb2F0VHlwZSApO1xuXG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lTWF0cmljZXMgPSBib25lTWF0cmljZXM7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZSA9IGJvbmVUZXh0dXJlO1xuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZVRleHR1cmVTaXplID0gc2l6ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlJywgc2tlbGV0b24uYm9uZVRleHR1cmUgKTtcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZVNpemUnLCBza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBza2VsZXRvbiwgJ2JvbmVNYXRyaWNlcycgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaE1hdGVyaWFsICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHtcblxuXHRcdFx0XHQvLyB0aGUgY3VycmVudCBtYXRlcmlhbCByZXF1aXJlcyBsaWdodGluZyBpbmZvXG5cblx0XHRcdFx0Ly8gbm90ZTogYWxsIGxpZ2h0aW5nIHVuaWZvcm1zIGFyZSBhbHdheXMgc2V0IGNvcnJlY3RseVxuXHRcdFx0XHQvLyB0aGV5IHNpbXBseSByZWZlcmVuY2UgdGhlIHJlbmRlcmVyJ3Mgc3RhdGUgZm9yIHRoZWlyXG5cdFx0XHRcdC8vIHZhbHVlc1xuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyB1c2UgdGhlIGN1cnJlbnQgbWF0ZXJpYWwncyAubmVlZHNVcGRhdGUgZmxhZ3MgdG8gc2V0XG5cdFx0XHRcdC8vIHRoZSBHTCBzdGF0ZSB3aGVuIHJlcXVpcmVkXG5cblx0XHRcdFx0bWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIG1fdW5pZm9ybXMsIHJlZnJlc2hMaWdodHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZWZyZXNoIHVuaWZvcm1zIGNvbW1vbiB0byBzZXZlcmFsIG1hdGVyaWFsc1xuXG5cdFx0XHRpZiAoIGZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRm9nKCBtX3VuaWZvcm1zLCBmb2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hEZXB0aE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZWZyZXNoIHNpbmdsZSBtYXRlcmlhbCBzcGVjaWZpYyB1bmlmb3Jtc1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTGluZUJhc2ljTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGluZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGluZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRGFzaCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zVG9vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0XHRcdG1fdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0XHRcdG1fdW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdFx0XHRtX3VuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTm9ybWFsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uXG5cblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNNYXQgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjTWF0LnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDX01BVF9URVhUVVJFO1xuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y01hZyAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNNYWcudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfTUFHX1RFWFRVUkU7XG5cblx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKFxuXHRcdFx0XHRfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7XG5cblx0XHR9XG5cblxuXHRcdC8vIGNvbW1vbiBtYXRyaWNlc1xuXG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxWaWV3TWF0cml4Jywgb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApO1xuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbE1hdHJpeCcsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdC8vIFVuaWZvcm1zIChyZWZyZXNoIHVuaWZvcm1zIG9iamVjdHMpXG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmUgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmVtaXNzaXZlICkubXVsdGlwbHlTY2FsYXIoIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ICk7XG5cblx0XHR9XG5cblx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XG5cdFx0dW5pZm9ybXMuc3BlY3VsYXJNYXAudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5saWdodE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXAudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcDtcblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFvTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5hb01hcC52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwO1xuXHRcdFx0dW5pZm9ybXMuYW9NYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5hb01hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllc1xuXHRcdC8vIDEuIGNvbG9yIG1hcFxuXHRcdC8vIDIuIHNwZWN1bGFyIG1hcFxuXHRcdC8vIDMuIG5vcm1hbCBtYXBcblx0XHQvLyA0LiBidW1wIG1hcFxuXHRcdC8vIDUuIGFscGhhIG1hcFxuXHRcdC8vIDYuIGVtaXNzaXZlIG1hcFxuXG5cdFx0dmFyIHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYnVtcE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwID0gdXZTY2FsZU1hcC50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBvZmZzZXQgPSB1dlNjYWxlTWFwLm9mZnNldDtcblx0XHRcdHZhciByZXBlYXQgPSB1dlNjYWxlTWFwLnJlcGVhdDtcblxuXHRcdFx0dW5pZm9ybXMub2Zmc2V0UmVwZWF0LnZhbHVlLnNldCggb2Zmc2V0LngsIG9mZnNldC55LCByZXBlYXQueCwgcmVwZWF0LnkgKTtcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDtcblxuXHRcdC8vIGRvbid0IGZsaXAgQ3ViZVRleHR1cmUgZW52TWFwcywgZmxpcCBldmVyeXRoaW5nIGVsc2U6XG5cdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB3aWxsIGJlIGZsaXBwZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdC8vIHRoaXMgY2hlY2sgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBvciByZW1vdmVkIGVudGlyZWx5LCBpZiBXZWJHTFJlbmRlclRhcmdldEN1YmUgdXNlcyBhIEN1YmVUZXh0dXJlIGluIHRoZSBmdXR1cmVcblx0XHR1bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCAhICggbWF0ZXJpYWwuZW52TWFwICYmIG1hdGVyaWFsLmVudk1hcC5pc0N1YmVUZXh0dXJlICkgKSA/IDEgOiAtIDE7XG5cblx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7XG5cdFx0dW5pZm9ybXMucmVmcmFjdGlvblJhdGlvLnZhbHVlID0gbWF0ZXJpYWwucmVmcmFjdGlvblJhdGlvO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBvZmZzZXQgPSBtYXRlcmlhbC5tYXAub2Zmc2V0O1xuXHRcdFx0dmFyIHJlcGVhdCA9IG1hdGVyaWFsLm1hcC5yZXBlYXQ7XG5cblx0XHRcdHVuaWZvcm1zLm9mZnNldFJlcGVhdC52YWx1ZS5zZXQoIG9mZnNldC54LCBvZmZzZXQueSwgcmVwZWF0LngsIHJlcGVhdC55ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0ZvZyggdW5pZm9ybXMsIGZvZyApIHtcblxuXHRcdHVuaWZvcm1zLmZvZ0NvbG9yLnZhbHVlID0gZm9nLmNvbG9yO1xuXG5cdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ05lYXIudmFsdWUgPSBmb2cubmVhcjtcblx0XHRcdHVuaWZvcm1zLmZvZ0Zhci52YWx1ZSA9IGZvZy5mYXI7XG5cblx0XHR9IGVsc2UgaWYgKCBmb2cuaXNGb2dFeHAyICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5mb2dEZW5zaXR5LnZhbHVlID0gZm9nLmRlbnNpdHk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyO1xuXHRcdHVuaWZvcm1zLnNoaW5pbmVzcy52YWx1ZSA9IE1hdGgubWF4KCBtYXRlcmlhbC5zaGluaW5lc3MsIDFlLTQgKTsgLy8gdG8gcHJldmVudCBwb3coIDAuMCwgMC4wIClcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmdyYWRpZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ncmFkaWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmdyYWRpZW50TWFwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzO1xuXHRcdHVuaWZvcm1zLm1ldGFsbmVzcy52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzcztcblxuXHRcdGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0Ly91bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7IC8vIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5jbGVhckNvYXQudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXQ7XG5cdFx0dW5pZm9ybXMuY2xlYXJDb2F0Um91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdFx0cmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNOb3JtYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIElmIHVuaWZvcm1zIGFyZSBtYXJrZWQgYXMgY2xlYW4sIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBsb2FkZWQgdG8gdGhlIEdQVS5cblxuXHRmdW5jdGlvbiBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggdW5pZm9ybXMsIHZhbHVlICkge1xuXG5cdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMucG9pbnRMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cblx0fVxuXG5cdC8vIExpZ2h0aW5nXG5cblx0ZnVuY3Rpb24gc2V0dXBTaGFkb3dzKCBsaWdodHMgKSB7XG5cblx0XHR2YXIgbGlnaHRTaGFkb3dzTGVuZ3RoID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblxuXHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdF9saWdodHMuc2hhZG93c1sgbGlnaHRTaGFkb3dzTGVuZ3RoIF0gPSBsaWdodDtcblx0XHRcdFx0bGlnaHRTaGFkb3dzTGVuZ3RoICsrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRfbGlnaHRzLnNoYWRvd3MubGVuZ3RoID0gbGlnaHRTaGFkb3dzTGVuZ3RoO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cyggbGlnaHRzLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgbCwgbGwsIGxpZ2h0LCBzaGFkb3csXG5cdFx0XHRyID0gMCwgZyA9IDAsIGIgPSAwLFxuXHRcdFx0Y29sb3IsXG5cdFx0XHRpbnRlbnNpdHksXG5cdFx0XHRkaXN0YW5jZSxcblx0XHRcdHNoYWRvd01hcCxcblxuXHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsXG5cblx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoID0gMCxcblx0XHRcdHBvaW50TGVuZ3RoID0gMCxcblx0XHRcdHNwb3RMZW5ndGggPSAwLFxuXHRcdFx0cmVjdEFyZWFMZW5ndGggPSAwLFxuXHRcdFx0aGVtaUxlbmd0aCA9IDA7XG5cblx0XHRmb3IgKCBsID0gMCwgbGwgPSBsaWdodHMubGVuZ3RoOyBsIDwgbGw7IGwgKysgKSB7XG5cblx0XHRcdGxpZ2h0ID0gbGlnaHRzWyBsIF07XG5cblx0XHRcdGNvbG9yID0gbGlnaHQuY29sb3I7XG5cdFx0XHRpbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XG5cdFx0XHRkaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXG5cdFx0XHRzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmlzQW1iaWVudExpZ2h0ICkge1xuXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcblx0XHRcdFx0ZyArPSBjb2xvci5nICogaW50ZW5zaXR5O1xuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggX3ZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0c2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRfbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWFwWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRfbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBkaXJlY3Rpb25hbExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0X2xpZ2h0cy5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIF92ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb25lQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0c2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRfbGlnaHRzLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0X2xpZ2h0cy5zcG90U2hhZG93TWF0cml4WyBzcG90TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRfbGlnaHRzLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHQvLyAoYSkgaW50ZW5zaXR5IGNvbnRyb2xzIGlycmFkaWFuY2Ugb2YgZW50aXJlIGxpZ2h0XG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yXG5cdFx0XHRcdFx0LmNvcHkoIGNvbG9yIClcblx0XHRcdFx0XHQubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSAvICggbGlnaHQud2lkdGggKiBsaWdodC5oZWlnaHQgKSApO1xuXG5cdFx0XHRcdC8vIChiKSBpbnRlbnNpdHkgY29udHJvbHMgdGhlIHJhZGlhbmNlIHBlciBsaWdodCBhcmVhXG5cdFx0XHRcdC8vIHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRfbWF0cml4NDIuaWRlbnRpdHkoKTtcblx0XHRcdFx0X21hdHJpeDQuY29weSggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0X21hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0X21hdHJpeDQyLmV4dHJhY3RSb3RhdGlvbiggX21hdHJpeDQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmV2lkdGguc2V0KCBsaWdodC53aWR0aCAqIDAuNSwgICAgICAgICAgICAgICAgMC4wLCAwLjAgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoICAgICAgICAgICAgICAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggX21hdHJpeDQyICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KCBfbWF0cml4NDIgKTtcblxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBkaXN0YW5jZT9cblx0XHRcdFx0Ly8gdW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHRfbGlnaHRzLnJlY3RBcmVhWyByZWN0QXJlYUxlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cmVjdEFyZWFMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0c2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRfbGlnaHRzLnBvaW50U2hhZG93TWFwWyBwb2ludExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRfbGlnaHRzLnBvaW50U2hhZG93TWF0cml4WyBwb2ludExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0X2xpZ2h0cy5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBsaWdodENhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5za3lDb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZ3JvdW5kQ29sb3IuY29weSggbGlnaHQuZ3JvdW5kQ29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0X2xpZ2h0cy5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRoZW1pTGVuZ3RoICsrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRfbGlnaHRzLmFtYmllbnRbIDAgXSA9IHI7XG5cdFx0X2xpZ2h0cy5hbWJpZW50WyAxIF0gPSBnO1xuXHRcdF9saWdodHMuYW1iaWVudFsgMiBdID0gYjtcblxuXHRcdF9saWdodHMuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0X2xpZ2h0cy5zcG90Lmxlbmd0aCA9IHNwb3RMZW5ndGg7XG5cdFx0X2xpZ2h0cy5yZWN0QXJlYS5sZW5ndGggPSByZWN0QXJlYUxlbmd0aDtcblx0XHRfbGlnaHRzLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoO1xuXHRcdF9saWdodHMuaGVtaS5sZW5ndGggPSBoZW1pTGVuZ3RoO1xuXG5cdFx0Ly8gVE9ETyAoc2FtLWctc3RlZWwpIHdoeSBhcmVuJ3Qgd2UgdXNpbmcgam9pblxuXHRcdF9saWdodHMuaGFzaCA9IGRpcmVjdGlvbmFsTGVuZ3RoICsgJywnICsgcG9pbnRMZW5ndGggKyAnLCcgKyBzcG90TGVuZ3RoICsgJywnICsgcmVjdEFyZWFMZW5ndGggKyAnLCcgKyBoZW1pTGVuZ3RoICsgJywnICsgX2xpZ2h0cy5zaGFkb3dzLmxlbmd0aDtcblxuXHR9XG5cblx0Ly8gR0wgc3RhdGUgc2V0dGluZ1xuXG5cdHRoaXMuc2V0RmFjZUN1bGxpbmcgPSBmdW5jdGlvbiAoIGN1bGxGYWNlLCBmcm9udEZhY2VEaXJlY3Rpb24gKSB7XG5cblx0XHRzdGF0ZS5zZXRDdWxsRmFjZSggY3VsbEZhY2UgKTtcblx0XHRzdGF0ZS5zZXRGbGlwU2lkZWQoIGZyb250RmFjZURpcmVjdGlvbiA9PT0gRnJvbnRGYWNlRGlyZWN0aW9uQ1cgKTtcblxuXHR9O1xuXG5cdC8vIFRleHR1cmVzXG5cblx0ZnVuY3Rpb24gYWxsb2NUZXh0dXJlVW5pdCgpIHtcblxuXHRcdHZhciB0ZXh0dXJlVW5pdCA9IF91c2VkVGV4dHVyZVVuaXRzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlVW5pdCA+PSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1dlYkdMUmVuZGVyZXI6IHRyeWluZyB0byB1c2UgJyArIHRleHR1cmVVbml0ICsgJyB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgJyArIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApO1xuXG5cdFx0fVxuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgKz0gMTtcblxuXHRcdHJldHVybiB0ZXh0dXJlVW5pdDtcblxuXHR9XG5cblx0dGhpcy5hbGxvY1RleHR1cmVVbml0ID0gYWxsb2NUZXh0dXJlVW5pdDtcblxuXHQvLyB0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlMkQgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBwZWVsIHRleHR1cmUudGV4dHVyZVxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlIGlzIGRlcHJlY2F0ZWQsIHVzZSBzZXRUZXh0dXJlMkQgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLnNldFRleHR1cmVDdWJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBwZWVsIHRleHR1cmUudGV4dHVyZVxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGN1cnJlbnRseSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgaXMgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETzogdW5pZnkgdGhlc2UgY29kZSBwYXRoc1xuXHRcdFx0aWYgKCAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkgfHxcblx0XHRcdFx0KCBBcnJheS5pc0FycmF5KCB0ZXh0dXJlLmltYWdlICkgJiYgdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSApIHtcblxuXHRcdFx0XHQvLyBDb21wcmVzc2VkVGV4dHVyZSBjYW4gaGF2ZSBBcnJheSBpbiBpbWFnZSA6L1xuXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gYWxvbmUgc2hvdWxkIHRha2UgY2FyZSBvZiBjdWJlIHRleHR1cmVzXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gYXNzdW1lZDogdGV4dHVyZSBwcm9wZXJ0eSBvZiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldEN1YmVcblxuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRfY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICYmIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZXMuc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApO1xuXHRcdHZhciBmcmFtZWJ1ZmZlcjtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRmcmFtZWJ1ZmZlciA9IG51bGw7XG5cblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IF9zY2lzc29yVGVzdDtcblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKTtcblxuXHRcdH1cblxuXHRcdGlmICggX2N1cnJlbnRGcmFtZWJ1ZmZlciAhPT0gZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblx0XHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApO1xuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfY3VycmVudFNjaXNzb3JUZXN0ICk7XG5cblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydCApO1xuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHJlbmRlclRhcmdldC5hY3RpdmVNaXBNYXBMZXZlbCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciApIHtcblxuXHRcdGlmICggKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdGlmICggZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdHZhciByZXN0b3JlID0gZmFsc2U7XG5cblx0XHRcdGlmICggZnJhbWVidWZmZXIgIT09IF9jdXJyZW50RnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRcdHJlc3RvcmUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHRcdFx0dmFyIHRleHR1cmVGb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcblx0XHRcdFx0dmFyIHRleHR1cmVUeXBlID0gdGV4dHVyZS50eXBlO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZUZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiBwYXJhbVRocmVlVG9HTCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlVHlwZSApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFICkgJiYgLy8gSUUxMSwgRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMylcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICkgfHwgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQnICkgKSApICYmIC8vIENocm9tZSBNYWMgPj0gNTIgYW5kIEZpcmVmb3hcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBfZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyggX2dsLkZSQU1FQlVGRkVSICkgPT09IF9nbC5GUkFNRUJVRkZFUl9DT01QTEVURSApIHtcblxuXHRcdFx0XHRcdC8vIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGVuc3VyZXMgdmFsaWQgcmVhZCByZXF1ZXN0cyAobm8gb3V0LW9mLWJvdW5kcyBwaXhlbHMsIHNlZSAjODYwNClcblxuXHRcdFx0XHRcdGlmICggKCB4ID49IDAgJiYgeCA8PSAoIHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICkgKSAmJiAoIHkgPj0gMCAmJiB5IDw9ICggcmVuZGVyVGFyZ2V0LmhlaWdodCAtIGhlaWdodCApICkgKSB7XG5cblx0XHRcdFx0XHRcdF9nbC5yZWFkUGl4ZWxzKCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZUZvcm1hdCApLCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBmaW5hbGx5IHtcblxuXHRcdFx0XHRpZiAoIHJlc3RvcmUgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdC8vIE1hcCB0aHJlZS5qcyBjb25zdGFudHMgdG8gV2ViR0wgY29uc3RhbnRzXG5cblx0ZnVuY3Rpb24gcGFyYW1UaHJlZVRvR0woIHAgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0aWYgKCBwID09PSBSZXBlYXRXcmFwcGluZyApIHJldHVybiBfZ2wuUkVQRUFUO1xuXHRcdGlmICggcCA9PT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHJldHVybiBfZ2wuQ0xBTVBfVE9fRURHRTtcblx0XHRpZiAoIHAgPT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gX2dsLk1JUlJPUkVEX1JFUEVBVDtcblxuXHRcdGlmICggcCA9PT0gTmVhcmVzdEZpbHRlciApIHJldHVybiBfZ2wuTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBfZ2wuTkVBUkVTVF9NSVBNQVBfTElORUFSO1xuXG5cdFx0aWYgKCBwID09PSBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gX2dsLkxJTkVBUjtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gX2dsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBfZ2wuTElORUFSX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX0JZVEU7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTY1VHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfU0hPUlRfNV82XzU7XG5cblx0XHRpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIF9nbC5CWVRFO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIF9nbC5TSE9SVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnRUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9TSE9SVDtcblx0XHRpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gX2dsLklOVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfSU5UO1xuXHRcdGlmICggcCA9PT0gRmxvYXRUeXBlICkgcmV0dXJuIF9nbC5GTE9BVDtcblxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IEFscGhhRm9ybWF0ICkgcmV0dXJuIF9nbC5BTFBIQTtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBfZ2wuUkdCO1xuXHRcdGlmICggcCA9PT0gUkdCQUZvcm1hdCApIHJldHVybiBfZ2wuUkdCQTtcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUZvcm1hdCApIHJldHVybiBfZ2wuTFVNSU5BTkNFO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gX2dsLkxVTUlOQU5DRV9BTFBIQTtcblx0XHRpZiAoIHAgPT09IERlcHRoRm9ybWF0ICkgcmV0dXJuIF9nbC5ERVBUSF9DT01QT05FTlQ7XG5cdFx0aWYgKCBwID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSByZXR1cm4gX2dsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRpZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIF9nbC5GVU5DX0FERDtcblx0XHRpZiAoIHAgPT09IFN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gX2dsLkZVTkNfU1VCVFJBQ1Q7XG5cdFx0aWYgKCBwID09PSBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBfZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNUO1xuXG5cdFx0aWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIF9nbC5aRVJPO1xuXHRcdGlmICggcCA9PT0gT25lRmFjdG9yICkgcmV0dXJuIF9nbC5PTkU7XG5cdFx0aWYgKCBwID09PSBTcmNDb2xvckZhY3RvciApIHJldHVybiBfZ2wuU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNDb2xvckZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX1NSQ19DT0xPUjtcblx0XHRpZiAoIHAgPT09IFNyY0FscGhhRmFjdG9yICkgcmV0dXJuIF9nbC5TUkNfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c1NyY0FscGhhRmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gX2dsLkRTVF9BTFBIQTtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gX2dsLk9ORV9NSU5VU19EU1RfQUxQSEE7XG5cblx0XHRpZiAoIHAgPT09IERzdENvbG9yRmFjdG9yICkgcmV0dXJuIF9nbC5EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNfRFNUX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciApIHJldHVybiBfZ2wuU1JDX0FMUEhBX1NBVFVSQVRFO1xuXG5cdFx0aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiB8fCBwID09PSBNYXhFcXVhdGlvbiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uVU5TSUdORURfSU5UXzI0XzhfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gMDtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2dFeHAyICggY29sb3IsIGRlbnNpdHkgKSB7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0dGhpcy5kZW5zaXR5ID0gKCBkZW5zaXR5ICE9PSB1bmRlZmluZWQgKSA/IGRlbnNpdHkgOiAwLjAwMDI1O1xuXG59XG5cbkZvZ0V4cDIucHJvdG90eXBlLmlzRm9nRXhwMiA9IHRydWU7XG5cbkZvZ0V4cDIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nRXhwMiggdGhpcy5jb2xvci5nZXRIZXgoKSwgdGhpcy5kZW5zaXR5ICk7XG5cbn07XG5cbkZvZ0V4cDIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdGb2dFeHAyJyxcblx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRkZW5zaXR5OiB0aGlzLmRlbnNpdHlcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2cgKCBjb2xvciwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAxO1xuXHR0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDEwMDA7XG5cbn1cblxuRm9nLnByb3RvdHlwZS5pc0ZvZyA9IHRydWU7XG5cbkZvZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2coIHRoaXMuY29sb3IuZ2V0SGV4KCksIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxufTtcblxuRm9nLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRm9nJyxcblx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRuZWFyOiB0aGlzLm5lYXIsXG5cdFx0ZmFyOiB0aGlzLmZhclxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU2NlbmUgKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2NlbmUnO1xuXG5cdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdHRoaXMuZm9nID0gbnVsbDtcblx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlOyAvLyBjaGVja2VkIGJ5IHRoZSByZW5kZXJlclxuXG59XG5cblNjZW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNjZW5lLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExlbnNGbGFyZSggdGV4dHVyZSwgc2l6ZSwgZGlzdGFuY2UsIGJsZW5kaW5nLCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5sZW5zRmxhcmVzID0gW107XG5cblx0dGhpcy5wb3NpdGlvblNjcmVlbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuY3VzdG9tVXBkYXRlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG5cblx0aWYgKCB0ZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmFkZCggdGV4dHVyZSwgc2l6ZSwgZGlzdGFuY2UsIGJsZW5kaW5nLCBjb2xvciApO1xuXG5cdH1cblxufVxuXG5MZW5zRmxhcmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGVuc0ZsYXJlLFxuXG5cdGlzTGVuc0ZsYXJlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uU2NyZWVuLmNvcHkoIHNvdXJjZS5wb3NpdGlvblNjcmVlbiApO1xuXHRcdHRoaXMuY3VzdG9tVXBkYXRlQ2FsbGJhY2sgPSBzb3VyY2UuY3VzdG9tVXBkYXRlQ2FsbGJhY2s7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UubGVuc0ZsYXJlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxlbnNGbGFyZXMucHVzaCggc291cmNlLmxlbnNGbGFyZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdGV4dHVyZSwgc2l6ZSwgZGlzdGFuY2UsIGJsZW5kaW5nLCBjb2xvciwgb3BhY2l0eSApIHtcblxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IC0gMTtcblx0XHRpZiAoIGRpc3RhbmNlID09PSB1bmRlZmluZWQgKSBkaXN0YW5jZSA9IDA7XG5cdFx0aWYgKCBvcGFjaXR5ID09PSB1bmRlZmluZWQgKSBvcGFjaXR5ID0gMTtcblx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblx0XHRpZiAoIGJsZW5kaW5nID09PSB1bmRlZmluZWQgKSBibGVuZGluZyA9IE5vcm1hbEJsZW5kaW5nO1xuXG5cdFx0ZGlzdGFuY2UgPSBNYXRoLm1pbiggZGlzdGFuY2UsIE1hdGgubWF4KCAwLCBkaXN0YW5jZSApICk7XG5cblx0XHR0aGlzLmxlbnNGbGFyZXMucHVzaCgge1xuXHRcdFx0dGV4dHVyZTogdGV4dHVyZSxcdC8vIFRIUkVFLlRleHR1cmVcblx0XHRcdHNpemU6IHNpemUsIFx0XHQvLyBzaXplIGluIHBpeGVscyAoLTEgPSB1c2UgdGV4dHVyZS53aWR0aClcblx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSwgXHQvLyBkaXN0YW5jZSAoMC0xKSBmcm9tIGxpZ2h0IHNvdXJjZSAoMD1hdCBsaWdodCBzb3VyY2UpXG5cdFx0XHR4OiAwLCB5OiAwLCB6OiAwLFx0Ly8gc2NyZWVuIHBvc2l0aW9uICgtMSA9PiAxKSB6ID0gMCBpcyBpbiBmcm9udCB6ID0gMSBpcyBiYWNrXG5cdFx0XHRzY2FsZTogMSwgXHRcdC8vIHNjYWxlXG5cdFx0XHRyb3RhdGlvbjogMCwgXHRcdC8vIHJvdGF0aW9uXG5cdFx0XHRvcGFjaXR5OiBvcGFjaXR5LFx0Ly8gb3BhY2l0eVxuXHRcdFx0Y29sb3I6IGNvbG9yLFx0XHQvLyBjb2xvclxuXHRcdFx0YmxlbmRpbmc6IGJsZW5kaW5nXHQvLyBibGVuZGluZ1xuXHRcdH0gKTtcblxuXHR9LFxuXG5cdC8qXG5cdCAqIFVwZGF0ZSBsZW5zIGZsYXJlcyB1cGRhdGUgcG9zaXRpb25zIG9uIGFsbCBmbGFyZXMgYmFzZWQgb24gdGhlIHNjcmVlbiBwb3NpdGlvblxuXHQgKiBTZXQgbXlMZW5zRmxhcmUuY3VzdG9tVXBkYXRlQ2FsbGJhY2sgdG8gYWx0ZXIgdGhlIGZsYXJlcyBpbiB5b3VyIHByb2plY3Qgc3BlY2lmaWMgd2F5LlxuXHQgKi9cblxuXHR1cGRhdGVMZW5zRmxhcmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZiwgZmwgPSB0aGlzLmxlbnNGbGFyZXMubGVuZ3RoO1xuXHRcdHZhciBmbGFyZTtcblx0XHR2YXIgdmVjWCA9IC0gdGhpcy5wb3NpdGlvblNjcmVlbi54ICogMjtcblx0XHR2YXIgdmVjWSA9IC0gdGhpcy5wb3NpdGlvblNjcmVlbi55ICogMjtcblxuXHRcdGZvciAoIGYgPSAwOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZsYXJlID0gdGhpcy5sZW5zRmxhcmVzWyBmIF07XG5cblx0XHRcdGZsYXJlLnggPSB0aGlzLnBvc2l0aW9uU2NyZWVuLnggKyB2ZWNYICogZmxhcmUuZGlzdGFuY2U7XG5cdFx0XHRmbGFyZS55ID0gdGhpcy5wb3NpdGlvblNjcmVlbi55ICsgdmVjWSAqIGZsYXJlLmRpc3RhbmNlO1xuXG5cdFx0XHRmbGFyZS53YW50ZWRSb3RhdGlvbiA9IGZsYXJlLnggKiBNYXRoLlBJICogMC4yNTtcblx0XHRcdGZsYXJlLnJvdGF0aW9uICs9ICggZmxhcmUud2FudGVkUm90YXRpb24gLSBmbGFyZS5yb3RhdGlvbiApICogMC4yNTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqXHR1dk9mZnNldDogbmV3IFRIUkVFLlZlY3RvcjIoKSxcbiAqXHR1dlNjYWxlOiBuZXcgVEhSRUUuVmVjdG9yMigpXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcHJpdGVNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMucm90YXRpb24gPSAwO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwcml0ZU1hdGVyaWFsO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWwgPSB0cnVlO1xuXG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwcml0ZSggbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcHJpdGUnO1xuXG5cdHRoaXMubWF0ZXJpYWwgPSAoIG1hdGVyaWFsICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsIDogbmV3IFNwcml0ZU1hdGVyaWFsKCk7XG5cbn1cblxuU3ByaXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwcml0ZSxcblxuXHRpc1Nwcml0ZTogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHdvcmxkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXljYXN0ZXIucmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQoIHdvcmxkUG9zaXRpb24sIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdHdvcmxkU2NhbGUuc2V0RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR2YXIgZ3Vlc3NTaXplU3EgPSB3b3JsZFNjYWxlLnggKiB3b3JsZFNjYWxlLnkgLyA0O1xuXG5cdFx0XHRpZiAoIHdvcmxkUG9zaXRpb24uZGlzdGFuY2VUb1NxdWFyZWQoIGludGVyc2VjdFBvaW50ICkgPiBndWVzc1NpemVTcSApIHJldHVybjtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcblx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdH0gKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTE9EKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTE9EJztcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdGxldmVsczoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBbXVxuXHRcdH1cblx0fSApO1xuXG59XG5cbkxPRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMT0QsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIGZhbHNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gc291cmNlLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGkgXTtcblxuXHRcdFx0dGhpcy5hZGRMZXZlbCggbGV2ZWwub2JqZWN0LmNsb25lKCksIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZExldmVsOiBmdW5jdGlvbiAoIG9iamVjdCwgZGlzdGFuY2UgKSB7XG5cblx0XHRpZiAoIGRpc3RhbmNlID09PSB1bmRlZmluZWQgKSBkaXN0YW5jZSA9IDA7XG5cblx0XHRkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgbCBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXZlbHMuc3BsaWNlKCBsLCAwLCB7IGRpc3RhbmNlOiBkaXN0YW5jZSwgb2JqZWN0OiBvYmplY3QgfSApO1xuXG5cdFx0dGhpcy5hZGQoIG9iamVjdCApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0Rm9yRGlzdGFuY2U6IGZ1bmN0aW9uICggZGlzdGFuY2UgKSB7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbGV2ZWxzWyBpIC0gMSBdLm9iamVjdDtcblxuXHR9LFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdG1hdHJpeFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBtYXRyaXhQb3NpdGlvbiApO1xuXG5cdFx0XHR0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHZhciBkaXN0YW5jZSA9IHYxLmRpc3RhbmNlVG8oIHYyICk7XG5cblx0XHRcdFx0bGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA+PSBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRcdFx0bGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5sZXZlbHMgPSBbXTtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGkgXTtcblxuXHRcdFx0ZGF0YS5vYmplY3QubGV2ZWxzLnB1c2goIHtcblx0XHRcdFx0b2JqZWN0OiBsZXZlbC5vYmplY3QudXVpZCxcblx0XHRcdFx0ZGlzdGFuY2U6IGxldmVsLmRpc3RhbmNlXG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWljaGFlbCBndWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBTa2VsZXRvbiggYm9uZXMsIGJvbmVJbnZlcnNlcyApIHtcblxuXHQvLyBjb3B5IHRoZSBib25lIGFycmF5XG5cblx0Ym9uZXMgPSBib25lcyB8fCBbXTtcblxuXHR0aGlzLmJvbmVzID0gYm9uZXMuc2xpY2UoIDAgKTtcblx0dGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCB0aGlzLmJvbmVzLmxlbmd0aCAqIDE2ICk7XG5cblx0Ly8gdXNlIHRoZSBzdXBwbGllZCBib25lIGludmVyc2VzIG9yIGNhbGN1bGF0ZSB0aGUgaW52ZXJzZXNcblxuXHRpZiAoIGJvbmVJbnZlcnNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIHRoaXMuYm9uZXMubGVuZ3RoID09PSBib25lSW52ZXJzZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IGJvbmVJbnZlcnNlcy5zbGljZSggMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b24gYm9uZUludmVyc2VzIGlzIHRoZSB3cm9uZyBsZW5ndGguJyApO1xuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU2tlbGV0b24ucHJvdG90eXBlLCB7XG5cblx0Y2FsY3VsYXRlSW52ZXJzZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0XHRpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHtcblxuXHRcdFx0XHRpbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIGludmVyc2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lLCBpLCBpbDtcblxuXHRcdC8vIHJlY292ZXIgdGhlIGJpbmQtdGltZSB3b3JsZCBtYXRyaWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ym9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lICkge1xuXG5cdFx0XHRcdGJvbmUubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggdGhpcy5ib25lSW52ZXJzZXNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBjb21wdXRlIHRoZSBsb2NhbCBtYXRyaWNlcywgcG9zaXRpb25zLCByb3RhdGlvbnMgYW5kIHNjYWxlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ym9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lICkge1xuXG5cdFx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguZ2V0SW52ZXJzZSggYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0XHRib25lLm1hdHJpeC5tdWx0aXBseSggYm9uZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5jb3B5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJvbmUubWF0cml4LmRlY29tcG9zZSggYm9uZS5wb3NpdGlvbiwgYm9uZS5xdWF0ZXJuaW9uLCBib25lLnNjYWxlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgaWRlbnRpdHlNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdFx0dmFyIGJvbmVzID0gdGhpcy5ib25lcztcblx0XHRcdHZhciBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlcztcblx0XHRcdHZhciBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlcztcblx0XHRcdHZhciBib25lVGV4dHVyZSA9IHRoaXMuYm9uZVRleHR1cmU7XG5cblx0XHRcdC8vIGZsYXR0ZW4gYm9uZSBtYXRyaWNlcyB0byBhcnJheVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBvcmlnaW5hbCB0cmFuc2Zvcm1cblxuXHRcdFx0XHR2YXIgbWF0cml4ID0gYm9uZXNbIGkgXSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBpZGVudGl0eU1hdHJpeDtcblxuXHRcdFx0XHRvZmZzZXRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCBib25lSW52ZXJzZXNbIGkgXSApO1xuXHRcdFx0XHRvZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJvbmVUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ym9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gQm9uZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JvbmUnO1xuXG59XG5cbkJvbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9uZSxcblxuXHRpc0JvbmU6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XG5cblx0dGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7XG5cdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHZhciBib25lcyA9IHRoaXMuaW5pdEJvbmVzKCk7XG5cdHZhciBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbiggYm9uZXMgKTtcblxuXHR0aGlzLmJpbmQoIHNrZWxldG9uLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0dGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpO1xuXG59XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsXG5cblx0aXNTa2lubmVkTWVzaDogdHJ1ZSxcblxuXHRpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lcyA9IFtdLCBib25lLCBnYm9uZTtcblx0XHR2YXIgaSwgaWw7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBmaXJzdCwgY3JlYXRlIGFycmF5IG9mICdCb25lJyBvYmplY3RzIGZyb20gZ2VvbWV0cnkgZGF0YVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdC8vIGNyZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdFxuXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXHRcdFx0XHRib25lcy5wdXNoKCBib25lICk7XG5cblx0XHRcdFx0Ly8gYXBwbHkgdmFsdWVzXG5cblx0XHRcdFx0Ym9uZS5uYW1lID0gZ2JvbmUubmFtZTtcblx0XHRcdFx0Ym9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApO1xuXHRcdFx0XHRib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7XG5cdFx0XHRcdGlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2JvbmUuc2NsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2Vjb25kLCBjcmVhdGUgYm9uZSBoaWVyYXJjaHlcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeVxuXG5cdFx0XHRcdFx0Ym9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBtZXNoXG5cblx0XHRcdFx0XHR0aGlzLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guXG5cdFx0Ly8gbGV0J3MgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzXG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYm9uZXM7XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xuXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdH1cblxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBiaW5kTWF0cml4ICk7XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2NhbGUsIGk7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHN3Lmxlbmd0aE1hbmhhdHRhbigpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0c3cubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdFx0dmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTtcblx0XHRcdFx0dmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdFx0dmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHZlYy5sZW5ndGhNYW5oYXR0YW4oKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmVjLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICogIGxpbmVjYXA6IFwicm91bmRcIixcbiAqICBsaW5lam9pbjogXCJyb3VuZFwiXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cdHRoaXMubGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsLCBtb2RlICkge1xuXG5cdGlmICggbW9kZSA9PT0gMSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lLFxuXG5cdGlzTGluZTogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgcHJlY2lzaW9uID0gcmF5Y2FzdGVyLmxpbmVQcmVjaXNpb247XG5cdFx0XHR2YXIgcHJlY2lzaW9uU3EgPSBwcmVjaXNpb24gKiBwcmVjaXNpb247XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdHZhciB2U3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIHZFbmQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyU2VnbWVudCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJSYXkgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIHN0ZXAgPSAodGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzKSA/IDIgOiAxO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aCAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhID0gaW5kaWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0dmFyIGIgPSBpbmRpY2VzWyBpICsgMSBdO1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCBiICogMyApO1xuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcblx0XHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMyAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHRcdHZTdGFydC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKTtcblx0XHRcdFx0XHRcdHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICsgMyApO1xuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcblx0XHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIG5iVmVydGljZXMgPSB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbmJWZXJ0aWNlcyAtIDE7IGkgKz0gc3RlcCApIHtcblxuXHRcdFx0XHRcdHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdmVydGljZXNbIGkgXSwgdmVydGljZXNbIGkgKyAxIF0sIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cblxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJztcblxufVxuXG5MaW5lU2VnbWVudHMucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lU2VnbWVudHMsXG5cblx0aXNMaW5lU2VnbWVudHM6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXJcbiAqL1xuXG5mdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVMb29wLFxuXG5cdGlzTGluZUxvb3A6IHRydWUsXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50cyc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IFBvaW50c01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cblBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludHMsXG5cblx0aXNQb2ludHM6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHRoaXM7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRcdHZhciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmdW5jdGlvbiB0ZXN0UG9pbnQoIHBvaW50LCBpbmRleCApIHtcblxuXHRcdFx0XHR2YXIgcmF5UG9pbnREaXN0YW5jZVNxID0gcmF5LmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xuXG5cdFx0XHRcdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcblxuXHRcdFx0XHRcdHZhciBpbnRlcnNlY3RQb2ludCA9IHJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCApO1xuXHRcdFx0XHRcdGludGVyc2VjdFBvaW50LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlVG9SYXk6IE1hdGguc3FydCggcmF5UG9pbnREaXN0YW5jZVNxICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcblx0XHRcdFx0XHRcdGluZGV4OiBpbmRleCxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGEgPSBpbmRpY2VzWyBpIF07XG5cblx0XHRcdFx0XHRcdHBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0UG9pbnQoIHBvc2l0aW9uLCBhICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JvdXAoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdHcm91cCc7XG5cbn1cblxuR3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogR3JvdXBcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVmlkZW9UZXh0dXJlKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHVwZGF0ZSApO1xuXG5cdFx0aWYgKCB2aWRlby5yZWFkeVN0YXRlID49IHZpZGVvLkhBVkVfQ1VSUkVOVF9EQVRBICkge1xuXG5cdFx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG5cdHVwZGF0ZSgpO1xuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuVmlkZW9UZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZpZGVvVGV4dHVyZTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIENvbXByZXNzZWRUZXh0dXJlKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblx0dGhpcy5taXBtYXBzID0gbWlwbWFwcztcblxuXHQvLyBubyBmbGlwcGluZyBmb3IgY3ViZSB0ZXh0dXJlc1xuXHQvLyAoYWxzbyBmbGlwcGluZyBkb2Vzbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKVxuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHQvLyBjYW4ndCBnZW5lcmF0ZSBtaXBtYXBzIGZvciBjb21wcmVzc2VkIHRleHR1cmVzXG5cdC8vIG1pcHMgbXVzdCBiZSBlbWJlZGRlZCBpbiBERFMgZmlsZXNcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb21wcmVzc2VkVGV4dHVyZTtcblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTtcblxuLyoqXG4gKiBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2xcbiAqIEBhdXRob3IgYXRpeCAvIGFydGh1cnNpbGJlci5kZVxuICovXG5cbmZ1bmN0aW9uIERlcHRoVGV4dHVyZSggd2lkdGgsIGhlaWdodCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZm9ybWF0ICkge1xuXG5cdGZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogRGVwdGhGb3JtYXQ7XG5cblx0aWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1hdCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQnIClcblxuXHR9XG5cblx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzXHQ9IGZhbHNlO1xuXG59XG5cbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERlcHRoVGV4dHVyZTtcbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIFdpcmVmcmFtZUdlb21ldHJ5KCBnZW9tZXRyeSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1dpcmVmcmFtZUdlb21ldHJ5JztcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIGosIGwsIG8sIG9sO1xuXHR2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlLCBlZGdlMSwgZWRnZTI7XG5cdHZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblx0dmFyIHZlcnRleDtcblxuXHQvLyBkaWZmZXJlbnQgbG9naWMgZm9yIEdlb21ldHJ5IGFuZCBCdWZmZXJHZW9tZXRyeVxuXG5cdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdC8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVkZ2VzIHdpdGhvdXQgZHVwbGljYXRlc1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRcdGVkZ2UyID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07XG5cdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdFx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDEgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0dmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgyIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdHZhciBwb3NpdGlvbiwgaW5kaWNlcywgZ3JvdXBzO1xuXHRcdHZhciBncm91cCwgc3RhcnQsIGNvdW50O1xuXHRcdHZhciBpbmRleDEsIGluZGV4MjtcblxuXHRcdHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHQvLyBpbmRleGVkIEJ1ZmZlckdlb21ldHJ5XG5cblx0XHRcdHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdGluZGljZXMgPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdGdyb3VwcyA9IFsgeyBzdGFydDogMCwgY291bnQ6IGluZGljZXMuY291bnQsIG1hdGVyaWFsSW5kZXg6IDAgfSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHRcdGZvciAoIG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7IG8gPCBvbDsgKysgbyApIHtcblxuXHRcdFx0XHRncm91cCA9IGdyb3Vwc1sgbyBdO1xuXG5cdFx0XHRcdHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggaSA9IHN0YXJ0LCBsID0gKCBzdGFydCArIGNvdW50ICk7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGVkZ2UxID0gaW5kaWNlcy5nZXRYKCBpICsgaiApO1xuXHRcdFx0XHRcdFx0ZWRnZTIgPSBpbmRpY2VzLmdldFgoIGkgKyAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlc1xuXHRcdFx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdFx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdFx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdFx0ZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgxICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgyICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9ICggcG9zaXRpb24uY291bnQgLyAzICk7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdC8vIHRocmVlIGVkZ2VzIHBlciB0cmlhbmdsZSwgYW4gZWRnZSBpcyByZXByZXNlbnRlZCBhcyAoaW5kZXgxLCBpbmRleDIpXG5cdFx0XHRcdFx0Ly8gZS5nLiB0aGUgZmlyc3QgdHJpYW5nbGUgaGFzIHRoZSBmb2xsb3dpbmcgZWRnZXM6ICgwLDEpLCgxLDIpLCgyLDApXG5cblx0XHRcdFx0XHRpbmRleDEgPSAzICogaSArIGo7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDEgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0XHRpbmRleDIgPSAzICogaSArICggKCBqICsgMSApICUgMyApO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgyICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbldpcmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2lyZWZyYW1lR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogUGFyYW1ldHJpYyBTdXJmYWNlcyBHZW9tZXRyeVxuICogYmFzZWQgb24gdGhlIGJyaWxsaWFudCBhcnRpY2xlIGJ5IEBwcmlkZW91dCBodHRwOi8vcHJpZGVvdXQubmV0L2Jsb2cvP3A9NDRcbiAqL1xuXG4vLyBQYXJhbWV0cmljR2VvbWV0cnlcblxuZnVuY3Rpb24gUGFyYW1ldHJpY0dlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGZ1bmM6IGZ1bmMsXG5cdFx0c2xpY2VzOiBzbGljZXMsXG5cdFx0c3RhY2tzOiBzdGFja3Ncblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5QYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0dlb21ldHJ5O1xuXG4vLyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGZ1bmM6IGZ1bmMsXG5cdFx0c2xpY2VzOiBzbGljZXMsXG5cdFx0c3RhY2tzOiBzdGFja3Ncblx0fTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHR2YXIgRVBTID0gMC4wMDAwMTtcblxuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgcDAgPSBuZXcgVmVjdG9yMygpLCBwMSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBwdSA9IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaSwgajtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0dmFyIHNsaWNlQ291bnQgPSBzbGljZXMgKyAxO1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHN0YWNrczsgaSArKyApIHtcblxuXHRcdHZhciB2ID0gaSAvIHN0YWNrcztcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBqIC8gc2xpY2VzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0cDAgPSBmdW5jKCB1LCB2LCBwMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggcDAueCwgcDAueSwgcDAueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Ly8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0b3JzIHZpYSBmaW5pdGUgZGlmZmVyZW5jZXNcblxuXHRcdFx0aWYgKCB1IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0cDEgPSBmdW5jKCB1IC0gRVBTLCB2LCBwMSApO1xuXHRcdFx0XHRwdS5zdWJWZWN0b3JzKCBwMCwgcDEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRwMSA9IGZ1bmMoIHUgKyBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdiAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdHAxID0gZnVuYyggdSwgdiAtIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cDEgPSBmdW5jKCB1LCB2ICsgRVBTLCBwMSApO1xuXHRcdFx0XHRwdi5zdWJWZWN0b3JzKCBwMSwgcDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjcm9zcyBwcm9kdWN0IG9mIHRhbmdlbnQgdmVjdG9ycyByZXR1cm5zIHN1cmZhY2Ugbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIHB1LCBwdiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCB1LCB2ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8IHN0YWNrczsgaSArKyApIHtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGkgKiBzbGljZUNvdW50ICsgajtcblx0XHRcdHZhciBiID0gaSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBjID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0dmFyIGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajtcblxuXHRcdFx0Ly8gZmFjZXMgb25lIGFuZCB0d29cblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBjbG9ja3dvcmtnZWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL2Nsb2Nrd29ya2dlZWtcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBQb2x5aGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gUG9seWhlZHJvbkdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR2ZXJ0aWNlczogdmVydGljZXMsXG5cdFx0aW5kaWNlczogaW5kaWNlcyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Qb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR2ZXJ0aWNlczogdmVydGljZXMsXG5cdFx0aW5kaWNlczogaW5kaWNlcyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRkZXRhaWwgPSBkZXRhaWwgfHwgMDtcblxuXHQvLyBkZWZhdWx0IGJ1ZmZlciBkYXRhXG5cblx0dmFyIHZlcnRleEJ1ZmZlciA9IFtdO1xuXHR2YXIgdXZCdWZmZXIgPSBbXTtcblxuXHQvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhXG5cblx0c3ViZGl2aWRlKCBkZXRhaWwgKTtcblxuXHQvLyBhbGwgdmVydGljZXMgc2hvdWxkIGxpZSBvbiBhIGNvbmNlcHR1YWwgc3BoZXJlIHdpdGggYSBnaXZlbiByYWRpdXNcblxuXHRhcHBwbHlSYWRpdXMoIHJhZGl1cyApO1xuXG5cdC8vIGZpbmFsbHksIGNyZWF0ZSB0aGUgdXYgZGF0YVxuXG5cdGdlbmVyYXRlVVZzKCk7XG5cblx0Ly8gYnVpbGQgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlciwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkJ1ZmZlciwgMiApICk7XG5cdHRoaXMubm9ybWFsaXplTm9ybWFscygpO1xuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc29uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cblxuXHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcblxuXHRcdHZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApO1xuXG5cdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cblxuXHRcdHZhciB2ID0gW107XG5cblx0XHR2YXIgaSwgajtcblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHR2WyBpIF0gPSBbXTtcblxuXHRcdFx0dmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHR2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblxuXHRcdFx0dmFyIHJvd3MgPSBjb2xzIC0gaTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xuXG5cdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcHBseVJhZGl1cyggcmFkaXVzICkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXhcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dmFyIHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdH1cblxuXHRcdGNvcnJlY3RVVnMoKTtcblxuXHRcdGNvcnJlY3RTZWFtKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkge1xuXG5cdFx0Ly8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0Ly8gdXYgZGF0YSBvZiBhIHNpbmdsZSBmYWNlXG5cblx0XHRcdHZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07XG5cdFx0XHR2YXIgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTtcblxuXHRcdFx0dmFyIG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHR2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTtcblxuXHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7XG5cblx0XHRcdFx0aWYgKCB4MCA8IDAuMiApIHV2QnVmZmVyWyBpICsgMCBdICs9IDE7XG5cdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IGluZGV4ICogMztcblxuXHRcdHZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTtcblx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdGEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7XG5cdFx0XHRiLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApO1xuXHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0dXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7XG5cdFx0XHR1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTtcblx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRjZW50cm9pZC5jb3B5KCBhICkuYWRkKCBiICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7XG5cblx0XHRcdHZhciBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRjb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0aWYgKCAoIGF6aW11dGggPCAwICkgJiYgKCB1di54ID09PSAxICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS5cblxuXHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTtcblxuXHR9XG5cblxuXHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0ZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCAtIHZlY3Rvci55LCBNYXRoLnNxcnQoICggdmVjdG9yLnggKiB2ZWN0b3IueCApICsgKCB2ZWN0b3IueiAqIHZlY3Rvci56ICkgKSApO1xuXG5cdH1cblxufVxuXG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVGV0cmFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAgMSwgIDEsICAgLSAxLCAtIDEsICAxLCAgIC0gMSwgIDEsIC0gMSwgICAgMSwgLSAxLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQyLCAgMSwgIDAsICAgIDAsICAzLCAgMiwgICAgMSwgIDMsICAwLCAgICAyLCAgMywgIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gT2N0YWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAwLCAwLCAgIC0gMSwgMCwgMCwgICAgMCwgMSwgMCwgICAgMCwgLSAxLCAwLCAgICAwLCAwLCAxLCAgICAwLCAwLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQwLCAyLCA0LCAgICAwLCA0LCAzLCAgICAwLCAzLCA1LCAgICAwLCA1LCAyLCAgICAxLCAyLCA1LCAgICAxLCA1LCAzLCAgICAxLCAzLCA0LCAgICAxLCA0LCAyXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gSWNvc2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuIFx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25HZW9tZXRyeTtcblxuLy8gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQtIDEsICB0LCAgMCwgICAgMSwgIHQsICAwLCAgIC0gMSwgLSB0LCAgMCwgICAgMSwgLSB0LCAgMCxcblx0XHQgMCwgLSAxLCAgdCwgICAgMCwgIDEsICB0LCAgICAwLCAtIDEsIC0gdCwgICAgMCwgIDEsIC0gdCxcblx0XHQgdCwgIDAsIC0gMSwgICAgdCwgIDAsICAxLCAgIC0gdCwgIDAsIC0gMSwgICAtIHQsICAwLCAgMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdCAwLCAxMSwgIDUsICAgIDAsICA1LCAgMSwgICAgMCwgIDEsICA3LCAgICAwLCAgNywgMTAsICAgIDAsIDEwLCAxMSxcblx0XHQgMSwgIDUsICA5LCAgICA1LCAxMSwgIDQsICAgMTEsIDEwLCAgMiwgICAxMCwgIDcsICA2LCAgICA3LCAgMSwgIDgsXG5cdFx0IDMsICA5LCAgNCwgICAgMywgIDQsICAyLCAgICAzLCAgMiwgIDYsICAgIDMsICA2LCAgOCwgICAgMywgIDgsICA5LFxuXHRcdCA0LCAgOSwgIDUsICAgIDIsICA0LCAxMSwgICAgNiwgIDIsIDEwLCAgICA4LCAgNiwgIDcsICAgIDksICA4LCAgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBBYmUgUGF6b3MgLyBodHRwczovL2hhbW9pZC5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gRG9kZWNhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gRG9kZWNhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25HZW9tZXRyeTtcblxuLy8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cdHZhciByID0gMSAvIHQ7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXG5cdFx0Ly8gKMKxMSwgwrExLCDCsTEpXG5cdFx0LSAxLCAtIDEsIC0gMSwgICAgLSAxLCAtIDEsICAxLFxuXHRcdC0gMSwgIDEsIC0gMSwgICAgLSAxLCAgMSwgIDEsXG5cdFx0ICAxLCAtIDEsIC0gMSwgICAgIDEsIC0gMSwgIDEsXG5cdFx0ICAxLCAgMSwgLSAxLCAgICAgMSwgIDEsICAxLFxuXG5cdFx0Ly8gKDAsIMKxMS/PhiwgwrHPhilcblx0XHQgMCwgLSByLCAtIHQsICAgICAwLCAtIHIsICB0LFxuXHRcdCAwLCAgciwgLSB0LCAgICAgMCwgIHIsICB0LFxuXG5cdFx0Ly8gKMKxMS/PhiwgwrHPhiwgMClcblx0XHQtIHIsIC0gdCwgIDAsICAgIC0gciwgIHQsICAwLFxuXHRcdCByLCAtIHQsICAwLCAgICAgciwgIHQsICAwLFxuXG5cdFx0Ly8gKMKxz4YsIDAsIMKxMS/Philcblx0XHQtIHQsICAwLCAtIHIsICAgICB0LCAgMCwgLSByLFxuXHRcdC0gdCwgIDAsICByLCAgICAgdCwgIDAsICByXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0IDMsIDExLCAgNywgICAgICAzLCAgNywgMTUsICAgICAgMywgMTUsIDEzLFxuXHRcdCA3LCAxOSwgMTcsICAgICAgNywgMTcsICA2LCAgICAgIDcsICA2LCAxNSxcblx0XHQxNywgIDQsICA4LCAgICAgMTcsICA4LCAxMCwgICAgIDE3LCAxMCwgIDYsXG5cdFx0IDgsICAwLCAxNiwgICAgICA4LCAxNiwgIDIsICAgICAgOCwgIDIsIDEwLFxuXHRcdCAwLCAxMiwgIDEsICAgICAgMCwgIDEsIDE4LCAgICAgIDAsIDE4LCAxNixcblx0XHQgNiwgMTAsICAyLCAgICAgIDYsICAyLCAxMywgICAgICA2LCAxMywgMTUsXG5cdFx0IDIsIDE2LCAxOCwgICAgICAyLCAxOCwgIDMsICAgICAgMiwgIDMsIDEzLFxuXHRcdDE4LCAgMSwgIDksICAgICAxOCwgIDksIDExLCAgICAgMTgsIDExLCAgMyxcblx0XHQgNCwgMTQsIDEyLCAgICAgIDQsIDEyLCAgMCwgICAgICA0LCAgMCwgIDgsXG5cdFx0MTEsICA5LCAgNSwgICAgIDExLCAgNSwgMTksICAgICAxMSwgMTksICA3LFxuXHRcdDE5LCAgNSwgMTQsICAgICAxOSwgMTQsICA0LCAgICAgMTksICA0LCAxNyxcblx0XHQgMSwgMTIsIDE0LCAgICAgIDEsIDE0LCAgNSwgICAgICAxLCAgNSwgIDlcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIG1pbmluZ29sZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGRcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqL1xuXG4vLyBUdWJlR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCwgdGFwZXIgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdGlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0dmFyIGJ1ZmZlckdlb21ldHJ5ID0gbmV3IFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5LmJpbm9ybWFscztcblxuXHQvLyBjcmVhdGUgZ2VvbWV0cnlcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTtcblxuLy8gVHViZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdHR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDtcblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHJhZGlhbFNlZ21lbnRzID0gcmFkaWFsU2VnbWVudHMgfHwgODtcblx0Y2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXG5cdHZhciBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgaSwgajtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXG5cdC8vIGNyZWF0ZSBidWZmZXIgZGF0YVxuXG5cdGdlbmVyYXRlQnVmZmVyRGF0YSgpO1xuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUJ1ZmZlckRhdGEoKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Z2VuZXJhdGVTZWdtZW50KCBpICk7XG5cblx0XHR9XG5cblx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgbm90IGNsb3NlZCwgZ2VuZXJhdGUgdGhlIGxhc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzXG5cdFx0Ly8gYXQgdGhlIHJlZ3VsYXIgcG9zaXRpb24gb24gdGhlIGdpdmVuIHBhdGhcblx0XHQvL1xuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIGR1cGxpY2F0ZSB0aGUgZmlyc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzICh1dnMgd2lsbCBkaWZmZXIpXG5cblx0XHRnZW5lcmF0ZVNlZ21lbnQoICggY2xvc2VkID09PSBmYWxzZSApID8gdHVidWxhclNlZ21lbnRzIDogMCApO1xuXG5cdFx0Ly8gdXZzIGFyZSBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi5cblx0XHQvLyB0aGlzIG1ha2VzIGl0IGVhc3kgY29tcHV0ZSBjb3JyZWN0IHZhbHVlcyBmb3IgY2xvc2VkIGdlb21ldHJpZXNcblxuXHRcdGdlbmVyYXRlVVZzKCk7XG5cblx0XHQvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlc1xuXG5cdFx0Z2VuZXJhdGVJbmRpY2VzKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHtcblxuXHRcdC8vIHdlIHVzZSBnZXRQb2ludEF0IHRvIHNhbXBsZSBldmVubHkgZGlzdHJpYnV0ZWQgcG9pbnRzIGZyb20gdGhlIGdpdmVuIHBhdGhcblxuXHRcdHZhciBQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cblx0XHQvLyByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIG5vcm1hbCBhbmQgYmlub3JtYWxcblxuXHRcdHZhciBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTtcblx0XHR2YXIgQiA9IGZyYW1lcy5iaW5vcm1hbHNbIGkgXTtcblxuXHRcdC8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZlcnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0dmFyIHNpbiA9ICAgTWF0aC5zaW4oIHYgKTtcblx0XHRcdHZhciBjb3MgPSAtIE1hdGguY29zKCB2ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwueCA9ICggY29zICogTi54ICsgc2luICogQi54ICk7XG5cdFx0XHRub3JtYWwueSA9ICggY29zICogTi55ICsgc2luICogQi55ICk7XG5cdFx0XHRub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7XG5cdFx0XHRub3JtYWwubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSBQLnggKyByYWRpdXMgKiBub3JtYWwueDtcblx0XHRcdHZlcnRleC55ID0gUC55ICsgcmFkaXVzICogbm9ybWFsLnk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56O1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHtcblxuXHRcdGZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0XHR2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblx0XHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdFx0dXYueCA9IGkgLyB0dWJ1bGFyU2VnbWVudHM7XG5cdFx0XHRcdHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5UdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIGJhc2VkIG9uIGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wcXRvcnVzL1xuICovXG5cbi8vIFRvcnVzS25vdEdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzS25vdEdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEsIGhlaWdodFNjYWxlICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90R2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRwOiBwLFxuXHRcdHE6IHFcblx0fTtcblxuXHRpZiAoIGhlaWdodFNjYWxlICE9PSB1bmRlZmluZWQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuJyApO1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNLbm90R2VvbWV0cnk7XG5cbi8vIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxMDA7XG5cdHR1YmUgPSB0dWJlIHx8IDQwO1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2NDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHAgPSBwIHx8IDI7XG5cdHEgPSBxIHx8IDM7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgUDEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgUDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBCID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFQgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgTiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcblxuXHRcdC8vIHRoZSByYWRpYW4gXCJ1XCIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ2VtZW50XG5cblx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XG5cblx0XHQvLyBub3cgd2UgY2FsY3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC5cblx0XHQvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBcImNvb3JkaW5hdGUgc3BhY2VcIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zXG5cblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXNcblxuXHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Ti5hZGRWZWN0b3JzKCBQMiwgUDEgKTtcblx0XHRCLmNyb3NzVmVjdG9ycyggVCwgTiApO1xuXHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XG5cblx0XHQvLyBub3JtYWxpemUgQiwgTi4gVCBjYW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0XG5cblx0XHRCLm5vcm1hbGl6ZSgpO1xuXHRcdE4ubm9ybWFsaXplKCk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuXG5cdFx0XHQvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxhbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS5cblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblx0XHRcdHZhciBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XG5cdFx0XHR2YXIgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxuXHRcdFx0Ly8gZmlyc3Qgd2Ugb3JpZW50IHRoZSBleHRydXNpb24gd2l0aCBvdXIgYmFzaXMgdmVjdG9zLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmVcblxuXHRcdFx0dmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcblx0XHRcdHZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcblxuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZVxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBwb3NpdGlvbiApIHtcblxuXHRcdHZhciBjdSA9IE1hdGguY29zKCB1ICk7XG5cdFx0dmFyIHN1ID0gTWF0aC5zaW4oIHUgKTtcblx0XHR2YXIgcXVPdmVyUCA9IHEgLyBwICogdTtcblx0XHR2YXIgY3MgPSBNYXRoLmNvcyggcXVPdmVyUCApO1xuXG5cdFx0cG9zaXRpb24ueCA9IHJhZGl1cyAqICggMiArIGNzICkgKiAwLjUgKiBjdTtcblx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xuXHRcdHBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41O1xuXG5cdH1cblxufVxuXG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBUb3J1c0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRvcnVzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzR2VvbWV0cnk7XG5cbi8vIFRvcnVzQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0YXJjOiBhcmNcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTAwO1xuXHR0dWJlID0gdHViZSB8fCA0MDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7XG5cdGFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYztcblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRjZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxO1xuXHRcdFx0dmFyIGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxO1xuXHRcdFx0dmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHR2YXIgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG52YXIgU2hhcGVVdGlscyA9IHtcblxuXHQvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91ciBwb2x5Z29uXG5cblx0YXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkge1xuXG5cdFx0dmFyIG4gPSBjb250b3VyLmxlbmd0aDtcblx0XHR2YXIgYSA9IDAuMDtcblxuXHRcdGZvciAoIHZhciBwID0gbiAtIDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdGEgKz0gY29udG91clsgcCBdLnggKiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYSAqIDAuNTtcblxuXHR9LFxuXG5cdHRyaWFuZ3VsYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgY29kZSBpcyBhIHF1aWNrIHBvcnQgb2YgY29kZSB3cml0dGVuIGluIEMrKyB3aGljaCB3YXMgc3VibWl0dGVkIHRvXG5cdFx0ICogZmxpcGNvZGUuY29tIGJ5IEpvaG4gVy4gUmF0Y2xpZmYgIC8vIEp1bHkgMjIsIDIwMDBcblx0XHQgKiBTZWUgb3JpZ2luYWwgY29kZSBhbmQgbW9yZSBpbmZvcm1hdGlvbiBoZXJlOlxuXHRcdCAqIGh0dHA6Ly93d3cuZmxpcGNvZGUuY29tL2FyY2hpdmVzL0VmZmljaWVudF9Qb2x5Z29uX1RyaWFuZ3VsYXRpb24uc2h0bWxcblx0XHQgKlxuXHRcdCAqIHBvcnRlZCB0byBhY3Rpb25zY3JpcHQgYnkgWmV2YW4gUm9zc2VyXG5cdFx0ICogd3d3LmFjdGlvbnNuaXBwZXQuY29tXG5cdFx0ICpcblx0XHQgKiBwb3J0ZWQgdG8gamF2YXNjcmlwdCBieSBKb3NodWEgS29vXG5cdFx0ICogaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuXHRcdCAqXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBzbmlwKCBjb250b3VyLCB1LCB2LCB3LCBuLCB2ZXJ0cyApIHtcblxuXHRcdFx0dmFyIHA7XG5cdFx0XHR2YXIgYXgsIGF5LCBieCwgYnk7XG5cdFx0XHR2YXIgY3gsIGN5LCBweCwgcHk7XG5cblx0XHRcdGF4ID0gY29udG91clsgdmVydHNbIHUgXSBdLng7XG5cdFx0XHRheSA9IGNvbnRvdXJbIHZlcnRzWyB1IF0gXS55O1xuXG5cdFx0XHRieCA9IGNvbnRvdXJbIHZlcnRzWyB2IF0gXS54O1xuXHRcdFx0YnkgPSBjb250b3VyWyB2ZXJ0c1sgdiBdIF0ueTtcblxuXHRcdFx0Y3ggPSBjb250b3VyWyB2ZXJ0c1sgdyBdIF0ueDtcblx0XHRcdGN5ID0gY29udG91clsgdmVydHNbIHcgXSBdLnk7XG5cblx0XHRcdGlmICggKCBieCAtIGF4ICkgKiAoIGN5IC0gYXkgKSAtICggYnkgLSBheSApICogKCBjeCAtIGF4ICkgPD0gMCApIHJldHVybiBmYWxzZTtcblxuXHRcdFx0dmFyIGFYLCBhWSwgYlgsIGJZLCBjWCwgY1k7XG5cdFx0XHR2YXIgYXB4LCBhcHksIGJweCwgYnB5LCBjcHgsIGNweTtcblx0XHRcdHZhciBjQ1JPU1NhcCwgYkNST1NTY3AsIGFDUk9TU2JwO1xuXG5cdFx0XHRhWCA9IGN4IC0gYng7ICBhWSA9IGN5IC0gYnk7XG5cdFx0XHRiWCA9IGF4IC0gY3g7ICBiWSA9IGF5IC0gY3k7XG5cdFx0XHRjWCA9IGJ4IC0gYXg7ICBjWSA9IGJ5IC0gYXk7XG5cblx0XHRcdGZvciAoIHAgPSAwOyBwIDwgbjsgcCArKyApIHtcblxuXHRcdFx0XHRweCA9IGNvbnRvdXJbIHZlcnRzWyBwIF0gXS54O1xuXHRcdFx0XHRweSA9IGNvbnRvdXJbIHZlcnRzWyBwIF0gXS55O1xuXG5cdFx0XHRcdGlmICggKCAoIHB4ID09PSBheCApICYmICggcHkgPT09IGF5ICkgKSB8fFxuXHRcdFx0XHRcdCAoICggcHggPT09IGJ4ICkgJiYgKCBweSA9PT0gYnkgKSApIHx8XG5cdFx0XHRcdFx0ICggKCBweCA9PT0gY3ggKSAmJiAoIHB5ID09PSBjeSApICkgKVx0Y29udGludWU7XG5cblx0XHRcdFx0YXB4ID0gcHggLSBheDsgIGFweSA9IHB5IC0gYXk7XG5cdFx0XHRcdGJweCA9IHB4IC0gYng7ICBicHkgPSBweSAtIGJ5O1xuXHRcdFx0XHRjcHggPSBweCAtIGN4OyAgY3B5ID0gcHkgLSBjeTtcblxuXHRcdFx0XHQvLyBzZWUgaWYgcCBpcyBpbnNpZGUgdHJpYW5nbGUgYWJjXG5cblx0XHRcdFx0YUNST1NTYnAgPSBhWCAqIGJweSAtIGFZICogYnB4O1xuXHRcdFx0XHRjQ1JPU1NhcCA9IGNYICogYXB5IC0gY1kgKiBhcHg7XG5cdFx0XHRcdGJDUk9TU2NwID0gYlggKiBjcHkgLSBiWSAqIGNweDtcblxuXHRcdFx0XHRpZiAoICggYUNST1NTYnAgPj0gLSBOdW1iZXIuRVBTSUxPTiApICYmICggYkNST1NTY3AgPj0gLSBOdW1iZXIuRVBTSUxPTiApICYmICggY0NST1NTYXAgPj0gLSBOdW1iZXIuRVBTSUxPTiApICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdGFrZXMgaW4gYW4gY29udG91ciBhcnJheSBhbmQgcmV0dXJuc1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyaWFuZ3VsYXRlKCBjb250b3VyLCBpbmRpY2VzICkge1xuXG5cdFx0XHR2YXIgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIG4gPCAzICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciByZXN1bHQgPSBbXSxcblx0XHRcdFx0dmVydHMgPSBbXSxcblx0XHRcdFx0dmVydEluZGljZXMgPSBbXTtcblxuXHRcdFx0Lyogd2Ugd2FudCBhIGNvdW50ZXItY2xvY2t3aXNlIHBvbHlnb24gaW4gdmVydHMgKi9cblxuXHRcdFx0dmFyIHUsIHYsIHc7XG5cblx0XHRcdGlmICggU2hhcGVVdGlscy5hcmVhKCBjb250b3VyICkgPiAwLjAgKSB7XG5cblx0XHRcdFx0Zm9yICggdiA9IDA7IHYgPCBuOyB2ICsrICkgdmVydHNbIHYgXSA9IHY7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdiA9IDA7IHYgPCBuOyB2ICsrICkgdmVydHNbIHYgXSA9ICggbiAtIDEgKSAtIHY7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG52ID0gbjtcblxuXHRcdFx0LyogIHJlbW92ZSBudiAtIDIgdmVydGljZXMsIGNyZWF0aW5nIDEgdHJpYW5nbGUgZXZlcnkgdGltZSAqL1xuXG5cdFx0XHR2YXIgY291bnQgPSAyICogbnY7ICAgLyogZXJyb3IgZGV0ZWN0aW9uICovXG5cblx0XHRcdGZvciAoIHYgPSBudiAtIDE7IG52ID4gMjsgKSB7XG5cblx0XHRcdFx0LyogaWYgd2UgbG9vcCwgaXQgaXMgcHJvYmFibHkgYSBub24tc2ltcGxlIHBvbHlnb24gKi9cblxuXHRcdFx0XHRpZiAoICggY291bnQgLS0gKSA8PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8qKiBUcmlhbmd1bGF0ZTogRVJST1IgLSBwcm9iYWJsZSBiYWQgcG9seWdvbiFcblxuXHRcdFx0XHRcdC8vdGhyb3cgKCBcIldhcm5pbmcsIHVuYWJsZSB0byB0cmlhbmd1bGF0ZSBwb2x5Z29uIVwiICk7XG5cdFx0XHRcdFx0Ly9yZXR1cm4gbnVsbDtcblx0XHRcdFx0XHQvLyBTb21ldGltZXMgd2FybmluZyBpcyBmaW5lLCBlc3BlY2lhbGx5IHBvbHlnb25zIGFyZSB0cmlhbmd1bGF0ZWQgaW4gcmV2ZXJzZS5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZVV0aWxzOiBVbmFibGUgdG8gdHJpYW5ndWxhdGUgcG9seWdvbiEgaW4gdHJpYW5ndWxhdGUoKScgKTtcblxuXHRcdFx0XHRcdGlmICggaW5kaWNlcyApIHJldHVybiB2ZXJ0SW5kaWNlcztcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKiB0aHJlZSBjb25zZWN1dGl2ZSB2ZXJ0aWNlcyBpbiBjdXJyZW50IHBvbHlnb24sIDx1LHYsdz4gKi9cblxuXHRcdFx0XHR1ID0gdjsgXHQgXHRpZiAoIG52IDw9IHUgKSB1ID0gMDsgICAgIC8qIHByZXZpb3VzICovXG5cdFx0XHRcdHYgPSB1ICsgMTsgIGlmICggbnYgPD0gdiApIHYgPSAwOyAgICAgLyogbmV3IHYgICAgKi9cblx0XHRcdFx0dyA9IHYgKyAxOyAgaWYgKCBudiA8PSB3ICkgdyA9IDA7ICAgICAvKiBuZXh0ICAgICAqL1xuXG5cdFx0XHRcdGlmICggc25pcCggY29udG91ciwgdSwgdiwgdywgbnYsIHZlcnRzICkgKSB7XG5cblx0XHRcdFx0XHR2YXIgYSwgYiwgYywgcywgdDtcblxuXHRcdFx0XHRcdC8qIHRydWUgbmFtZXMgb2YgdGhlIHZlcnRpY2VzICovXG5cblx0XHRcdFx0XHRhID0gdmVydHNbIHUgXTtcblx0XHRcdFx0XHRiID0gdmVydHNbIHYgXTtcblx0XHRcdFx0XHRjID0gdmVydHNbIHcgXTtcblxuXHRcdFx0XHRcdC8qIG91dHB1dCBUcmlhbmdsZSAqL1xuXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goIFsgY29udG91clsgYSBdLFxuXHRcdFx0XHRcdFx0Y29udG91clsgYiBdLFxuXHRcdFx0XHRcdFx0Y29udG91clsgYyBdIF0gKTtcblxuXG5cdFx0XHRcdFx0dmVydEluZGljZXMucHVzaCggWyB2ZXJ0c1sgdSBdLCB2ZXJ0c1sgdiBdLCB2ZXJ0c1sgdyBdIF0gKTtcblxuXHRcdFx0XHRcdC8qIHJlbW92ZSB2IGZyb20gdGhlIHJlbWFpbmluZyBwb2x5Z29uICovXG5cblx0XHRcdFx0XHRmb3IgKCBzID0gdiwgdCA9IHYgKyAxOyB0IDwgbnY7IHMgKyssIHQgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZlcnRzWyBzIF0gPSB2ZXJ0c1sgdCBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bnYgLS07XG5cblx0XHRcdFx0XHQvKiByZXNldCBlcnJvciBkZXRlY3Rpb24gY291bnRlciAqL1xuXG5cdFx0XHRcdFx0Y291bnQgPSAyICogbnY7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaW5kaWNlcyApIHJldHVybiB2ZXJ0SW5kaWNlcztcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9XG5cblx0fSApKCksXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHJlbW92ZUR1cEVuZFB0cyhwb2ludHMpIHtcblxuXHRcdFx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdFx0cG9pbnRzLnBvcCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTtcblx0XHRob2xlcy5mb3JFYWNoKCByZW1vdmVEdXBFbmRQdHMgKTtcblxuXHRcdGZ1bmN0aW9uIHBvaW50X2luX3NlZ21lbnRfMkRfY29saW4oIGluU2VnUHQxLCBpblNlZ1B0MiwgaW5PdGhlclB0ICkge1xuXG5cdFx0XHQvLyBpbk90aGVyUHQgbmVlZHMgdG8gYmUgY29sbGluZWFyIHRvIHRoZSBpblNlZ21lbnRcblx0XHRcdGlmICggaW5TZWdQdDEueCAhPT0gaW5TZWdQdDIueCApIHtcblxuXHRcdFx0XHRpZiAoIGluU2VnUHQxLnggPCBpblNlZ1B0Mi54ICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuXHQoICggaW5TZWdQdDEueCA8PSBpbk90aGVyUHQueCApICYmICggaW5PdGhlclB0LnggPD0gaW5TZWdQdDIueCApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHJldHVyblx0KCAoIGluU2VnUHQyLnggPD0gaW5PdGhlclB0LnggKSAmJiAoIGluT3RoZXJQdC54IDw9IGluU2VnUHQxLnggKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIGluU2VnUHQxLnkgPCBpblNlZ1B0Mi55ICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuXHQoICggaW5TZWdQdDEueSA8PSBpbk90aGVyUHQueSApICYmICggaW5PdGhlclB0LnkgPD0gaW5TZWdQdDIueSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHJldHVyblx0KCAoIGluU2VnUHQyLnkgPD0gaW5PdGhlclB0LnkgKSAmJiAoIGluT3RoZXJQdC55IDw9IGluU2VnUHQxLnkgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaW50ZXJzZWN0X3NlZ21lbnRzXzJEKCBpblNlZzFQdDEsIGluU2VnMVB0MiwgaW5TZWcyUHQxLCBpblNlZzJQdDIsIGluRXhjbHVkZUFkamFjZW50U2VncyApIHtcblxuXHRcdFx0dmFyIHNlZzFkeCA9IGluU2VnMVB0Mi54IC0gaW5TZWcxUHQxLngsICAgc2VnMWR5ID0gaW5TZWcxUHQyLnkgLSBpblNlZzFQdDEueTtcblx0XHRcdHZhciBzZWcyZHggPSBpblNlZzJQdDIueCAtIGluU2VnMlB0MS54LCAgIHNlZzJkeSA9IGluU2VnMlB0Mi55IC0gaW5TZWcyUHQxLnk7XG5cblx0XHRcdHZhciBzZWcxc2VnMmR4ID0gaW5TZWcxUHQxLnggLSBpblNlZzJQdDEueDtcblx0XHRcdHZhciBzZWcxc2VnMmR5ID0gaW5TZWcxUHQxLnkgLSBpblNlZzJQdDEueTtcblxuXHRcdFx0dmFyIGxpbWl0XHRcdD0gc2VnMWR5ICogc2VnMmR4IC0gc2VnMWR4ICogc2VnMmR5O1xuXHRcdFx0dmFyIHBlcnBTZWcxXHQ9IHNlZzFkeSAqIHNlZzFzZWcyZHggLSBzZWcxZHggKiBzZWcxc2VnMmR5O1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBsaW1pdCApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0Ly8gbm90IHBhcmFsbGVsXG5cblx0XHRcdFx0dmFyIHBlcnBTZWcyO1xuXHRcdFx0XHRpZiAoIGxpbWl0ID4gMCApIHtcblxuXHRcdFx0XHRcdGlmICggKCBwZXJwU2VnMSA8IDAgKSB8fCAoIHBlcnBTZWcxID4gbGltaXQgKSApIFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdFx0cGVycFNlZzIgPSBzZWcyZHkgKiBzZWcxc2VnMmR4IC0gc2VnMmR4ICogc2VnMXNlZzJkeTtcblx0XHRcdFx0XHRpZiAoICggcGVycFNlZzIgPCAwICkgfHwgKCBwZXJwU2VnMiA+IGxpbWl0ICkgKSBcdFx0cmV0dXJuIFtdO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoICggcGVycFNlZzEgPiAwICkgfHwgKCBwZXJwU2VnMSA8IGxpbWl0ICkgKSBcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdHBlcnBTZWcyID0gc2VnMmR5ICogc2VnMXNlZzJkeCAtIHNlZzJkeCAqIHNlZzFzZWcyZHk7XG5cdFx0XHRcdFx0aWYgKCAoIHBlcnBTZWcyID4gMCApIHx8ICggcGVycFNlZzIgPCBsaW1pdCApICkgXHRcdHJldHVybiBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gaS5lLiB0byByZWR1Y2Ugcm91bmRpbmcgZXJyb3JzXG5cdFx0XHRcdC8vIGludGVyc2VjdGlvbiBhdCBlbmRwb2ludCBvZiBzZWdtZW50IzE/XG5cdFx0XHRcdGlmICggcGVycFNlZzIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRpZiAoICggaW5FeGNsdWRlQWRqYWNlbnRTZWdzICkgJiZcblx0XHRcdFx0XHRcdCAoICggcGVycFNlZzEgPT09IDAgKSB8fCAoIHBlcnBTZWcxID09PSBsaW1pdCApICkgKVx0XHRyZXR1cm4gW107XG5cdFx0XHRcdFx0cmV0dXJuIFsgaW5TZWcxUHQxIF07XG5cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIHBlcnBTZWcyID09PSBsaW1pdCApIHtcblxuXHRcdFx0XHRcdGlmICggKCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKSAmJlxuXHRcdFx0XHRcdFx0ICggKCBwZXJwU2VnMSA9PT0gMCApIHx8ICggcGVycFNlZzEgPT09IGxpbWl0ICkgKSApXHRcdHJldHVybiBbXTtcblx0XHRcdFx0XHRyZXR1cm4gWyBpblNlZzFQdDIgXTtcblxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGludGVyc2VjdGlvbiBhdCBlbmRwb2ludCBvZiBzZWdtZW50IzI/XG5cdFx0XHRcdGlmICggcGVycFNlZzEgPT09IDAgKVx0XHRyZXR1cm4gWyBpblNlZzJQdDEgXTtcblx0XHRcdFx0aWYgKCBwZXJwU2VnMSA9PT0gbGltaXQgKVx0cmV0dXJuIFsgaW5TZWcyUHQyIF07XG5cblx0XHRcdFx0Ly8gcmV0dXJuIHJlYWwgaW50ZXJzZWN0aW9uIHBvaW50XG5cdFx0XHRcdHZhciBmYWN0b3JTZWcxID0gcGVycFNlZzIgLyBsaW1pdDtcblx0XHRcdFx0cmV0dXJuXHRbIHsgeDogaW5TZWcxUHQxLnggKyBmYWN0b3JTZWcxICogc2VnMWR4LFxuXHRcdFx0XHRcdFx0XHR5OiBpblNlZzFQdDEueSArIGZhY3RvclNlZzEgKiBzZWcxZHkgfSBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxuXHRcdFx0XHRpZiAoICggcGVycFNlZzEgIT09IDAgKSB8fFxuXHRcdFx0XHRcdCAoIHNlZzJkeSAqIHNlZzFzZWcyZHggIT09IHNlZzJkeCAqIHNlZzFzZWcyZHkgKSApIFx0XHRcdHJldHVybiBbXTtcblxuXHRcdFx0XHQvLyB0aGV5IGFyZSBjb2xsaW5lYXIgb3IgZGVnZW5lcmF0ZVxuXHRcdFx0XHR2YXIgc2VnMVB0ID0gKCAoIHNlZzFkeCA9PT0gMCApICYmICggc2VnMWR5ID09PSAwICkgKTtcdC8vIHNlZ21lbnQxIGlzIGp1c3QgYSBwb2ludD9cblx0XHRcdFx0dmFyIHNlZzJQdCA9ICggKCBzZWcyZHggPT09IDAgKSAmJiAoIHNlZzJkeSA9PT0gMCApICk7XHQvLyBzZWdtZW50MiBpcyBqdXN0IGEgcG9pbnQ/XG5cdFx0XHRcdC8vIGJvdGggc2VnbWVudHMgYXJlIHBvaW50c1xuXHRcdFx0XHRpZiAoIHNlZzFQdCAmJiBzZWcyUHQgKSB7XG5cblx0XHRcdFx0XHRpZiAoICggaW5TZWcxUHQxLnggIT09IGluU2VnMlB0MS54ICkgfHxcblx0XHRcdFx0XHRcdCAoIGluU2VnMVB0MS55ICE9PSBpblNlZzJQdDEueSApIClcdFx0cmV0dXJuIFtdO1x0Ly8gdGhleSBhcmUgZGlzdGluY3QgIHBvaW50c1xuXHRcdFx0XHRcdHJldHVybiBbIGluU2VnMVB0MSBdOyAgICAgICAgICAgICAgICAgXHRcdFx0XHRcdFx0Ly8gdGhleSBhcmUgdGhlIHNhbWUgcG9pbnRcblxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHNlZ21lbnQjMSAgaXMgYSBzaW5nbGUgcG9pbnRcblx0XHRcdFx0aWYgKCBzZWcxUHQgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgcG9pbnRfaW5fc2VnbWVudF8yRF9jb2xpbiggaW5TZWcyUHQxLCBpblNlZzJQdDIsIGluU2VnMVB0MSApIClcdFx0cmV0dXJuIFtdO1x0XHQvLyBidXQgbm90IGluIHNlZ21lbnQjMlxuXHRcdFx0XHRcdHJldHVybiBbIGluU2VnMVB0MSBdO1xuXG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gc2VnbWVudCMyICBpcyBhIHNpbmdsZSBwb2ludFxuXHRcdFx0XHRpZiAoIHNlZzJQdCApIHtcblxuXHRcdFx0XHRcdGlmICggISBwb2ludF9pbl9zZWdtZW50XzJEX2NvbGluKCBpblNlZzFQdDEsIGluU2VnMVB0MiwgaW5TZWcyUHQxICkgKVx0XHRyZXR1cm4gW107XHRcdC8vIGJ1dCBub3QgaW4gc2VnbWVudCMxXG5cdFx0XHRcdFx0cmV0dXJuIFsgaW5TZWcyUHQxIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHRoZXkgYXJlIGNvbGxpbmVhciBzZWdtZW50cywgd2hpY2ggbWlnaHQgb3ZlcmxhcFxuXHRcdFx0XHR2YXIgc2VnMW1pbiwgc2VnMW1heCwgc2VnMW1pblZhbCwgc2VnMW1heFZhbDtcblx0XHRcdFx0dmFyIHNlZzJtaW4sIHNlZzJtYXgsIHNlZzJtaW5WYWwsIHNlZzJtYXhWYWw7XG5cdFx0XHRcdGlmICggc2VnMWR4ICE9PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIHNlZ21lbnRzIGFyZSBOT1Qgb24gYSB2ZXJ0aWNhbCBsaW5lXG5cdFx0XHRcdFx0aWYgKCBpblNlZzFQdDEueCA8IGluU2VnMVB0Mi54ICkge1xuXG5cdFx0XHRcdFx0XHRzZWcxbWluID0gaW5TZWcxUHQxOyBzZWcxbWluVmFsID0gaW5TZWcxUHQxLng7XG5cdFx0XHRcdFx0XHRzZWcxbWF4ID0gaW5TZWcxUHQyOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQyLng7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRzZWcxbWluID0gaW5TZWcxUHQyOyBzZWcxbWluVmFsID0gaW5TZWcxUHQyLng7XG5cdFx0XHRcdFx0XHRzZWcxbWF4ID0gaW5TZWcxUHQxOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQxLng7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBpblNlZzJQdDEueCA8IGluU2VnMlB0Mi54ICkge1xuXG5cdFx0XHRcdFx0XHRzZWcybWluID0gaW5TZWcyUHQxOyBzZWcybWluVmFsID0gaW5TZWcyUHQxLng7XG5cdFx0XHRcdFx0XHRzZWcybWF4ID0gaW5TZWcyUHQyOyBzZWcybWF4VmFsID0gaW5TZWcyUHQyLng7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRzZWcybWluID0gaW5TZWcyUHQyOyBzZWcybWluVmFsID0gaW5TZWcyUHQyLng7XG5cdFx0XHRcdFx0XHRzZWcybWF4ID0gaW5TZWcyUHQxOyBzZWcybWF4VmFsID0gaW5TZWcyUHQxLng7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHRoZSBzZWdtZW50cyBhcmUgb24gYSB2ZXJ0aWNhbCBsaW5lXG5cdFx0XHRcdFx0aWYgKCBpblNlZzFQdDEueSA8IGluU2VnMVB0Mi55ICkge1xuXG5cdFx0XHRcdFx0XHRzZWcxbWluID0gaW5TZWcxUHQxOyBzZWcxbWluVmFsID0gaW5TZWcxUHQxLnk7XG5cdFx0XHRcdFx0XHRzZWcxbWF4ID0gaW5TZWcxUHQyOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQyLnk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRzZWcxbWluID0gaW5TZWcxUHQyOyBzZWcxbWluVmFsID0gaW5TZWcxUHQyLnk7XG5cdFx0XHRcdFx0XHRzZWcxbWF4ID0gaW5TZWcxUHQxOyBzZWcxbWF4VmFsID0gaW5TZWcxUHQxLnk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBpblNlZzJQdDEueSA8IGluU2VnMlB0Mi55ICkge1xuXG5cdFx0XHRcdFx0XHRzZWcybWluID0gaW5TZWcyUHQxOyBzZWcybWluVmFsID0gaW5TZWcyUHQxLnk7XG5cdFx0XHRcdFx0XHRzZWcybWF4ID0gaW5TZWcyUHQyOyBzZWcybWF4VmFsID0gaW5TZWcyUHQyLnk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRzZWcybWluID0gaW5TZWcyUHQyOyBzZWcybWluVmFsID0gaW5TZWcyUHQyLnk7XG5cdFx0XHRcdFx0XHRzZWcybWF4ID0gaW5TZWcyUHQxOyBzZWcybWF4VmFsID0gaW5TZWcyUHQxLnk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIHNlZzFtaW5WYWwgPD0gc2VnMm1pblZhbCApIHtcblxuXHRcdFx0XHRcdGlmICggc2VnMW1heFZhbCA8ICBzZWcybWluVmFsIClcdHJldHVybiBbXTtcblx0XHRcdFx0XHRpZiAoIHNlZzFtYXhWYWwgPT09IHNlZzJtaW5WYWwgKVx0e1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluRXhjbHVkZUFkamFjZW50U2VncyApXHRcdHJldHVybiBbXTtcblx0XHRcdFx0XHRcdHJldHVybiBbIHNlZzJtaW4gXTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNlZzFtYXhWYWwgPD0gc2VnMm1heFZhbCApXHRyZXR1cm4gWyBzZWcybWluLCBzZWcxbWF4IF07XG5cdFx0XHRcdFx0cmV0dXJuXHRbIHNlZzJtaW4sIHNlZzJtYXggXTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBzZWcxbWluVmFsID4gIHNlZzJtYXhWYWwgKVx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdGlmICggc2VnMW1pblZhbCA9PT0gc2VnMm1heFZhbCApXHR7XG5cblx0XHRcdFx0XHRcdGlmICggaW5FeGNsdWRlQWRqYWNlbnRTZWdzIClcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgc2VnMW1pbiBdO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc2VnMW1heFZhbCA8PSBzZWcybWF4VmFsIClcdHJldHVybiBbIHNlZzFtaW4sIHNlZzFtYXggXTtcblx0XHRcdFx0XHRyZXR1cm5cdFsgc2VnMW1pbiwgc2VnMm1heCBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaXNQb2ludEluc2lkZUFuZ2xlKCBpblZlcnRleCwgaW5MZWdGcm9tUHQsIGluTGVnVG9QdCwgaW5PdGhlclB0ICkge1xuXG5cdFx0XHQvLyBUaGUgb3JkZXIgb2YgbGVncyBpcyBpbXBvcnRhbnRcblxuXHRcdFx0Ly8gdHJhbnNsYXRpb24gb2YgYWxsIHBvaW50cywgc28gdGhhdCBWZXJ0ZXggaXMgYXQgKDAsMClcblx0XHRcdHZhciBsZWdGcm9tUHRYXHQ9IGluTGVnRnJvbVB0LnggLSBpblZlcnRleC54LCAgbGVnRnJvbVB0WVx0PSBpbkxlZ0Zyb21QdC55IC0gaW5WZXJ0ZXgueTtcblx0XHRcdHZhciBsZWdUb1B0WFx0PSBpbkxlZ1RvUHQueFx0LSBpblZlcnRleC54LCAgbGVnVG9QdFlcdFx0PSBpbkxlZ1RvUHQueVx0LSBpblZlcnRleC55O1xuXHRcdFx0dmFyIG90aGVyUHRYXHQ9IGluT3RoZXJQdC54XHQtIGluVmVydGV4LngsICBvdGhlclB0WVx0XHQ9IGluT3RoZXJQdC55XHQtIGluVmVydGV4Lnk7XG5cblx0XHRcdC8vIG1haW4gYW5nbGUgPjA6IDwgMTgwIGRlZy47IDA6IDE4MCBkZWcuOyA8MDogPiAxODAgZGVnLlxuXHRcdFx0dmFyIGZyb20ydG9BbmdsZVx0PSBsZWdGcm9tUHRYICogbGVnVG9QdFkgLSBsZWdGcm9tUHRZICogbGVnVG9QdFg7XG5cdFx0XHR2YXIgZnJvbTJvdGhlckFuZ2xlXHQ9IGxlZ0Zyb21QdFggKiBvdGhlclB0WSAtIGxlZ0Zyb21QdFkgKiBvdGhlclB0WDtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggZnJvbTJ0b0FuZ2xlICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHQvLyBhbmdsZSAhPSAxODAgZGVnLlxuXG5cdFx0XHRcdHZhciBvdGhlcjJ0b0FuZ2xlXHRcdD0gb3RoZXJQdFggKiBsZWdUb1B0WSAtIG90aGVyUHRZICogbGVnVG9QdFg7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCBcImZyb20ydG86IFwiICsgZnJvbTJ0b0FuZ2xlICsgXCIsIGZyb20yb3RoZXI6IFwiICsgZnJvbTJvdGhlckFuZ2xlICsgXCIsIG90aGVyMnRvOiBcIiArIG90aGVyMnRvQW5nbGUgKTtcblxuXHRcdFx0XHRpZiAoIGZyb20ydG9BbmdsZSA+IDAgKSB7XG5cblx0XHRcdFx0XHQvLyBtYWluIGFuZ2xlIDwgMTgwIGRlZy5cblx0XHRcdFx0XHRyZXR1cm5cdCggKCBmcm9tMm90aGVyQW5nbGUgPj0gMCApICYmICggb3RoZXIydG9BbmdsZSA+PSAwICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gbWFpbiBhbmdsZSA+IDE4MCBkZWcuXG5cdFx0XHRcdFx0cmV0dXJuXHQoICggZnJvbTJvdGhlckFuZ2xlID49IDAgKSB8fCAoIG90aGVyMnRvQW5nbGUgPj0gMCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGFuZ2xlID09IDE4MCBkZWcuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCBcImZyb20ydG86IDE4MCBkZWcuLCBmcm9tMm90aGVyOiBcIiArIGZyb20yb3RoZXJBbmdsZSAgKTtcblx0XHRcdFx0cmV0dXJuXHQoIGZyb20yb3RoZXJBbmdsZSA+IDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiByZW1vdmVIb2xlcyggY29udG91ciwgaG9sZXMgKSB7XG5cblx0XHRcdHZhciBzaGFwZSA9IGNvbnRvdXIuY29uY2F0KCk7IC8vIHdvcmsgb24gdGhpcyBzaGFwZVxuXHRcdFx0dmFyIGhvbGU7XG5cblx0XHRcdGZ1bmN0aW9uIGlzQ3V0TGluZUluc2lkZUFuZ2xlcyggaW5TaGFwZUlkeCwgaW5Ib2xlSWR4ICkge1xuXG5cdFx0XHRcdC8vIENoZWNrIGlmIGhvbGUgcG9pbnQgbGllcyB3aXRoaW4gYW5nbGUgYXJvdW5kIHNoYXBlIHBvaW50XG5cdFx0XHRcdHZhciBsYXN0U2hhcGVJZHggPSBzaGFwZS5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdHZhciBwcmV2U2hhcGVJZHggPSBpblNoYXBlSWR4IC0gMTtcblx0XHRcdFx0aWYgKCBwcmV2U2hhcGVJZHggPCAwIClcdFx0XHRwcmV2U2hhcGVJZHggPSBsYXN0U2hhcGVJZHg7XG5cblx0XHRcdFx0dmFyIG5leHRTaGFwZUlkeCA9IGluU2hhcGVJZHggKyAxO1xuXHRcdFx0XHRpZiAoIG5leHRTaGFwZUlkeCA+IGxhc3RTaGFwZUlkeCApXHRuZXh0U2hhcGVJZHggPSAwO1xuXG5cdFx0XHRcdHZhciBpbnNpZGVBbmdsZSA9IGlzUG9pbnRJbnNpZGVBbmdsZSggc2hhcGVbIGluU2hhcGVJZHggXSwgc2hhcGVbIHByZXZTaGFwZUlkeCBdLCBzaGFwZVsgbmV4dFNoYXBlSWR4IF0sIGhvbGVbIGluSG9sZUlkeCBdICk7XG5cdFx0XHRcdGlmICggISBpbnNpZGVBbmdsZSApIHtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCBcIlZlcnRleCAoU2hhcGUpOiBcIiArIGluU2hhcGVJZHggKyBcIiwgUG9pbnQ6IFwiICsgaG9sZVtpbkhvbGVJZHhdLnggKyBcIi9cIiArIGhvbGVbaW5Ib2xlSWR4XS55ICk7XG5cdFx0XHRcdFx0cmV0dXJuXHRmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgc2hhcGUgcG9pbnQgbGllcyB3aXRoaW4gYW5nbGUgYXJvdW5kIGhvbGUgcG9pbnRcblx0XHRcdFx0dmFyIGxhc3RIb2xlSWR4ID0gaG9sZS5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdHZhciBwcmV2SG9sZUlkeCA9IGluSG9sZUlkeCAtIDE7XG5cdFx0XHRcdGlmICggcHJldkhvbGVJZHggPCAwIClcdFx0XHRwcmV2SG9sZUlkeCA9IGxhc3RIb2xlSWR4O1xuXG5cdFx0XHRcdHZhciBuZXh0SG9sZUlkeCA9IGluSG9sZUlkeCArIDE7XG5cdFx0XHRcdGlmICggbmV4dEhvbGVJZHggPiBsYXN0SG9sZUlkeCApXHRuZXh0SG9sZUlkeCA9IDA7XG5cblx0XHRcdFx0aW5zaWRlQW5nbGUgPSBpc1BvaW50SW5zaWRlQW5nbGUoIGhvbGVbIGluSG9sZUlkeCBdLCBob2xlWyBwcmV2SG9sZUlkeCBdLCBob2xlWyBuZXh0SG9sZUlkeCBdLCBzaGFwZVsgaW5TaGFwZUlkeCBdICk7XG5cdFx0XHRcdGlmICggISBpbnNpZGVBbmdsZSApIHtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCBcIlZlcnRleCAoSG9sZSk6IFwiICsgaW5Ib2xlSWR4ICsgXCIsIFBvaW50OiBcIiArIHNoYXBlW2luU2hhcGVJZHhdLnggKyBcIi9cIiArIHNoYXBlW2luU2hhcGVJZHhdLnkgKTtcblx0XHRcdFx0XHRyZXR1cm5cdGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm5cdHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gaW50ZXJzZWN0c1NoYXBlRWRnZSggaW5TaGFwZVB0LCBpbkhvbGVQdCApIHtcblxuXHRcdFx0XHQvLyBjaGVja3MgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBzaGFwZSBlZGdlc1xuXHRcdFx0XHR2YXIgc0lkeCwgbmV4dElkeCwgaW50ZXJzZWN0aW9uO1xuXHRcdFx0XHRmb3IgKCBzSWR4ID0gMDsgc0lkeCA8IHNoYXBlLmxlbmd0aDsgc0lkeCArKyApIHtcblxuXHRcdFx0XHRcdG5leHRJZHggPSBzSWR4ICsgMTsgbmV4dElkeCAlPSBzaGFwZS5sZW5ndGg7XG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0X3NlZ21lbnRzXzJEKCBpblNoYXBlUHQsIGluSG9sZVB0LCBzaGFwZVsgc0lkeCBdLCBzaGFwZVsgbmV4dElkeCBdLCB0cnVlICk7XG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCApXHRcdHJldHVyblx0dHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuXHRmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW5kZXBIb2xlcyA9IFtdO1xuXG5cdFx0XHRmdW5jdGlvbiBpbnRlcnNlY3RzSG9sZUVkZ2UoIGluU2hhcGVQdCwgaW5Ib2xlUHQgKSB7XG5cblx0XHRcdFx0Ly8gY2hlY2tzIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggaG9sZSBlZGdlc1xuXHRcdFx0XHR2YXIgaWhJZHgsIGNoa0hvbGUsXG5cdFx0XHRcdFx0aElkeCwgbmV4dElkeCwgaW50ZXJzZWN0aW9uO1xuXHRcdFx0XHRmb3IgKCBpaElkeCA9IDA7IGloSWR4IDwgaW5kZXBIb2xlcy5sZW5ndGg7IGloSWR4ICsrICkge1xuXG5cdFx0XHRcdFx0Y2hrSG9sZSA9IGhvbGVzWyBpbmRlcEhvbGVzWyBpaElkeCBdXTtcblx0XHRcdFx0XHRmb3IgKCBoSWR4ID0gMDsgaElkeCA8IGNoa0hvbGUubGVuZ3RoOyBoSWR4ICsrICkge1xuXG5cdFx0XHRcdFx0XHRuZXh0SWR4ID0gaElkeCArIDE7IG5leHRJZHggJT0gY2hrSG9sZS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rfc2VnbWVudHNfMkQoIGluU2hhcGVQdCwgaW5Ib2xlUHQsIGNoa0hvbGVbIGhJZHggXSwgY2hrSG9sZVsgbmV4dElkeCBdLCB0cnVlICk7XG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbi5sZW5ndGggPiAwIClcdFx0cmV0dXJuXHR0cnVlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuXHRmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaG9sZUluZGV4LCBzaGFwZUluZGV4LFxuXHRcdFx0XHRzaGFwZVB0LCBob2xlUHQsXG5cdFx0XHRcdGhvbGVJZHgsIGN1dEtleSwgZmFpbGVkQ3V0cyA9IFtdLFxuXHRcdFx0XHR0bXBTaGFwZTEsIHRtcFNoYXBlMixcblx0XHRcdFx0dG1wSG9sZTEsIHRtcEhvbGUyO1xuXG5cdFx0XHRmb3IgKCB2YXIgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0aW5kZXBIb2xlcy5wdXNoKCBoICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1pblNoYXBlSW5kZXggPSAwO1xuXHRcdFx0dmFyIGNvdW50ZXIgPSBpbmRlcEhvbGVzLmxlbmd0aCAqIDI7XG5cdFx0XHR3aGlsZSAoIGluZGVwSG9sZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb3VudGVyIC0tO1xuXHRcdFx0XHRpZiAoIGNvdW50ZXIgPCAwICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coIFwiSW5maW5pdGUgTG9vcCEgSG9sZXMgbGVmdDpcIiArIGluZGVwSG9sZXMubGVuZ3RoICsgXCIsIFByb2JhYmx5IEhvbGUgb3V0c2lkZSBTaGFwZSFcIiApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBzZWFyY2ggZm9yIHNoYXBlLXZlcnRleCBhbmQgaG9sZS12ZXJ0ZXgsXG5cdFx0XHRcdC8vIHdoaWNoIGNhbiBiZSBjb25uZWN0ZWQgd2l0aG91dCBpbnRlcnNlY3Rpb25zXG5cdFx0XHRcdGZvciAoIHNoYXBlSW5kZXggPSBtaW5TaGFwZUluZGV4OyBzaGFwZUluZGV4IDwgc2hhcGUubGVuZ3RoOyBzaGFwZUluZGV4ICsrICkge1xuXG5cdFx0XHRcdFx0c2hhcGVQdCA9IHNoYXBlWyBzaGFwZUluZGV4IF07XG5cdFx0XHRcdFx0aG9sZUluZGV4XHQ9IC0gMTtcblxuXHRcdFx0XHRcdC8vIHNlYXJjaCBmb3IgaG9sZSB3aGljaCBjYW4gYmUgcmVhY2hlZCB3aXRob3V0IGludGVyc2VjdGlvbnNcblx0XHRcdFx0XHRmb3IgKCB2YXIgaCA9IDA7IGggPCBpbmRlcEhvbGVzLmxlbmd0aDsgaCArKyApIHtcblxuXHRcdFx0XHRcdFx0aG9sZUlkeCA9IGluZGVwSG9sZXNbIGggXTtcblxuXHRcdFx0XHRcdFx0Ly8gcHJldmVudCBtdWx0aXBsZSBjaGVja3Ncblx0XHRcdFx0XHRcdGN1dEtleSA9IHNoYXBlUHQueCArIFwiOlwiICsgc2hhcGVQdC55ICsgXCI6XCIgKyBob2xlSWR4O1xuXHRcdFx0XHRcdFx0aWYgKCBmYWlsZWRDdXRzWyBjdXRLZXkgXSAhPT0gdW5kZWZpbmVkIClcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aG9sZSA9IGhvbGVzWyBob2xlSWR4IF07XG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaDIgPSAwOyBoMiA8IGhvbGUubGVuZ3RoOyBoMiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRob2xlUHQgPSBob2xlWyBoMiBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoICEgaXNDdXRMaW5lSW5zaWRlQW5nbGVzKCBzaGFwZUluZGV4LCBoMiApIClcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0c1NoYXBlRWRnZSggc2hhcGVQdCwgaG9sZVB0ICkgKVx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3RzSG9sZUVkZ2UoIHNoYXBlUHQsIGhvbGVQdCApIClcdFx0Y29udGludWU7XG5cblx0XHRcdFx0XHRcdFx0aG9sZUluZGV4ID0gaDI7XG5cdFx0XHRcdFx0XHRcdGluZGVwSG9sZXMuc3BsaWNlKCBoLCAxICk7XG5cblx0XHRcdFx0XHRcdFx0dG1wU2hhcGUxID0gc2hhcGUuc2xpY2UoIDAsIHNoYXBlSW5kZXggKyAxICk7XG5cdFx0XHRcdFx0XHRcdHRtcFNoYXBlMiA9IHNoYXBlLnNsaWNlKCBzaGFwZUluZGV4ICk7XG5cdFx0XHRcdFx0XHRcdHRtcEhvbGUxID0gaG9sZS5zbGljZSggaG9sZUluZGV4ICk7XG5cdFx0XHRcdFx0XHRcdHRtcEhvbGUyID0gaG9sZS5zbGljZSggMCwgaG9sZUluZGV4ICsgMSApO1xuXG5cdFx0XHRcdFx0XHRcdHNoYXBlID0gdG1wU2hhcGUxLmNvbmNhdCggdG1wSG9sZTEgKS5jb25jYXQoIHRtcEhvbGUyICkuY29uY2F0KCB0bXBTaGFwZTIgKTtcblxuXHRcdFx0XHRcdFx0XHRtaW5TaGFwZUluZGV4ID0gc2hhcGVJbmRleDtcblxuXHRcdFx0XHRcdFx0XHQvLyBEZWJ1ZyBvbmx5LCB0byBzaG93IHRoZSBzZWxlY3RlZCBjdXRzXG5cdFx0XHRcdFx0XHRcdC8vIGdsb2JfQ3V0TGluZXMucHVzaCggWyBzaGFwZVB0LCBob2xlUHQgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIGhvbGVJbmRleCA+PSAwIClcdGJyZWFrO1x0XHQvLyBob2xlLXZlcnRleCBmb3VuZFxuXG5cdFx0XHRcdFx0XHRmYWlsZWRDdXRzWyBjdXRLZXkgXSA9IHRydWU7XHRcdFx0Ly8gcmVtZW1iZXIgZmFpbHVyZVxuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggaG9sZUluZGV4ID49IDAgKVx0YnJlYWs7XHRcdC8vIGhvbGUtdmVydGV4IGZvdW5kXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZTsgXHRcdFx0Lyogc2hhcGUgd2l0aCBubyBob2xlcyAqL1xuXG5cdFx0fVxuXG5cblx0XHR2YXIgaSwgaWwsIGYsIGZhY2UsXG5cdFx0XHRrZXksIGluZGV4LFxuXHRcdFx0YWxsUG9pbnRzTWFwID0ge307XG5cblx0XHQvLyBUbyBtYWludGFpbiByZWZlcmVuY2UgdG8gb2xkIHNoYXBlLCBvbmUgbXVzdCBtYXRjaCBjb29yZGluYXRlcywgb3Igb2Zmc2V0IHRoZSBpbmRpY2VzIGZyb20gb3JpZ2luYWwgYXJyYXlzLiBJdCdzIHByb2JhYmx5IGVhc2llciB0byBkbyB0aGUgZmlyc3QuXG5cblx0XHR2YXIgYWxscG9pbnRzID0gY29udG91ci5jb25jYXQoKTtcblxuXHRcdGZvciAoIHZhciBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIGFsbHBvaW50cywgaG9sZXNbIGggXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyggXCJhbGxwb2ludHNcIixhbGxwb2ludHMsIGFsbHBvaW50cy5sZW5ndGggKTtcblxuXHRcdC8vIHByZXBhcmUgYWxsIHBvaW50cyBtYXBcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGFsbHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0a2V5ID0gYWxscG9pbnRzWyBpIF0ueCArIFwiOlwiICsgYWxscG9pbnRzWyBpIF0ueTtcblxuXHRcdFx0aWYgKCBhbGxQb2ludHNNYXBbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlNoYXBlVXRpbHM6IER1cGxpY2F0ZSBwb2ludFwiLCBrZXksIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhbGxQb2ludHNNYXBbIGtleSBdID0gaTtcblxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSBob2xlcyBieSBjdXR0aW5nIHBhdGhzIHRvIGhvbGVzIGFuZCBhZGRpbmcgdGhlbSB0byB0aGUgc2hhcGVcblx0XHR2YXIgc2hhcGVXaXRob3V0SG9sZXMgPSByZW1vdmVIb2xlcyggY29udG91ciwgaG9sZXMgKTtcblxuXHRcdHZhciB0cmlhbmdsZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlKCBzaGFwZVdpdGhvdXRIb2xlcywgZmFsc2UgKTsgLy8gVHJ1ZSByZXR1cm5zIGluZGljZXMgZm9yIHBvaW50cyBvZiBzcG9vbGVkIHNoYXBlXG5cdFx0Ly9jb25zb2xlLmxvZyggXCJ0cmlhbmdsZXNcIix0cmlhbmdsZXMsIHRyaWFuZ2xlcy5sZW5ndGggKTtcblxuXHRcdC8vIGNoZWNrIGFsbCBmYWNlIHZlcnRpY2VzIGFnYWluc3QgYWxsIHBvaW50cyBtYXBcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRyaWFuZ2xlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRyaWFuZ2xlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBmID0gMDsgZiA8IDM7IGYgKysgKSB7XG5cblx0XHRcdFx0a2V5ID0gZmFjZVsgZiBdLnggKyBcIjpcIiArIGZhY2VbIGYgXS55O1xuXG5cdFx0XHRcdGluZGV4ID0gYWxsUG9pbnRzTWFwWyBrZXkgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRmYWNlWyBmIF0gPSBpbmRleDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cmlhbmdsZXMuY29uY2F0KCk7XG5cblx0fSxcblxuXHRpc0Nsb2NrV2lzZTogZnVuY3Rpb24gKCBwdHMgKSB7XG5cblx0XHRyZXR1cm4gU2hhcGVVdGlscy5hcmVhKCBwdHMgKSA8IDA7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLlxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBleHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxpbmUgdG9vXG4gKiAgYW1vdW50OiA8aW50PiwgLy8gRGVwdGggdG8gZXh0cnVkZSB0aGUgc2hhcGVcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0aGUgb3JpZ2luYWwgc2hhcGUgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgaXMgYmV2ZWxcbiAqICBiZXZlbFNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIGJldmVsIGxheWVyc1xuICpcbiAqICBleHRydWRlUGF0aDogPFRIUkVFLkN1cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nXG4gKiAgZnJhbWVzOiA8T2JqZWN0PiAvLyBjb250YWluaW5nIGFycmF5cyBvZiB0YW5nZW50cywgbm9ybWFscywgYmlub3JtYWxzXG4gKlxuICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBvYmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zXG4gKlxuICogfVxuICovXG5cbi8vIEV4dHJ1ZGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBFeHRydWRlR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdG9wdGlvbnM6IG9wdGlvbnNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVHZW9tZXRyeTtcblxuLy8gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdGlmICggdHlwZW9mICggc2hhcGVzICkgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cblx0XHRzaGFwZXMgPSBbXTtcblx0XHRyZXR1cm47XG5cblx0fVxuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUJ1ZmZlckdlb21ldHJ5JztcblxuXHRzaGFwZXMgPSBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA/IHNoYXBlcyA6IFsgc2hhcGVzIF07XG5cblx0dGhpcy5hZGRTaGFwZUxpc3QoIHNoYXBlcywgb3B0aW9ucyApO1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBjYW4ndCByZWFsbHkgdXNlIGF1dG9tYXRpYyB2ZXJ0ZXggbm9ybWFsc1xuXHQvLyBhcyB0aGVuIGZyb250IGFuZCBiYWNrIHNpZGVzIGdldCBzbW9vdGhlZCB0b29cblx0Ly8gc2hvdWxkIGRvIHNlcGFyYXRlIHNtb290aGluZyBqdXN0IGZvciBzaWRlc1xuXG5cdC8vdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vY29uc29sZS5sb2coIFwidG9va1wiLCAoIERhdGUubm93KCkgLSBzdGFydFRpbWUgKSApO1xuXG59XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlQnVmZmVyR2VvbWV0cnk7XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuZ2V0QXJyYXlzID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCBcInBvc2l0aW9uXCIgKTtcblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBwb3NpdGlvbkF0dHJpYnV0ZSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBwb3NpdGlvbkF0dHJpYnV0ZS5hcnJheSApIDogW107XG5cblx0dmFyIHV2QXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoIFwidXZcIiApO1xuXHR2YXIgdXZBcnJheSA9IHV2QXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIHV2QXR0cmlidXRlLmFycmF5ICkgOiBbXTtcblxuXHR2YXIgSW5kZXhBdHRyaWJ1dGUgPSB0aGlzLmluZGV4O1xuXHR2YXIgaW5kaWNlc0FycmF5ID0gSW5kZXhBdHRyaWJ1dGUgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggSW5kZXhBdHRyaWJ1dGUuYXJyYXkgKSA6IFtdO1xuXG5cdHJldHVybiB7XG5cdFx0cG9zaXRpb246IHZlcnRpY2VzQXJyYXksXG5cdFx0dXY6IHV2QXJyYXksXG5cdFx0aW5kZXg6IGluZGljZXNBcnJheVxuXHR9O1xuXG59O1xuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZFNoYXBlTGlzdCA9IGZ1bmN0aW9uICggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdHZhciBzbCA9IHNoYXBlcy5sZW5ndGg7XG5cdG9wdGlvbnMuYXJyYXlzID0gdGhpcy5nZXRBcnJheXMoKTtcblxuXHRmb3IgKCB2YXIgcyA9IDA7IHMgPCBzbDsgcyArKyApIHtcblxuXHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgcyBdO1xuXHRcdHRoaXMuYWRkU2hhcGUoIHNoYXBlLCBvcHRpb25zICk7XG5cblx0fVxuXG5cdHRoaXMuc2V0SW5kZXgoIG9wdGlvbnMuYXJyYXlzLmluZGV4ICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggb3B0aW9ucy5hcnJheXMucG9zaXRpb24sIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG9wdGlvbnMuYXJyYXlzLnV2LCAyICkgKTtcblxufTtcblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5hZGRTaGFwZSA9IGZ1bmN0aW9uICggc2hhcGUsIG9wdGlvbnMgKSB7XG5cblx0dmFyIGFycmF5cyA9IG9wdGlvbnMuYXJyYXlzID8gb3B0aW9ucy5hcnJheXMgOiB0aGlzLmdldEFycmF5cygpO1xuXHR2YXIgdmVydGljZXNBcnJheSA9IGFycmF5cy5wb3NpdGlvbjtcblx0dmFyIGluZGljZXNBcnJheSA9IGFycmF5cy5pbmRleDtcblx0dmFyIHV2QXJyYXkgPSBhcnJheXMudXY7XG5cblx0dmFyIHBsYWNlaG9sZGVyID0gW107XG5cblxuXHR2YXIgYW1vdW50ID0gb3B0aW9ucy5hbW91bnQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYW1vdW50IDogMTAwO1xuXG5cdHZhciBiZXZlbFRoaWNrbmVzcyA9IG9wdGlvbnMuYmV2ZWxUaGlja25lc3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxUaGlja25lc3MgOiA2OyAvLyAxMFxuXHR2YXIgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAyOyAvLyA4XG5cdHZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdHZhciBiZXZlbEVuYWJsZWQgPSBvcHRpb25zLmJldmVsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbEVuYWJsZWQgOiB0cnVlOyAvLyBmYWxzZVxuXG5cdHZhciBjdXJ2ZVNlZ21lbnRzID0gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmN1cnZlU2VnbWVudHMgOiAxMjtcblxuXHR2YXIgc3RlcHMgPSBvcHRpb25zLnN0ZXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZXBzIDogMTtcblxuXHR2YXIgZXh0cnVkZVBhdGggPSBvcHRpb25zLmV4dHJ1ZGVQYXRoO1xuXHR2YXIgZXh0cnVkZVB0cywgZXh0cnVkZUJ5UGF0aCA9IGZhbHNlO1xuXG5cdC8vIFVzZSBkZWZhdWx0IFdvcmxkVVZHZW5lcmF0b3IgaWYgbm8gVVYgZ2VuZXJhdG9ycyBhcmUgc3BlY2lmaWVkLlxuXHR2YXIgdXZnZW4gPSBvcHRpb25zLlVWR2VuZXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLlVWR2VuZXJhdG9yIDogRXh0cnVkZUdlb21ldHJ5LldvcmxkVVZHZW5lcmF0b3I7XG5cblx0dmFyIHNwbGluZVR1YmUsIGJpbm9ybWFsLCBub3JtYWwsIHBvc2l0aW9uMjtcblx0aWYgKCBleHRydWRlUGF0aCApIHtcblxuXHRcdGV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7XG5cblx0XHRleHRydWRlQnlQYXRoID0gdHJ1ZTtcblx0XHRiZXZlbEVuYWJsZWQgPSBmYWxzZTsgLy8gYmV2ZWxzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdGggZXh0cnVzaW9uXG5cblx0XHQvLyBTRVRVUCBUTkIgdmFyaWFibGVzXG5cblx0XHQvLyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lP1xuXG5cdFx0c3BsaW5lVHViZSA9IG9wdGlvbnMuZnJhbWVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZyYW1lcyA6IGV4dHJ1ZGVQYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHN0ZXBzLCBmYWxzZSApO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coc3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3RlcHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7XG5cblx0XHRiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdH1cblxuXHQvLyBTYWZlZ3VhcmRzIGlmIGJldmVscyBhcmUgbm90IGVuYWJsZWRcblxuXHRpZiAoICEgYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0YmV2ZWxTZWdtZW50cyA9IDA7XG5cdFx0YmV2ZWxUaGlja25lc3MgPSAwO1xuXHRcdGJldmVsU2l6ZSA9IDA7XG5cblx0fVxuXG5cdC8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvblxuXG5cdHZhciBhaG9sZSwgaCwgaGw7IC8vIGxvb3Bpbmcgb2YgaG9sZXNcblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgc2hhcGVQb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0dmFyIHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7XG5cdHZhciBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdHZhciByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApO1xuXG5cdGlmICggcmV2ZXJzZSApIHtcblxuXHRcdHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0Ly8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi5cblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggYWhvbGUgKSApIHtcblxuXHRcdFx0XHRob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXZlcnNlID0gZmFsc2U7IC8vIElmIHZlcnRpY2VzIGFyZSBpbiBvcmRlciBub3csIHdlIHNob3VsZG4ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZW0gYWdhaW4gKGhvcGVmdWxseSkhXG5cblx0fVxuXG5cblx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTtcblxuXHQvKiBWZXJ0aWNlcyAqL1xuXG5cdHZhciBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlXG5cblx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHtcblxuXHRcdGlmICggISB2ZWMgKSBjb25zb2xlLmVycm9yKCBcIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0XCIgKTtcblxuXHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHR9XG5cblx0dmFyIGIsIGJzLCB0LCB6LFxuXHRcdHZlcnQsIHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0ZmFjZSwgZmxlbiA9IGZhY2VzLmxlbmd0aDtcblxuXG5cdC8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnRcblxuXG5cdGZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHtcblxuXHRcdC8vIGNvbXB1dGVzIGZvciBpblB0IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXJcblx0XHQvLyAgIHNoaWZ0ZWQgYnkgMSB1bml0IChsZW5ndGggb2Ygbm9ybWFsaXplZCB2ZWN0b3IpIHRvIHRoZSBsZWZ0XG5cdFx0Ly8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lXG5cdFx0Ly9cblx0XHQvLyBpblB0JyBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgcGFyYWxsZWwgdG8gdGhlIHR3b1xuXHRcdC8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuXG5cblx0XHR2YXIgdl90cmFuc194LCB2X3RyYW5zX3ksIHNocmlua19ieSA9IDE7IC8vIHJlc3VsdGluZyB0cmFuc2xhdGlvbiB2ZWN0b3IgZm9yIGluUHRcblxuXHRcdC8vIGdvb2QgcmVhZGluZyBmb3IgZ2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbilcblx0XHQvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbFxuXG5cdFx0dmFyIHZfcHJldl94ID0gaW5QdC54IC0gaW5QcmV2LngsXG5cdFx0XHR2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55O1xuXHRcdHZhciB2X25leHRfeCA9IGluTmV4dC54IC0gaW5QdC54LFxuXHRcdFx0dl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTtcblxuXHRcdHZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7XG5cblx0XHQvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzXG5cdFx0dmFyIGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBjb2xsaW5lYXIwICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0Ly8gbm90IGNvbGxpbmVhclxuXG5cdFx0XHQvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmdcblxuXHRcdFx0dmFyIHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0dmFyIHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7XG5cblx0XHRcdC8vIHNoaWZ0IGFkamFjZW50IHBvaW50cyBieSB1bml0IHZlY3RvcnMgdG8gdGhlIGxlZnRcblxuXHRcdFx0dmFyIHB0UHJldlNoaWZ0X3ggPSAoIGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuICk7XG5cdFx0XHR2YXIgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2LnkgKyB2X3ByZXZfeCAvIHZfcHJldl9sZW4gKTtcblxuXHRcdFx0dmFyIHB0TmV4dFNoaWZ0X3ggPSAoIGluTmV4dC54IC0gdl9uZXh0X3kgLyB2X25leHRfbGVuICk7XG5cdFx0XHR2YXIgcHROZXh0U2hpZnRfeSA9ICggaW5OZXh0LnkgKyB2X25leHRfeCAvIHZfbmV4dF9sZW4gKTtcblxuXHRcdFx0Ly8gc2NhbGluZyBmYWN0b3IgZm9yIHZfcHJldiB0byBpbnRlcnNlY3Rpb24gcG9pbnRcblxuXHRcdFx0dmFyIHNmID0gKCAoIHB0TmV4dFNoaWZ0X3ggLSBwdFByZXZTaGlmdF94ICkgKiB2X25leHRfeSAtXG5cdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdCggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcblxuXHRcdFx0Ly8gdmVjdG9yIGZyb20gaW5QdCB0byBpbnRlcnNlY3Rpb24gcG9pbnRcblxuXHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0dl90cmFuc195ID0gKCBwdFByZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApO1xuXG5cdFx0XHQvLyBEb24ndCBub3JtYWxpemUhLCBvdGhlcndpc2Ugc2hhcnAgY29ybmVycyBiZWNvbWUgdWdseVxuXHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0dmFyIHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApO1xuXHRcdFx0aWYgKCB2X3RyYW5zX2xlbnNxIDw9IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl90cmFuc19sZW5zcSAvIDIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRnZXNcblxuXHRcdFx0dmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZVxuXHRcdFx0aWYgKCB2X3ByZXZfeCA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdGlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggdl9wcmV2X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0aWYgKCB2X25leHRfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7XG5cblx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGlyZWN0aW9uX2VxICkge1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2VcIik7XG5cdFx0XHRcdHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7XG5cdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl94O1xuXHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc3Bpa2VcIik7XG5cdFx0XHRcdHZfdHJhbnNfeCA9IHZfcHJldl94O1xuXHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeTtcblx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgLyAyICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJpbmtfYnkgKTtcblxuXHR9XG5cblxuXHR2YXIgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdC8vIGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKVxuXG5cdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHR9XG5cblx0dmFyIGhvbGVzTW92ZW1lbnRzID0gW10sXG5cdFx0b25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpO1xuXG5cdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0b25lSG9sZU1vdmVtZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggYWhvbGVbIGkgXSwgYWhvbGVbIGogXSwgYWhvbGVbIGsgXSApO1xuXG5cdFx0fVxuXG5cdFx0aG9sZXNNb3ZlbWVudHMucHVzaCggb25lSG9sZU1vdmVtZW50cyApO1xuXHRcdHZlcnRpY2VzTW92ZW1lbnRzID0gdmVydGljZXNNb3ZlbWVudHMuY29uY2F0KCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cblx0fVxuXG5cblx0Ly8gTG9vcCBiZXZlbFNlZ21lbnRzLCAxIGZvciB0aGUgZnJvbnQsIDEgZm9yIHRoZSBiYWNrXG5cblx0Zm9yICggYiA9IDA7IGIgPCBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXG5cdFx0Ly9mb3IgKCBiID0gYmV2ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7XG5cblx0XHR0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0Ly8gY29udHJhY3Qgc2hhcGVcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcblxuXHRcdH1cblxuXHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblxuXHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0YnMgPSBiZXZlbFNpemU7XG5cblx0Ly8gQmFjayBmYWNpbmcgdmVydGljZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHR2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0ueCApO1xuXG5cdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgMCBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0Ly8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNlc1xuXG5cdHZhciBzO1xuXG5cdGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xuXG5cdFx0XHR2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50IC8gc3RlcHMgKiBzICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdG5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTtcblx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0diggcG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cblx0Ly8gQWRkIGJldmVsIHNlZ21lbnRzIHBsYW5lc1xuXG5cdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0Zm9yICggYiA9IGJldmVsU2VnbWVudHMgLSAxOyBiID49IDA7IGIgLS0gKSB7XG5cblx0XHR0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0Ly8gY29udHJhY3Qgc2hhcGVcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50ICsgeiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZXhwYW5kIGhvbGVzXG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS55LCBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS54ICsgeiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvKiBGYWNlcyAqL1xuXG5cdC8vIFRvcCBhbmQgYm90dG9tIGZhY2VzXG5cblx0YnVpbGRMaWRGYWNlcygpO1xuXG5cdC8vIFNpZGVzIGZhY2VzXG5cblx0YnVpbGRTaWRlRmFjZXMoKTtcblxuXG5cdC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkge1xuXG5cdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGgvMztcblxuXHRcdGlmICggYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHR2YXIgbGF5ZXIgPSAwOyAvLyBzdGVwcyArIDFcblx0XHRcdHZhciBvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdGYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0bGF5ZXIgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xuXHRcdFx0b2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRmMyggZmFjZVsgMCBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDIgXSArIG9mZnNldCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRmMyggZmFjZVsgMiBdLCBmYWNlWyAxIF0sIGZhY2VbIDAgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGgvMyAtc3RhcnQsIG9wdGlvbnMubWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWF0ZXJpYWwgOiAwKTtcblxuXHR9XG5cblx0Ly8gQ3JlYXRlIGZhY2VzIGZvciB0aGUgei1zaWRlcyBvZiB0aGUgc2hhcGVcblxuXHRmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHtcblxuXHRcdHZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoLzM7XG5cdFx0dmFyIGxheWVyb2Zmc2V0ID0gMDtcblx0XHRzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7XG5cdFx0bGF5ZXJvZmZzZXQgKz0gY29udG91ci5sZW5ndGg7XG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0c2lkZXdhbGxzKCBhaG9sZSwgbGF5ZXJvZmZzZXQgKTtcblxuXHRcdFx0Ly8sIHRydWVcblx0XHRcdGxheWVyb2Zmc2V0ICs9IGFob2xlLmxlbmd0aDtcblxuXHRcdH1cblxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zIC1zdGFydCwgb3B0aW9ucy5leHRydWRlTWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZXh0cnVkZU1hdGVyaWFsIDogMSk7XG5cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHtcblxuXHRcdHZhciBqLCBrO1xuXHRcdGkgPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdHdoaWxlICggLS0gaSA+PSAwICkge1xuXG5cdFx0XHRqID0gaTtcblx0XHRcdGsgPSBpIC0gMTtcblx0XHRcdGlmICggayA8IDAgKSBrID0gY29udG91ci5sZW5ndGggLSAxO1xuXG5cdFx0XHQvL2NvbnNvbGUubG9nKCdiJywgaSxqLCBpLTEsIGssdmVydGljZXMubGVuZ3RoKTtcblxuXHRcdFx0dmFyIHMgPSAwLFxuXHRcdFx0XHRzbCA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XG5cblx0XHRcdGZvciAoIHMgPSAwOyBzIDwgc2w7IHMgKysgKSB7XG5cblx0XHRcdFx0dmFyIHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdHZhciBzbGVuMiA9IHZsZW4gKiAoIHMgKyAxICk7XG5cblx0XHRcdFx0dmFyIGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSxcblx0XHRcdFx0XHRiID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjEsXG5cdFx0XHRcdFx0YyA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4yLFxuXHRcdFx0XHRcdGQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjtcblxuXHRcdFx0XHRmNCggYSwgYiwgYywgZCwgY29udG91ciwgcywgc2wsIGosIGsgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB2KCB4LCB5LCB6ICkge1xuXG5cdFx0cGxhY2Vob2xkZXIucHVzaCggeCApO1xuXHRcdHBsYWNlaG9sZGVyLnB1c2goIHkgKTtcblx0XHRwbGFjZWhvbGRlci5wdXNoKCB6ICk7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gZjMoIGEsIGIsIGMgKSB7XG5cblx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRhZGRWZXJ0ZXgoIGMgKTtcblxuXHRcdHZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZjQoIGEsIGIsIGMsIGQsIHdhbGxDb250b3VyLCBzdGVwSW5kZXgsIHN0ZXBzTGVuZ3RoLCBjb250b3VySW5kZXgxLCBjb250b3VySW5kZXgyICkge1xuXG5cdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0YWRkVmVydGV4KCBkICk7XG5cblx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRhZGRWZXJ0ZXgoIGMgKTtcblx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXG5cdFx0dmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHR2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVTaWRlV2FsbFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gNiwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xuXG5cdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRhZGRVViggdXZzWyAyIF0gKTtcblx0XHRhZGRVViggdXZzWyAzIF0gKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHtcblxuXHRcdGluZGljZXNBcnJheS5wdXNoKCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgKTtcblx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAxIF0gKTtcblx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAyIF0gKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiBhZGRVViggdmVjdG9yMiApIHtcblxuXHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi54ICk7XG5cdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHR9XG5cblx0aWYgKCAhIG9wdGlvbnMuYXJyYXlzICkge1xuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlc0FycmF5ICk7XG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlc0FycmF5LCAzICkgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG9wdGlvbnMuYXJyYXlzLnV2LCAyICkgKTtcblxuXHR9XG5cbn07XG5cbkV4dHJ1ZGVHZW9tZXRyeS5Xb3JsZFVWR2VuZXJhdG9yID0ge1xuXG5cdGdlbmVyYXRlVG9wVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdHZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcblx0XHR2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHR2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgYV95ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYl94LCBiX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIGNfeSApXG5cdFx0XTtcblxuXHR9LFxuXG5cdGdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMsIGluZGV4RCApIHtcblxuXHRcdHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHR2YXIgYV96ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAyIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBiX3ogPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDIgXTtcblx0XHR2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHR2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cdFx0dmFyIGNfeiA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMiBdO1xuXHRcdHZhciBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyBdO1xuXHRcdHZhciBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTtcblx0XHR2YXIgZF96ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAyIF07XG5cblx0XHRpZiAoIE1hdGguYWJzKCBhX3kgLSBiX3kgKSA8IDAuMDEgKSB7XG5cblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIDEgLSBhX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgMSAtIGJfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY194LCAxIC0gY196ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3gsIDEgLSBkX3ogKVxuXHRcdFx0XTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3ksIDEgLSBhX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeSwgMSAtIGJfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY195LCAxIC0gY196ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3ksIDEgLSBkX3ogKVxuXHRcdFx0XTtcblxuXHRcdH1cblxuXHR9XG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogVGV4dCA9IDNEIFRleHRcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGZvbnQ6IDxUSFJFRS5Gb250PiwgLy8gZm9udFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LCAvLyBzaXplIG9mIHRoZSB0ZXh0XG4gKiAgaGVpZ2h0OiA8ZmxvYXQ+LCAvLyB0aGlja25lc3MgdG8gZXh0cnVkZSB0ZXh0XG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiAvLyBob3cgZmFyIGZyb20gdGV4dCBvdXRsaW5lIGlzIGJldmVsXG4gKiB9XG4gKi9cblxuLy8gVGV4dEdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRleHRHZW9tZXRyeSggIHRleHQsIHBhcmFtZXRlcnMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXh0R2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR0ZXh0OiB0ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRleHRHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0R2VvbWV0cnk7XG5cbi8vIFRleHRCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSB7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIGZvbnQgPSBwYXJhbWV0ZXJzLmZvbnQ7XG5cblx0aWYgKCAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4nICk7XG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpO1xuXG5cdH1cblxuXHR2YXIgc2hhcGVzID0gZm9udC5nZW5lcmF0ZVNoYXBlcyggdGV4dCwgcGFyYW1ldGVycy5zaXplLCBwYXJhbWV0ZXJzLmN1cnZlU2VnbWVudHMgKTtcblxuXHQvLyB0cmFuc2xhdGUgcGFyYW1ldGVycyB0byBFeHRydWRlR2VvbWV0cnkgQVBJXG5cblx0cGFyYW1ldGVycy5hbW91bnQgPSBwYXJhbWV0ZXJzLmhlaWdodCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5oZWlnaHQgOiA1MDtcblxuXHQvLyBkZWZhdWx0c1xuXG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEwO1xuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxTaXplID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9IDg7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID0gZmFsc2U7XG5cblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHNoYXBlcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXh0QnVmZmVyR2VvbWV0cnknO1xuXG59XG5cblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU3BoZXJlR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlR2VvbWV0cnk7XG5cbi8vIFNwaGVyZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDUwO1xuXG5cdHdpZHRoU2VnbWVudHMgPSBNYXRoLm1heCggMywgTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDggKTtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLm1heCggMiwgTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCA2ICk7XG5cblx0cGhpU3RhcnQgPSBwaGlTdGFydCAhPT0gdW5kZWZpbmVkID8gcGhpU3RhcnQgOiAwO1xuXHRwaGlMZW5ndGggPSBwaGlMZW5ndGggIT09IHVuZGVmaW5lZCA/IHBoaUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJO1xuXG5cdHZhciB0aGV0YUVuZCA9IHRoZXRhU3RhcnQgKyB0aGV0YUxlbmd0aDtcblxuXHR2YXIgaXgsIGl5O1xuXG5cdHZhciBpbmRleCA9IDA7XG5cdHZhciBncmlkID0gW107XG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDw9IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlc1JvdyA9IFtdO1xuXG5cdFx0dmFyIHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8PSB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBpeCAvIHdpZHRoU2VnbWVudHM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogTWF0aC5zaW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFsLnNldCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0XHR2ZXJ0aWNlc1Jvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0fVxuXG5cdFx0Z3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTtcblx0XHRcdHZhciBiID0gZ3JpZFsgaXkgXVsgaXggXTtcblx0XHRcdHZhciBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XG5cdFx0XHR2YXIgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTtcblxuXHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aWYgKCBpeSAhPT0gaGVpZ2h0U2VnbWVudHMgLSAxIHx8IHRoZXRhRW5kIDwgTWF0aC5QSSApIGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEthbGViIE11cnBoeVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBSaW5nR2VvbWV0cnlcblxuZnVuY3Rpb24gUmluZ0dlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcblx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5SaW5nR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0dlb21ldHJ5O1xuXG4vLyBSaW5nQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1JpbmdCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcblx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRpbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzIHx8IDIwO1xuXHRvdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIHx8IDUwO1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVNlZ21lbnRzID0gdGhldGFTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKSA6IDg7XG5cdHBoaVNlZ21lbnRzID0gcGhpU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApIDogMTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBzb21lIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgc2VnbWVudDtcblx0dmFyIHJhZGl1cyA9IGlubmVyUmFkaXVzO1xuXHR2YXIgcmFkaXVzU3RlcCA9ICggKCBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGosIGk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9tIHRoZSBpbnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGVcblxuXHRcdFx0c2VnbWVudCA9IHRoZXRhU3RhcnQgKyBpIC8gdGhldGFTZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9ICggdmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cdFx0XHR1di55ID0gKCB2ZXJ0ZXgueSAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGluY3JlYXNlIHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZlcnRpY2VzXG5cblx0XHRyYWRpdXMgKz0gcmFkaXVzU3RlcDtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGogPSAwOyBqIDwgcGhpU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHR2YXIgdGhldGFTZWdtZW50TGV2ZWwgPSBqICogKCB0aGV0YVNlZ21lbnRzICsgMSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRzZWdtZW50ID0gaSArIHRoZXRhU2VnbWVudExldmVsO1xuXG5cdFx0XHR2YXIgYSA9IHNlZ21lbnQ7XG5cdFx0XHR2YXIgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTtcblx0XHRcdHZhciBjID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAyO1xuXHRcdFx0dmFyIGQgPSBzZWdtZW50ICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBhc3Ryb2R1ZCAvIGh0dHA6Ly9hc3Ryb2R1ZC5pc2dyZWF0Lm9yZy9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIExhdGhlR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVHZW9tZXRyeTtcblxuLy8gTGF0aGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBvaW50czogcG9pbnRzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGhcblx0fTtcblxuXHRzZWdtZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICkgfHwgMTI7XG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgfHwgMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoIHx8IE1hdGguUEkgKiAyO1xuXG5cdC8vIGNsYW1wIHBoaUxlbmd0aCBzbyBpdCdzIGluIHJhbmdlIG9mIFsgMCwgMlBJIF1cblxuXHRwaGlMZW5ndGggPSBfTWF0aC5jbGFtcCggcGhpTGVuZ3RoLCAwLCBNYXRoLlBJICogMiApO1xuXG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBiYXNlO1xuXHR2YXIgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgaSwgajtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHR2YXIgcGhpID0gcGhpU3RhcnQgKyBpICogaW52ZXJzZVNlZ21lbnRzICogcGhpTGVuZ3RoO1xuXG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCBwaGkgKTtcblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHBoaSApO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSBwb2ludHNbIGogXS54ICogc2luO1xuXHRcdFx0dmVydGV4LnkgPSBwb2ludHNbIGogXS55O1xuXHRcdFx0dmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSBpIC8gc2VnbWVudHM7XG5cdFx0XHR1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTtcblxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRiYXNlID0gaiArIGkgKiBwb2ludHMubGVuZ3RoO1xuXG5cdFx0XHR2YXIgYSA9IGJhc2U7XG5cdFx0XHR2YXIgYiA9IGJhc2UgKyBwb2ludHMubGVuZ3RoO1xuXHRcdFx0dmFyIGMgPSBiYXNlICsgcG9pbnRzLmxlbmd0aCArIDE7XG5cdFx0XHR2YXIgZCA9IGJhc2UgKyAxO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyBnZW5lcmF0ZSBub3JtYWxzXG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIHdlIG5lZWQgdG8gYXZlcmFnZSB0aGUgbm9ybWFscyBhbG9uZyB0aGUgc2VhbS5cblx0Ly8gYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNlcyBhcmUgaWRlbnRpY2FsIChidXQgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgVVZzKS5cblxuXHRpZiAoIHBoaUxlbmd0aCA9PT0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cdFx0dmFyIG4xID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbjIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBuID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRoaXMgaXMgdGhlIGJ1ZmZlciBvZmZzZXQgZm9yIHRoZSBsYXN0IGxpbmUgb2YgdmVydGljZXNcblxuXHRcdGJhc2UgPSBzZWdtZW50cyAqIHBvaW50cy5sZW5ndGggKiAzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGogPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkge1xuXG5cdFx0XHQvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBmaXJzdCBsaW5lXG5cblx0XHRcdG4xLnggPSBub3JtYWxzWyBqICsgMCBdO1xuXHRcdFx0bjEueSA9IG5vcm1hbHNbIGogKyAxIF07XG5cdFx0XHRuMS56ID0gbm9ybWFsc1sgaiArIDIgXTtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgbGFzdCBsaW5lXG5cblx0XHRcdG4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTtcblx0XHRcdG4yLnkgPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXTtcblx0XHRcdG4yLnogPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXTtcblxuXHRcdFx0Ly8gYXZlcmFnZSBub3JtYWxzXG5cblx0XHRcdG4uYWRkVmVjdG9ycyggbjEsIG4yICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIGFzc2lnbiB0aGUgbmV3IHZhbHVlcyB0byBib3RoIG5vcm1hbHNcblxuXHRcdFx0bm9ybWFsc1sgaiArIDAgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdID0gbi54O1xuXHRcdFx0bm9ybWFsc1sgaiArIDEgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdID0gbi55O1xuXHRcdFx0bm9ybWFsc1sgaiArIDIgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMiBdID0gbi56O1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5MYXRoZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTaGFwZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknO1xuXG5cdGlmICggdHlwZW9mIGN1cnZlU2VnbWVudHMgPT09ICdvYmplY3QnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cy5jdXJ2ZVNlZ21lbnRzO1xuXG5cdH1cblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVHZW9tZXRyeTtcblxuLy8gU2hhcGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdGN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzIHx8IDEyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cdHZhciBncm91cENvdW50ID0gMDtcblxuXHQvLyBhbGxvdyBzaW5nbGUgYW5kIGFycmF5IHZhbHVlcyBmb3IgXCJzaGFwZXNcIiBwYXJhbWV0ZXJcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHtcblxuXHRcdGFkZFNoYXBlKCBzaGFwZXMgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlc1sgaSBdICk7XG5cblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIGkgKTsgLy8gZW5hYmxlcyBNdWx0aU1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXHRcdFx0Z3JvdXBDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHR2YXIgaSwgbCwgc2hhcGVIb2xlO1xuXG5cdFx0dmFyIGluZGV4T2Zmc2V0ID0gdmVydGljZXMubGVuZ3RoIC8gMztcblx0XHR2YXIgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0dmFyIHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7XG5cdFx0dmFyIHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7XG5cblx0XHQvLyBjaGVjayBkaXJlY3Rpb24gb2YgdmVydGljZXNcblxuXHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVWZXJ0aWNlcyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHQvLyBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlSG9sZSApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0c2hhcGVIb2xlc1sgaSBdID0gc2hhcGVIb2xlLnJldmVyc2UoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggc2hhcGVWZXJ0aWNlcywgc2hhcGVIb2xlcyApO1xuXG5cdFx0Ly8gam9pbiB2ZXJ0aWNlcyBvZiBpbm5lciBhbmQgb3V0ZXIgcGF0aHMgdG8gYSBzaW5nbGUgYXJyYXlcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5jb25jYXQoIHNoYXBlSG9sZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdmVydGljZXMsIG5vcm1hbHMsIHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZVZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSBzaGFwZVZlcnRpY2VzWyBpIF07XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgMCApO1xuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdFx0XHR1dnMucHVzaCggdmVydGV4LngsIHZlcnRleC55ICk7IC8vIHdvcmxkIHV2c1xuXG5cdFx0fVxuXG5cdFx0Ly8gaW5jaWRlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBhID0gZmFjZVsgMCBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYiA9IGZhY2VbIDEgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0dmFyIGMgPSBmYWNlWyAyIF0gKyBpbmRleE9mZnNldDtcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBjICk7XG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIEVkZ2VzR2VvbWV0cnkoIGdlb21ldHJ5LCB0aHJlc2hvbGRBbmdsZSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0VkZ2VzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR0aHJlc2hvbGRBbmdsZTogdGhyZXNob2xkQW5nbGVcblx0fTtcblxuXHR0aHJlc2hvbGRBbmdsZSA9ICggdGhyZXNob2xkQW5nbGUgIT09IHVuZGVmaW5lZCApID8gdGhyZXNob2xkQW5nbGUgOiAxO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgdGhyZXNob2xkRG90ID0gTWF0aC5jb3MoIF9NYXRoLkRFRzJSQUQgKiB0aHJlc2hvbGRBbmdsZSApO1xuXHR2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlZGdlMSwgZWRnZTI7XG5cdHZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblxuXHQvLyBwcmVwYXJlIHNvdXJjZSBnZW9tZXRyeVxuXG5cdHZhciBnZW9tZXRyeTI7XG5cblx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkyID0gbmV3IEdlb21ldHJ5KCk7XG5cdFx0Z2VvbWV0cnkyLmZyb21CdWZmZXJHZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkuY2xvbmUoKTtcblxuXHR9XG5cblx0Z2VvbWV0cnkyLm1lcmdlVmVydGljZXMoKTtcblx0Z2VvbWV0cnkyLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdHZhciBzb3VyY2VWZXJ0aWNlcyA9IGdlb21ldHJ5Mi52ZXJ0aWNlcztcblx0dmFyIGZhY2VzID0gZ2VvbWV0cnkyLmZhY2VzO1xuXG5cdC8vIG5vdyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB3aGVyZSBlYWNoIGVudHJ5IHJlcHJlc2VudHMgYW4gZWRnZSB3aXRoIGl0cyBhZGpvaW5pbmcgZmFjZXNcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdGVkZ2UyID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07XG5cdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7XG5cdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSwgZmFjZTE6IGksIGZhY2UyOiB1bmRlZmluZWQgfTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRlZGdlc1sga2V5IF0uZmFjZTIgPSBpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0dmFyIGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHQvLyBhbiBlZGdlIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBiZXR3ZWVuIHRoZSBmYWNlIG5vcm1hbHMgb2YgdGhlIGFkam9pbmluZyBmYWNlcyBleGNlZWRzIHRoaXMgdmFsdWUuIGRlZmF1bHQgPSAxIGRlZ3JlZS5cblxuXHRcdGlmICggZS5mYWNlMiA9PT0gdW5kZWZpbmVkIHx8IGZhY2VzWyBlLmZhY2UxIF0ubm9ybWFsLmRvdCggZmFjZXNbIGUuZmFjZTIgXS5ub3JtYWwgKSA8PSB0aHJlc2hvbGREb3QgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNlc1sgZS5pbmRleDEgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0dmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgyIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRWRnZXNHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBDeWxpbmRlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEN5bGluZGVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N5bGluZGVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckdlb21ldHJ5O1xuXG4vLyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRyYWRpdXNUb3AgPSByYWRpdXNUb3AgIT09IHVuZGVmaW5lZCA/IHJhZGl1c1RvcCA6IDIwO1xuXHRyYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDIwO1xuXHRoZWlnaHQgPSBoZWlnaHQgIT09IHVuZGVmaW5lZCA/IGhlaWdodCA6IDEwMDtcblxuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0b3BlbkVuZGVkID0gb3BlbkVuZGVkICE9PSB1bmRlZmluZWQgPyBvcGVuRW5kZWQgOiBmYWxzZTtcblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwLjA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogMi4wICogTWF0aC5QSTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGluZGV4QXJyYXkgPSBbXTtcblx0dmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnlcblxuXHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0aWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkge1xuXG5cdFx0aWYgKCByYWRpdXNUb3AgPiAwICkgZ2VuZXJhdGVDYXAoIHRydWUgKTtcblx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7XG5cblx0XHR2YXIgeCwgeTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsXG5cdFx0dmFyIHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHR2YXIgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0dmFyIHYgPSB5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHR2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7XG5cblx0XHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cdFx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdHZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdGluZGV4Um93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0aW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Zm9yICggeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHQvLyB3ZSB1c2UgdGhlIGluZGV4IGFycmF5IHRvIGFjY2VzcyB0aGUgY29ycmVjdCBpbmRpY2VzXG5cblx0XHRcdFx0dmFyIGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0dmFyIGIgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4IF07XG5cdFx0XHRcdHZhciBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTtcblx0XHRcdFx0dmFyIGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGdyb3VwIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7XG5cblx0XHR2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7XG5cblx0XHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIHJhZGl1cyA9ICggdG9wID09PSB0cnVlICkgPyByYWRpdXNUb3AgOiByYWRpdXNCb3R0b207XG5cdFx0dmFyIHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTtcblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4XG5cdFx0Y2VudGVySW5kZXhTdGFydCA9IGluZGV4O1xuXG5cdFx0Ly8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLlxuXHRcdC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNlLFxuXHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdGZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4XG5cblx0XHRjZW50ZXJJbmRleEVuZCA9IGluZGV4O1xuXG5cdFx0Ly8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdHZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIGNvc1RoZXRhICogMC41ICkgKyAwLjU7XG5cdFx0XHR1di55ID0gKCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdHZhciBpID0gY2VudGVySW5kZXhFbmQgKyB4O1xuXG5cdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBmYWNlIHRvcFxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBmYWNlIGJvdHRvbVxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cbn1cblxuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuLy8gQ29uZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVHZW9tZXRyeTtcblxuLy8gQ29uZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIGh1Z2hlc1xuICovXG5cbi8vIENpcmNsZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5O1xuXG4vLyBDaXJjbGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCA1MDtcblx0c2VnbWVudHMgPSBzZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHNlZ21lbnRzICkgOiA4O1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdC8vIGNlbnRlciBwb2ludFxuXG5cdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdGZvciAoIHMgPSAwLCBpID0gMzsgcyA8PSBzZWdtZW50czsgcyArKywgaSArPSAzICkge1xuXG5cdFx0dmFyIHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHQvLyB2ZXJ0ZXhcblxuXHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHQvLyBub3JtYWxcblxuXHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0Ly8gdXZzXG5cblx0XHR1di54ID0gKCB2ZXJ0aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5DaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUJ1ZmZlckdlb21ldHJ5O1xuXG5cblxudmFyIEdlb21ldHJpZXMgPSBPYmplY3QuZnJlZXplKHtcblx0V2lyZWZyYW1lR2VvbWV0cnk6IFdpcmVmcmFtZUdlb21ldHJ5LFxuXHRQYXJhbWV0cmljR2VvbWV0cnk6IFBhcmFtZXRyaWNHZW9tZXRyeSxcblx0UGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdE9jdGFoZWRyb25HZW9tZXRyeTogT2N0YWhlZHJvbkdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0SWNvc2FoZWRyb25HZW9tZXRyeTogSWNvc2FoZWRyb25HZW9tZXRyeSxcblx0SWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTogSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uR2VvbWV0cnk6IERvZGVjYWhlZHJvbkdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTogRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdFBvbHloZWRyb25HZW9tZXRyeTogUG9seWhlZHJvbkdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk6IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0VHViZUdlb21ldHJ5OiBUdWJlR2VvbWV0cnksXG5cdFR1YmVCdWZmZXJHZW9tZXRyeTogVHViZUJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0tub3RHZW9tZXRyeTogVG9ydXNLbm90R2VvbWV0cnksXG5cdFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSxcblx0VG9ydXNHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNCdWZmZXJHZW9tZXRyeTogVG9ydXNCdWZmZXJHZW9tZXRyeSxcblx0VGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnksXG5cdFRleHRCdWZmZXJHZW9tZXRyeTogVGV4dEJ1ZmZlckdlb21ldHJ5LFxuXHRTcGhlcmVHZW9tZXRyeTogU3BoZXJlR2VvbWV0cnksXG5cdFNwaGVyZUJ1ZmZlckdlb21ldHJ5OiBTcGhlcmVCdWZmZXJHZW9tZXRyeSxcblx0UmluZ0dlb21ldHJ5OiBSaW5nR2VvbWV0cnksXG5cdFJpbmdCdWZmZXJHZW9tZXRyeTogUmluZ0J1ZmZlckdlb21ldHJ5LFxuXHRQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQbGFuZUJ1ZmZlckdlb21ldHJ5OiBQbGFuZUJ1ZmZlckdlb21ldHJ5LFxuXHRMYXRoZUdlb21ldHJ5OiBMYXRoZUdlb21ldHJ5LFxuXHRMYXRoZUJ1ZmZlckdlb21ldHJ5OiBMYXRoZUJ1ZmZlckdlb21ldHJ5LFxuXHRTaGFwZUdlb21ldHJ5OiBTaGFwZUdlb21ldHJ5LFxuXHRTaGFwZUJ1ZmZlckdlb21ldHJ5OiBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxuXHRFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSxcblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBFeHRydWRlQnVmZmVyR2VvbWV0cnksXG5cdEVkZ2VzR2VvbWV0cnk6IEVkZ2VzR2VvbWV0cnksXG5cdENvbmVHZW9tZXRyeTogQ29uZUdlb21ldHJ5LFxuXHRDb25lQnVmZmVyR2VvbWV0cnk6IENvbmVCdWZmZXJHZW9tZXRyeSxcblx0Q3lsaW5kZXJHZW9tZXRyeTogQ3lsaW5kZXJHZW9tZXRyeSxcblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeTogQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSxcblx0Q2lyY2xlR2VvbWV0cnk6IENpcmNsZUdlb21ldHJ5LFxuXHRDaXJjbGVCdWZmZXJHZW9tZXRyeTogQ2lyY2xlQnVmZmVyR2VvbWV0cnksXG5cdEJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSxcblx0Qm94QnVmZmVyR2VvbWV0cnk6IEJveEJ1ZmZlckdlb21ldHJ5XG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRvd01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdFNoYWRlck1hdGVyaWFsLmNhbGwoIHRoaXMsIHtcblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rWyAnc2hhZG93X3ZlcnQnIF0sXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rWyAnc2hhZG93X2ZyYWcnIF1cblx0fSApO1xuXG5cdHRoaXMubGlnaHRzID0gdHJ1ZTtcblx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLm9wYWNpdHkudmFsdWU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXHRcdFx0XHR0aGlzLnVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSApO1xuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZG93TWF0ZXJpYWw7XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdFNoYWRlck1hdGVyaWFsLmNhbGwoIHRoaXMsIHBhcmFtZXRlcnMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnO1xuXG59XG5cblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSApO1xuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7XG5cblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1Jhd1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICByb3VnaG5lc3M6IDxmbG9hdD4sXG4gKiAgbWV0YWxuZXNzOiA8ZmxvYXQ+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHJvdWdobmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbWV0YWxuZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGVudk1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hTdGFuZGFyZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMucm91Z2huZXNzID0gMC41O1xuXHR0aGlzLm1ldGFsbmVzcyA9IDAuNTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLnJvdWdobmVzc01hcCA9IG51bGw7XG5cblx0dGhpcy5tZXRhbG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7XG5cdHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3VnaG5lc3NNYXA7XG5cblx0dGhpcy5tZXRhbG5lc3NNYXAgPSBzb3VyY2UubWV0YWxuZXNzTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmVudk1hcEludGVuc2l0eSA9IHNvdXJjZS5lbnZNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaHlzaWNhbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaHlzaWNhbE1hdGVyaWFsJztcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDAuNTsgLy8gbWFwcyB0byBGMCA9IDAuMDRcblxuXHR0aGlzLmNsZWFyQ29hdCA9IDAuMDtcblx0dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSAwLjA7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaHlzaWNhbE1hdGVyaWFsO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblxuXHR0aGlzLmNsZWFyQ29hdCA9IHNvdXJjZS5jbGVhckNvYXQ7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gc291cmNlLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBzcGVjdWxhcjogPGhleD4sXG4gKiAgc2hpbmluZXNzOiA8ZmxvYXQ+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuVGV4dHVyZUN1YmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaG9uZ01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5zcGVjdWxhciA9IG5ldyBDb2xvciggMHgxMTExMTEgKTtcblx0dGhpcy5zaGluaW5lc3MgPSAzMDtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBob25nTWF0ZXJpYWw7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnNwZWN1bGFyLmNvcHkoIHNvdXJjZS5zcGVjdWxhciApO1xuXHR0aGlzLnNoaW5pbmVzcyA9IHNvdXJjZS5zaGluaW5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHRha2FoaXJveCAvIGh0dHA6Ly9naXRodWIuY29tL3Rha2FoaXJveFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZ3JhZGllbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+IClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoVG9vbk1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdUT09OJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFRvb25NYXRlcmlhbCc7XG5cblx0dGhpcy5ncmFkaWVudE1hcCA9IG51bGw7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoVG9vbk1hdGVyaWFsO1xuXG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5ncmFkaWVudE1hcCA9IHNvdXJjZS5ncmFkaWVudE1hcDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD5cbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hOb3JtYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaE5vcm1hbE1hdGVyaWFsO1xuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTGFtYmVydE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaExhbWJlcnRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hMYW1iZXJ0TWF0ZXJpYWw7XG5cbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBzY2FsZTogPGZsb2F0PixcbiAqICBkYXNoU2l6ZTogPGZsb2F0PixcbiAqICBnYXBTaXplOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZURhc2hlZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZURhc2hlZE1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblxuXHR0aGlzLnNjYWxlID0gMTtcblx0dGhpcy5kYXNoU2l6ZSA9IDM7XG5cdHRoaXMuZ2FwU2l6ZSA9IDE7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lRGFzaGVkTWF0ZXJpYWw7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlO1xuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gc291cmNlLmxpbmV3aWR0aDtcblxuXHR0aGlzLnNjYWxlID0gc291cmNlLnNjYWxlO1xuXHR0aGlzLmRhc2hTaXplID0gc291cmNlLmRhc2hTaXplO1xuXHR0aGlzLmdhcFNpemUgPSBzb3VyY2UuZ2FwU2l6ZTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5cbnZhciBNYXRlcmlhbHMgPSBPYmplY3QuZnJlZXplKHtcblx0U2hhZG93TWF0ZXJpYWw6IFNoYWRvd01hdGVyaWFsLFxuXHRTcHJpdGVNYXRlcmlhbDogU3ByaXRlTWF0ZXJpYWwsXG5cdFJhd1NoYWRlck1hdGVyaWFsOiBSYXdTaGFkZXJNYXRlcmlhbCxcblx0U2hhZGVyTWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFsLFxuXHRQb2ludHNNYXRlcmlhbDogUG9pbnRzTWF0ZXJpYWwsXG5cdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiBNZXNoUGh5c2ljYWxNYXRlcmlhbCxcblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWw6IE1lc2hTdGFuZGFyZE1hdGVyaWFsLFxuXHRNZXNoUGhvbmdNYXRlcmlhbDogTWVzaFBob25nTWF0ZXJpYWwsXG5cdE1lc2hUb29uTWF0ZXJpYWw6IE1lc2hUb29uTWF0ZXJpYWwsXG5cdE1lc2hOb3JtYWxNYXRlcmlhbDogTWVzaE5vcm1hbE1hdGVyaWFsLFxuXHRNZXNoTGFtYmVydE1hdGVyaWFsOiBNZXNoTGFtYmVydE1hdGVyaWFsLFxuXHRNZXNoRGVwdGhNYXRlcmlhbDogTWVzaERlcHRoTWF0ZXJpYWwsXG5cdE1lc2hCYXNpY01hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCxcblx0TGluZURhc2hlZE1hdGVyaWFsOiBMaW5lRGFzaGVkTWF0ZXJpYWwsXG5cdExpbmVCYXNpY01hdGVyaWFsOiBMaW5lQmFzaWNNYXRlcmlhbCxcblx0TWF0ZXJpYWw6IE1hdGVyaWFsXG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDYWNoZSA9IHtcblxuXHRlbmFibGVkOiBmYWxzZSxcblxuXHRmaWxlczoge30sXG5cblx0YWRkOiBmdW5jdGlvbiAoIGtleSwgZmlsZSApIHtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQWRkaW5nIGtleTonLCBrZXkgKTtcblxuXHRcdHRoaXMuZmlsZXNbIGtleSBdID0gZmlsZTtcblxuXHR9LFxuXG5cdGdldDogZnVuY3Rpb24gKCBrZXkgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0NoZWNraW5nIGtleTonLCBrZXkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZpbGVzWyBrZXkgXTtcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBrZXkgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRjbGVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5maWxlcyA9IHt9O1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgaXNMb2FkaW5nID0gZmFsc2UsIGl0ZW1zTG9hZGVkID0gMCwgaXRlbXNUb3RhbCA9IDA7XG5cblx0dGhpcy5vblN0YXJ0ID0gdW5kZWZpbmVkO1xuXHR0aGlzLm9uTG9hZCA9IG9uTG9hZDtcblx0dGhpcy5vblByb2dyZXNzID0gb25Qcm9ncmVzcztcblx0dGhpcy5vbkVycm9yID0gb25FcnJvcjtcblxuXHR0aGlzLml0ZW1TdGFydCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aXRlbXNUb3RhbCArKztcblxuXHRcdGlmICggaXNMb2FkaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBzY29wZS5vblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUub25TdGFydCggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpc0xvYWRpbmcgPSB0cnVlO1xuXG5cdH07XG5cblx0dGhpcy5pdGVtRW5kID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc0xvYWRlZCArKztcblxuXHRcdGlmICggc2NvcGUub25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5vblByb2dyZXNzKCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGl0ZW1zTG9hZGVkID09PSBpdGVtc1RvdGFsICkge1xuXG5cdFx0XHRpc0xvYWRpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBzY29wZS5vbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vbkxvYWQoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5pdGVtRXJyb3IgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGlmICggc2NvcGUub25FcnJvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5vbkVycm9yKCB1cmwgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbnZhciBEZWZhdWx0TG9hZGluZ01hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZpbGVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmlsZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3IgZGF0YTogVVJJXG5cdFx0dmFyIGRhdGFVcmlSZWdleCA9IC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvO1xuXHRcdHZhciBkYXRhVXJpUmVnZXhSZXN1bHQgPSB1cmwubWF0Y2goIGRhdGFVcmlSZWdleCApO1xuXG5cdFx0Ly8gU2FmYXJpIGNhbiBub3QgaGFuZGxlIERhdGEgVVJJcyB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0IHNvIHByb2Nlc3MgbWFudWFsbHlcblx0XHRpZiAoIGRhdGFVcmlSZWdleFJlc3VsdCApIHtcblxuXHRcdFx0dmFyIG1pbWVUeXBlID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAxIF07XG5cdFx0XHR2YXIgaXNCYXNlNjQgPSAhISBkYXRhVXJpUmVnZXhSZXN1bHRbIDIgXTtcblx0XHRcdHZhciBkYXRhID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAzIF07XG5cblx0XHRcdGRhdGEgPSB3aW5kb3cuZGVjb2RlVVJJQ29tcG9uZW50KCBkYXRhICk7XG5cblx0XHRcdGlmICggaXNCYXNlNjQgKSBkYXRhID0gd2luZG93LmF0b2IoIGRhdGEgKTtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHR2YXIgcmVzcG9uc2U7XG5cdFx0XHRcdHZhciByZXNwb25zZVR5cGUgPSAoIHRoaXMucmVzcG9uc2VUeXBlIHx8ICcnICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRzd2l0Y2ggKCByZXNwb25zZVR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRcdFx0Y2FzZSAnYmxvYic6XG5cblx0XHRcdFx0XHQgXHRyZXNwb25zZSA9IG5ldyBBcnJheUJ1ZmZlciggZGF0YS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDhBcnJheSggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCByZXNwb25zZVR5cGUgPT09ICdibG9iJyApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHJlc3BvbnNlIF0sIHsgdHlwZTogbWltZVR5cGUgfSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnZG9jdW1lbnQnOlxuXG5cdFx0XHRcdFx0XHR2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBtaW1lVHlwZSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2pzb24nOlxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IEpTT04ucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OiAvLyAndGV4dCcgb3Igb3RoZXJcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBkYXRhO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgbmV4dCBicm93c2VyIHRpY2tcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGlja1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHRcdHJlcXVlc3Qub3BlbiggJ0dFVCcsIHVybCwgdHJ1ZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgcmVzcG9uc2UgPSBldmVudC50YXJnZXQucmVzcG9uc2U7XG5cblx0XHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0aWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwICkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRpZiAoIG9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0XHRvblByb2dyZXNzKCBldmVudCApO1xuXG5cdFx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRpZiAoIHRoaXMucmVzcG9uc2VUeXBlICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlO1xuXHRcdFx0aWYgKCB0aGlzLndpdGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFscztcblxuXHRcdFx0aWYgKCByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUgKSByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUoIHRoaXMubWltZVR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMubWltZVR5cGUgOiAndGV4dC9wbGFpbicgKTtcblxuXHRcdFx0Zm9yICggdmFyIGhlYWRlciBpbiB0aGlzLnJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHRcdFx0cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCBoZWFkZXIsIHRoaXMucmVxdWVzdEhlYWRlclsgaGVhZGVyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0LnNlbmQoIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdHJldHVybiByZXF1ZXN0O1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVzcG9uc2VUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFdpdGhDcmVkZW50aWFsczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMud2l0aENyZWRlbnRpYWxzID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRNaW1lVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMubWltZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gYmxvY2sgYmFzZWQgdGV4dHVyZXMgbG9hZGVyIChkZHMsIHB2ciwgLi4uKVxuICovXG5cbmZ1bmN0aW9uIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdC8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzXG5cdHRoaXMuX3BhcnNlciA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgaW1hZ2VzID0gW107XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBDb21wcmVzc2VkVGV4dHVyZSgpO1xuXHRcdHRleHR1cmUuaW1hZ2UgPSBpbWFnZXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cblx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHtcblxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybFsgaSBdLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0XHR2YXIgdGV4RGF0YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpbWFnZXNbIGkgXSA9IHtcblx0XHRcdFx0XHR3aWR0aDogdGV4RGF0YXMud2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0OiB0ZXhEYXRhcy5oZWlnaHQsXG5cdFx0XHRcdFx0Zm9ybWF0OiB0ZXhEYXRhcy5mb3JtYXQsXG5cdFx0XHRcdFx0bWlwbWFwczogdGV4RGF0YXMubWlwbWFwc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGxvYWRlZCArPSAxO1xuXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XG5cblx0XHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdXJsLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xuXG5cdFx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGNvbXByZXNzZWQgY3ViZW1hcCB0ZXh0dXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBERFMgZmlsZVxuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0XHR2YXIgdGV4RGF0YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpZiAoIHRleERhdGFzLmlzQ3ViZW1hcCApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlcyA9IHRleERhdGFzLm1pcG1hcHMubGVuZ3RoIC8gdGV4RGF0YXMubWlwbWFwQ291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgZiA9IDA7IGYgPCBmYWNlczsgZiArKyApIHtcblxuXHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0gPSB7IG1pcG1hcHMgOiBbXSB9O1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YXMubWlwbWFwcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBOaWtvcyBNLiAvIGh0dHBzOi8vZ2l0aHViLmNvbS9mb28xMjMvXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKVxuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdC8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzXG5cdHRoaXMuX3BhcnNlciA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHRleERhdGEgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIgKTtcblxuXHRcdFx0aWYgKCAhIHRleERhdGEgKSByZXR1cm47XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZGF0YSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDtcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhLmhlaWdodDtcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5kYXRhID0gdGV4RGF0YS5kYXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUud3JhcFMgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFMgPyB0ZXhEYXRhLndyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblx0XHRcdHRleHR1cmUud3JhcFQgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFQgPyB0ZXhEYXRhLndyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHRcdFx0dGV4dHVyZS5tYWdGaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWFnRmlsdGVyID8gdGV4RGF0YS5tYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5taW5GaWx0ZXIgPyB0ZXhEYXRhLm1pbkZpbHRlciA6IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjtcblxuXHRcdFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmFuaXNvdHJvcHkgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5mb3JtYXQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDtcblxuXHRcdFx0fVxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEudHlwZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEubWlwbWFwcyApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAxID09PSB0ZXhEYXRhLm1pcG1hcENvdW50ICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0YSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEltYWdlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEltYWdlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdHZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaW1nJyApO1xuXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCB0aGlzICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0aGlzICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXG5cdFx0Lypcblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uUHJvZ3Jlc3MgKSBvblByb2dyZXNzKCBldmVudCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblx0XHQqL1xuXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHRpZiAoIHVybC5zdWJzdHIoIDAsIDUgKSAhPT0gJ2RhdGE6JyApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmNyb3NzT3JpZ2luICE9PSB1bmRlZmluZWQgKSBpbWFnZS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47XG5cblx0XHR9XG5cblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRpbWFnZS5zcmMgPSB1cmw7XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN1YmVUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xuXG5cdFx0XHRcdGxvYWRlZCArKztcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Ly8gSlBFR3MgY2FuJ3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBzbyBtZW1vcnkgY2FuIGJlIHNhdmVkIGJ5IHN0b3JpbmcgdGhlbSBhcyBSR0IuXG5cdFx0XHR2YXIgaXNKUEVHID0gdXJsLnNlYXJjaCggL1xcLihqcGd8anBlZykkLyApID4gMCB8fCB1cmwuc2VhcmNoKCAvXmRhdGFcXDppbWFnZVxcL2pwZWcvICkgPT09IDA7XG5cblx0XHRcdHRleHR1cmUuZm9ybWF0ID0gaXNKUEVHID8gUkdCRm9ybWF0IDogUkdCQUZvcm1hdDtcblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsXG5cblx0aXNIZW1pc3BoZXJlTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuU3BvdExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdyxcblxuXHRpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHR2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cblx0XHR2YXIgZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZTtcblx0XHR2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcblx0XHR2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XG5cblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZlxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gTWF0aC5QSTtcblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuYW5nbGUgPSAoIGFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IGFuZ2xlIDogTWF0aC5QSSAvIDM7XG5cdHRoaXMucGVudW1icmEgPSAoIHBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSA/IHBlbnVtYnJhIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xuXG59XG5cblNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHQsXG5cblx0aXNTcG90TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7XG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvICggNCAqIE1hdGguUEkgKTtcblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTtcdC8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQgYmUgMi5cblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBMaWdodFNoYWRvdyggbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA5MCwgMSwgMC41LCA1MDAgKSApO1xuXG59XG5cblBvaW50TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9pbnRMaWdodCxcblxuXHRpc1BvaW50TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCApIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDUsIDUsIDUsIC0gNSwgMC41LCA1MDAgKSApO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodFNoYWRvd1xuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0LFxuXG5cdGlzRGlyZWN0aW9uYWxMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQW1iaWVudExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnQW1iaWVudExpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cbn1cblxuQW1iaWVudExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFtYmllbnRMaWdodCxcblxuXHRpc0FtYmllbnRMaWdodDogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICovXG5cbmZ1bmN0aW9uIFJlY3RBcmVhTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdSZWN0QXJlYUxpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLnNldCggMCwgMSwgMCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMud2lkdGggPSAoIHdpZHRoICE9PSB1bmRlZmluZWQgKSA/IHdpZHRoIDogMTA7XG5cdHRoaXMuaGVpZ2h0ID0gKCBoZWlnaHQgIT09IHVuZGVmaW5lZCApID8gaGVpZ2h0IDogMTA7XG5cblx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IGRpc3RhbmNlL2RlY2F5XG5cblx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHVwZGF0ZSBtZXRob2QgZm9yIFJlY3RBcmVhTGlnaHQgdG8gdXBkYXRlIHRyYW5zZm9ybSB0byBsb29rYXQgdGFyZ2V0XG5cblx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNoYWRvd3NcblxufVxuXG4vLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCB1cGRhdGUgd2hlbiBsaWdodCBzaGFwZSBpcyBjaGFuZ2VkXG5SZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsXG5cblx0aXNSZWN0QXJlYUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbnZhciBBbmltYXRpb25VdGlscyA9IHtcblxuXHQvLyBzYW1lIGFzIEFycmF5LnByb3RvdHlwZS5zbGljZSwgYnV0IGFsc28gd29ya3Mgb24gdHlwZWQgYXJyYXlzXG5cdGFycmF5U2xpY2U6IGZ1bmN0aW9uICggYXJyYXksIGZyb20sIHRvICkge1xuXG5cdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdC8vIGluIGlvczkgYXJyYXkuc3ViYXJyYXkoZnJvbSwgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gYnV0IGFycmF5LnN1YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdFxuXHRcdFx0cmV0dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoIGZyb20sIHRvICk7XG5cblx0fSxcblxuXHQvLyBjb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGVcblx0Y29udmVydEFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCB0eXBlLCBmb3JjZUNsb25lICkge1xuXG5cdFx0aWYgKCAhIGFycmF5IHx8IC8vIGxldCAndW5kZWZpbmVkJyBhbmQgJ251bGwnIHBhc3Ncblx0XHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHRcdCEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWRcblx0Z2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHtcblxuXHRcdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xuXG5cdFx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xuXG5cdFx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhXG5cdHNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcblxuXHRcdHZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0c1xuXHRmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XG5cblx0XHR2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XG5cblx0XHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0dmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVzLCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBpbnRlcnBvbGFudHMgb3ZlciBwYXJhbWV0cmljIHNhbXBsZXMuXG4gKlxuICogVGhlIHBhcmFtZXRlciBkb21haW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRpbWUgb3IgYSBwYXRoXG4gKiBhbG9uZyBhIGN1cnZlIGRlZmluZWQgYnkgdGhlIGRhdGEuXG4gKlxuICogVGhlIHNhbXBsZSB2YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFsaXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5XG4gKiBhcHBseSBzcGVjaWFsIGludGVycHJldGF0aW9ucyB0byB0aGUgZGF0YS5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0aG9kLCBkZWZlcnJpbmdcbiAqIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0byBkZXJpdmVkIGNsYXNzZXMuXG4gKlxuICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nlc3MgY3Jvc3NpbmcgYXQgbW9zdCB0d28gcG9pbnRzXG4gKiBhbmQgTyhsb2cgTikgZm9yIHJhbmRvbSBhY2Nlc3MsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMuXG4gKlxuICogUmVmZXJlbmNlczpcbiAqXG4gKiBcdFx0aHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVtcGxhdGUtbWV0aG9kLXBhdHRlcm4uaHRtbFxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHR0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFtZXRlclBvc2l0aW9ucztcblx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXG5cdHRoaXMucmVzdWx0QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0cmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApO1xuXHR0aGlzLnNhbXBsZVZhbHVlcyA9IHNhbXBsZVZhbHVlcztcblx0dGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdGV2YWx1YXRlOiBmdW5jdGlvbiggdCApIHtcblxuXHRcdHZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0aTEgPSB0aGlzLl9jYWNoZWRJbmRleCxcblxuXHRcdFx0dDEgPSBwcFsgICBpMSAgIF0sXG5cdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdHZhbGlkYXRlX2ludGVydmFsOiB7XG5cblx0XHRcdHNlZWs6IHtcblxuXHRcdFx0XHR2YXIgcmlnaHQ7XG5cblx0XHRcdFx0bGluZWFyX3NjYW46IHtcblx0XHRcdFx0XHQvLy0gU2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbXBhcmlzb24tdG8tdW5kZWZpbmVkLzNcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXG5cdFx0XHRcdFx0Ly8tIFx0XHRcdFx0aWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0Zm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEgKSApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGdpdmVVcEF0ID0gaTEgKyAyOyA7KSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBhZnRlciBlbmRcblxuXHRcdFx0XHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQsIHQwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQwID0gdDE7XG5cdFx0XHRcdFx0XHRcdHQxID0gcHBbICsrIGkxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXHRcdFx0XHRcdGlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aWYgKCAhICggdCA+PSB0MCApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsb29waW5nP1xuXG5cdFx0XHRcdFx0XHR2YXIgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSAtIDI7IDspIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBiZWZvcmUgc3RhcnRcblxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQxID0gdDA7XG5cdFx0XHRcdFx0XHRcdHQwID0gcHBbIC0tIGkxIC0gMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA+PSB0MCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IGkxO1xuXHRcdFx0XHRcdFx0aTEgPSAwO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0aGUgaW50ZXJ2YWwgaXMgdmFsaWRcblxuXHRcdFx0XHRcdGJyZWFrIHZhbGlkYXRlX2ludGVydmFsO1xuXG5cdFx0XHRcdH0gLy8gbGluZWFyIHNjYW5cblxuXHRcdFx0XHQvLyBiaW5hcnkgc2VhcmNoXG5cblx0XHRcdFx0d2hpbGUgKCBpMSA8IHJpZ2h0ICkge1xuXG5cdFx0XHRcdFx0dmFyIG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxO1xuXG5cdFx0XHRcdFx0aWYgKCB0IDwgcHBbIG1pZCBdICkge1xuXG5cdFx0XHRcdFx0XHRyaWdodCA9IG1pZDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGkxID0gbWlkICsgMTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dDEgPSBwcFsgICBpMSAgIF07XG5cdFx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0XHRcdC8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpblxuXG5cdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IC8vIHNlZWtcblxuXHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblxuXHRcdFx0dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7XG5cblx0XHR9IC8vIHZhbGlkYXRlX2ludGVydmFsXG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcblxuXHR9LFxuXG5cdHNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMgc2V0dGluZ3Mgc3RydWN0dXJlXG5cdC8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2VudHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLlxuXG5cdC8vIC0tLSBQcm90ZWN0ZWQgaW50ZXJmYWNlXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge30sXG5cblx0Z2V0U2V0dGluZ3NfOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXztcblxuXHR9LFxuXG5cdGNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uKCBpbmRleCApIHtcblxuXHRcdC8vIGNvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlclxuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGluZGV4ICogc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gVGVtcGxhdGUgbWV0aG9kcyBmb3IgZGVyaXZlZCBjbGFzc2VzOlxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoIFwiY2FsbCB0byBhYnN0cmFjdCBtZXRob2RcIiApO1xuXHRcdC8vIGltcGxlbWVudGF0aW9ucyBzaGFsbCByZXR1cm4gdGhpcy5yZXN1bHRCdWZmZXJcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0Ly8gZW1wdHlcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdC8vKCAwLCB0LCB0MCApLCByZXR1cm5zIHRoaXMucmVzdWx0QnVmZmVyXG5cdGJlZm9yZVN0YXJ0XzogSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sXG5cblx0Ly8oIE4tMSwgdE4tMSwgdCApLCByZXR1cm5zIHRoaXMucmVzdWx0QnVmZmVyXG5cdGFmdGVyRW5kXzogSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sXG5cbn0gKTtcblxuLyoqXG4gKiBGYXN0IGFuZCBzaW1wbGUgY3ViaWMgc3BsaW5lIGludGVycG9sYW50LlxuICpcbiAqIEl0IHdhcyBkZXJpdmVkIGZyb20gYSBIZXJtaXRpYW4gY29uc3RydWN0aW9uIHNldHRpbmcgdGhlIGZpcnN0IGRlcml2YXRpdmVcbiAqIGF0IGVhY2ggc2FtcGxlIHBvc2l0aW9uIHRvIHRoZSBsaW5lYXIgc2xvcGUgYmV0d2VlbiBuZWlnaGJvcmluZyBwb3NpdGlvbnNcbiAqIG92ZXIgdGhlaXIgcGFyYW1ldGVyIGludGVydmFsLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoXG5cdFx0XHR0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cblx0dGhpcy5fd2VpZ2h0UHJldiA9IC0wO1xuXHR0aGlzLl9vZmZzZXRQcmV2ID0gLTA7XG5cdHRoaXMuX3dlaWdodE5leHQgPSAtMDtcblx0dGhpcy5fb2Zmc2V0TmV4dCA9IC0wO1xuXG59XG5cbkN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3ViaWNJbnRlcnBvbGFudCxcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7XG5cblx0XHRlbmRpbmdTdGFydDogXHRaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDpcdFx0WmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24oIGkxLCB0MCwgdDEgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGlQcmV2ID0gaTEgLSAyLFxuXHRcdFx0aU5leHQgPSBpMSArIDEsXG5cblx0XHRcdHRQcmV2ID0gcHBbIGlQcmV2IF0sXG5cdFx0XHR0TmV4dCA9IHBwWyBpTmV4dCBdO1xuXG5cdFx0aWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0ICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodDApID0gMFxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSAyICogdDAgLSB0MTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlQcmV2ID0gcHAubGVuZ3RoIC0gMjtcblx0XHRcdFx0XHR0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdE5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0TikgPSAwXG5cdFx0XHRcdFx0aU5leHQgPSBpMTtcblx0XHRcdFx0XHR0TmV4dCA9IDIgKiB0MSAtIHQwO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aU5leHQgPSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpTmV4dCA9IGkxIC0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgaGFsZkR0ID0gKCB0MSAtIHQwICkgKiAwLjUsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZTtcblxuXHRcdHRoaXMuX3dlaWdodFByZXYgPSBoYWxmRHQgLyAoIHQwIC0gdFByZXYgKTtcblx0XHR0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKCB0TmV4dCAtIHQxICk7XG5cdFx0dGhpcy5fb2Zmc2V0UHJldiA9IGlQcmV2ICogc3RyaWRlO1xuXHRcdHRoaXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlkZTtcblxuXHR9LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvMSA9IGkxICogc3RyaWRlLFx0XHRvMCA9IG8xIC0gc3RyaWRlLFxuXHRcdFx0b1AgPSB0aGlzLl9vZmZzZXRQcmV2LCBcdG9OID0gdGhpcy5fb2Zmc2V0TmV4dCxcblx0XHRcdHdQID0gdGhpcy5fd2VpZ2h0UHJldixcdHdOID0gdGhpcy5fd2VpZ2h0TmV4dCxcblxuXHRcdFx0cCA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcblx0XHRcdHBwID0gcCAqIHAsXG5cdFx0XHRwcHAgPSBwcCAqIHA7XG5cblx0XHQvLyBldmFsdWF0ZSBwb2x5bm9taWFsc1xuXG5cdFx0dmFyIHNQID0gICAgIC0gd1AgICAqIHBwcCAgICsgICAgICAgICAyICogd1AgICAgKiBwcCAgICAtICAgICAgICAgIHdQICAgKiBwO1xuXHRcdHZhciBzMCA9ICggMSArIHdQICkgKiBwcHAgICArICgtMS41IC0gMiAqIHdQICkgICogcHAgICAgKyAoIC0wLjUgKyB3UCApICogcCAgICAgKyAxO1xuXHRcdHZhciBzMSA9ICgtMSAtIHdOICkgKiBwcHAgICArICggMS41ICsgICB3TiAgICkgICogcHAgICAgKyAgICAwLjUgICAgICAgICogcDtcblx0XHR2YXIgc04gPSAgICAgICB3TiAgICogcHBwICAgLSAgICAgICAgICAgd04gICAgICAqIHBwO1xuXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIExpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b2Zmc2V0MSA9IGkxICogc3RyaWRlLFxuXHRcdFx0b2Zmc2V0MCA9IG9mZnNldDEgLSBzdHJpZGUsXG5cblx0XHRcdHdlaWdodDEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXG5cdFx0XHR3ZWlnaHQwID0gMSAtIHdlaWdodDE7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MCArIGkgXSAqIHdlaWdodDAgK1xuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MSArIGkgXSAqIHdlaWdodDE7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBJbnRlcnBvbGFudCB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc2FtcGxlIHZhbHVlIGF0IHRoZSBwb3NpdGlvbiBwcmVjZWVkaW5nXG4gKiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBEaXNjcmV0ZUludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5EaXNjcmV0ZUludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpc2NyZXRlSW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIGkxIC0gMSApO1xuXG5cdH1cblxufSApO1xuXG52YXIgS2V5ZnJhbWVUcmFja1Byb3RvdHlwZTtcblxuS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSA9IHtcblxuXHRUaW1lQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LFxuXHRWYWx1ZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBEaXNjcmV0ZUludGVycG9sYW50KFxuXHRcdFx0XHR0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0dGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgQ3ViaWNJbnRlcnBvbGFudChcblx0XHRcdFx0dGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0c2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0dmFyIGZhY3RvcnlNZXRob2Q7XG5cblx0XHRzd2l0Y2ggKCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlRGlzY3JldGU6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlU21vb3RoOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdGlmICggZmFjdG9yeU1ldGhvZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IFwidW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgXCIgK1xuXHRcdFx0XHRcdHRoaXMuVmFsdWVUeXBlTmFtZSArIFwiIGtleWZyYW1lIHRyYWNrIG5hbWVkIFwiICsgdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCwgdW5sZXNzIHRoZSBkZWZhdWx0IGl0c2VsZiBpcyBtZXNzZWQgdXBcblx0XHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUud2FybiggbWVzc2FnZSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZhY3RvcnlNZXRob2Q7XG5cblx0fSxcblxuXHRnZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRzd2l0Y2ggKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ICkge1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlRGlzY3JldGU7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlTGluZWFyO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZVNtb290aDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGdldFZhbHVlU2l6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCAvIHRoaXMudGltZXMubGVuZ3RoO1xuXG5cdH0sXG5cblx0Ly8gbW92ZSBhbGwga2V5ZnJhbWVzIGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMgaW4gdGltZVxuXHRzaGlmdDogZnVuY3Rpb24gKCB0aW1lT2Zmc2V0ICkge1xuXG5cdFx0aWYgKCB0aW1lT2Zmc2V0ICE9PSAwLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICs9IHRpbWVPZmZzZXQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gc2NhbGUgYWxsIGtleWZyYW1lIHRpbWVzIGJ5IGEgZmFjdG9yICh1c2VmdWwgZm9yIGZyYW1lIDwtPiBzZWNvbmRzIGNvbnZlcnNpb25zKVxuXHRzY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHRpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dGltZXNbIGkgXSAqPSB0aW1lU2NhbGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBrZXlmcmFtZXMgYmVmb3JlIGFuZCBhZnRlciBhbmltYXRpb24gd2l0aG91dCBjaGFuZ2luZyBhbnkgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgW3N0YXJ0VGltZSwgZW5kVGltZV0uXG5cdC8vIElNUE9SVEFOVDogV2UgZG8gbm90IHNoaWZ0IGFyb3VuZCBrZXlzIHRvIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgdGltZSwgYmVjYXVzZSBmb3IgaW50ZXJwb2xhdGVkIGtleXMgdGhpcyB3aWxsIGNoYW5nZSB0aGVpciB2YWx1ZXNcblx0dHJpbTogZnVuY3Rpb24gKCBzdGFydFRpbWUsIGVuZFRpbWUgKSB7XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGgsXG5cdFx0XHRmcm9tID0gMCxcblx0XHRcdHRvID0gbktleXMgLSAxO1xuXG5cdFx0d2hpbGUgKCBmcm9tICE9PSBuS2V5cyAmJiB0aW1lc1sgZnJvbSBdIDwgc3RhcnRUaW1lICkgKysgZnJvbTtcblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkgLS0gdG87XG5cblx0XHQrKyB0bzsgLy8gaW5jbHVzaXZlIC0+IGV4Y2x1c2l2ZSBib3VuZFxuXG5cdFx0aWYgKCBmcm9tICE9PSAwIHx8IHRvICE9PSBuS2V5cyApIHtcblxuXHRcdFx0Ly8gZW1wdHkgdHJhY2tzIGFyZSBmb3JiaWRkZW4sIHNvIGtlZXAgYXQgbGVhc3Qgb25lIGtleWZyYW1lXG5cdFx0XHRpZiAoIGZyb20gPj0gdG8gKSB0byA9IE1hdGgubWF4KCB0bywgMSApLCBmcm9tID0gdG8gLSAxO1xuXG5cdFx0XHR2YXIgc3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcblx0XHRcdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgZnJvbSwgdG8gKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuXG5cdFx0XHRcdFx0YXJyYXlTbGljZSggdGhpcy52YWx1ZXMsIGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGVuc3VyZSB3ZSBkbyBub3QgZ2V0IGEgR2FyYmFnZUluR2FyYmFnZU91dCBzaXR1YXRpb24sIG1ha2Ugc3VyZSB0cmFja3MgYXJlIGF0IGxlYXN0IG1pbmltYWxseSB2aWFibGVcblx0dmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2YWxpZCA9IHRydWU7XG5cblx0XHR2YXIgdmFsdWVTaXplID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcblx0XHRpZiAoIHZhbHVlU2l6ZSAtIE1hdGguZmxvb3IoIHZhbHVlU2l6ZSApICE9PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcImludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFja1wiLCB0aGlzICk7XG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aDtcblxuXHRcdGlmICggbktleXMgPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwidHJhY2sgaXMgZW1wdHlcIiwgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggXCJ0aW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlclwiLCB0aGlzLCBpLCBjdXJyVGltZSApO1xuXHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHByZXZUaW1lICE9PSBudWxsICYmIHByZXZUaW1lID4gY3VyclRpbWUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggXCJvdXQgb2Ygb3JkZXIga2V5c1wiLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJldlRpbWUgPSBjdXJyVGltZTtcblxuXHRcdH1cblxuXHRcdGlmICggdmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGlzTmFOKCB2YWx1ZSApICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBcInZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlclwiLCB0aGlzLCBpLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSxcblxuXHRcdFx0c21vb3RoSW50ZXJwb2xhdGlvbiA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpID09PSBJbnRlcnBvbGF0ZVNtb290aCxcblxuXHRcdFx0d3JpdGVJbmRleCA9IDEsXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHR2YXIga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHR2YXIgdGltZSA9IHRpbWVzWyBpIF07XG5cdFx0XHR2YXIgdGltZU5leHQgPSB0aW1lc1sgaSArIDEgXTtcblxuXHRcdFx0Ly8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZVxuXG5cdFx0XHRpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lWyAwIF0gKSApIHtcblxuXHRcdFx0XHRpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnNcblxuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldE4gKyBqIF0gKSB7XG5cblx0XHRcdFx0XHRcdFx0a2VlcCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGtlZXAgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGluLXBsYWNlIGNvbXBhY3Rpb25cblxuXHRcdFx0aWYgKCBrZWVwICkge1xuXG5cdFx0XHRcdGlmICggaSAhPT0gd3JpdGVJbmRleCApIHtcblxuXHRcdFx0XHRcdHRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0dmFyIHJlYWRPZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0d3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKVxuXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxuXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqIClcblxuXHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB3cml0ZUluZGV4ICE9PSB0aW1lcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgMCwgd3JpdGVJbmRleCApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB2YWx1ZXMsIDAsIHdyaXRlSW5kZXggKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gS2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgdGhyb3cgbmV3IEVycm9yKCBcInRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkXCIgKTtcblxuXHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCBcIm5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCBcIiArIG5hbWUgKTtcblxuXHR9XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblxuXHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApO1xuXHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0dGhpcy52YWxpZGF0ZSgpO1xuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiB2ZWN0b3JlZCBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuVmVjdG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPVxuXHRcdE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBWZWN0b3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICd2ZWN0b3InXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG59ICk7XG5cbi8qKlxuICogU3BoZXJpY2FsIGxpbmVhciB1bml0IHF1YXRlcm5pb24gaW50ZXJwb2xhbnQuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b2Zmc2V0ID0gaTEgKiBzdHJpZGUsXG5cblx0XHRcdGFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApO1xuXG5cdFx0Zm9yICggdmFyIGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkge1xuXG5cdFx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0LCAwLFxuXHRcdFx0XHRcdHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlID1cblx0XHRPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoXG5cdFx0XHRcdHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkIC8vIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIG51bWVyaWMga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBOdW1iZXJLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuTnVtYmVyS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPVxuXHRcdE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBOdW1iZXJLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdudW1iZXInXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5nc1xuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gU3RyaW5nS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlID1cblx0XHRPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnc3RyaW5nJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcyApO1xuXG59XG5cbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9XG5cdFx0T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5Db2xvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID1cblx0XHRPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblxuXHQvLyBOb3RlOiBWZXJ5IGJhc2ljIGltcGxlbWVudGF0aW9uIGFuZCBub3RoaW5nIHNwZWNpYWwgeWV0LlxuXHQvLyBIb3dldmVyLCB0aGlzIGlzIHRoZSBwbGFjZSBmb3IgY29sb3Igc3BhY2UgcGFyYW1ldGVyaXphdGlvbi5cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIHRpbWVkIHNlcXVlbmNlIG9mIGtleWZyYW1lcyBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEtleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxufVxuXG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IEtleWZyYW1lVHJhY2tQcm90b3R5cGU7XG5LZXlmcmFtZVRyYWNrUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gS2V5ZnJhbWVUcmFjaztcblxuLy8gU3RhdGljIG1ldGhvZHM6XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2ssIHtcblxuXHQvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uXG5cdC8vIGFuZCBhdXRvbWF0aWMgaW52b2NhdGlvbiBvZiAudG9KU09OKTpcblxuXHRwYXJzZTogZnVuY3Rpb24oIGpzb24gKSB7XG5cblx0XHRpZigganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggXCJ0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZVwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gS2V5ZnJhbWVUcmFjay5fZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0XHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTigganNvbi5rZXlzLCB0aW1lcywgdmFsdWVzLCAndmFsdWUnICk7XG5cblx0XHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzc3VtZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgYmFzZVxuXHRcdFx0cmV0dXJuIG5ldyB0cmFja1R5cGUoXG5cdFx0XHRcdFx0anNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uKCB0cmFjayApIHtcblxuXHRcdHZhciB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjtcblxuXHRcdHZhciBqc29uO1xuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZFxuXHRcdGlmICggdHJhY2tUeXBlLnRvSlNPTiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRqc29uID0gdHJhY2tUeXBlLnRvSlNPTiggdHJhY2sgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGUgZGF0YSBjYW4gYmUgc2VyaWFsaXplZCBhcy1pc1xuXHRcdFx0anNvbiA9IHtcblxuXHRcdFx0XHQnbmFtZSc6IHRyYWNrLm5hbWUsXG5cdFx0XHRcdCd0aW1lcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudGltZXMsIEFycmF5ICksXG5cdFx0XHRcdCd2YWx1ZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnZhbHVlcywgQXJyYXkgKVxuXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhdGlvbiA9IHRyYWNrLmdldEludGVycG9sYXRpb24oKTtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0cmFjay5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRqc29uLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRqc29uLnR5cGUgPSB0cmFjay5WYWx1ZVR5cGVOYW1lOyAvLyBtYW5kYXRvcnlcblxuXHRcdHJldHVybiBqc29uO1xuXG5cdH0sXG5cblx0X2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWU6IGZ1bmN0aW9uKCB0eXBlTmFtZSApIHtcblxuXHRcdHN3aXRjaCggdHlwZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblxuXHRcdFx0Y2FzZSBcInNjYWxhclwiOlxuXHRcdFx0Y2FzZSBcImRvdWJsZVwiOlxuXHRcdFx0Y2FzZSBcImZsb2F0XCI6XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRjYXNlIFwiaW50ZWdlclwiOlxuXG5cdFx0XHRcdHJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlIFwidmVjdG9yXCI6XG5cdFx0XHRjYXNlIFwidmVjdG9yMlwiOlxuXHRcdFx0Y2FzZSBcInZlY3RvcjNcIjpcblx0XHRcdGNhc2UgXCJ2ZWN0b3I0XCI6XG5cblx0XHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgXCJjb2xvclwiOlxuXG5cdFx0XHRcdHJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgXCJxdWF0ZXJuaW9uXCI6XG5cblx0XHRcdFx0cmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlIFwiYm9vbFwiOlxuXHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblxuXHRcdFx0XHRyZXR1cm4gQm9vbGVhbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblxuXHRcdFx0XHRyZXR1cm4gU3RyaW5nS2V5ZnJhbWVUcmFjaztcblxuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvciggXCJVbnN1cHBvcnRlZCB0eXBlTmFtZTogXCIgKyB0eXBlTmFtZSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQ2xpcCggbmFtZSwgZHVyYXRpb24sIHRyYWNrcyApIHtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR0aGlzLnRyYWNrcyA9IHRyYWNrcztcblx0dGhpcy5kdXJhdGlvbiA9ICggZHVyYXRpb24gIT09IHVuZGVmaW5lZCApID8gZHVyYXRpb24gOiAtIDE7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xuXG5cdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XG5cblx0fVxuXG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sucGFyc2UoIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XG5cblx0XHR2YXIganNvbiA9IHtcblxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrc1xuXG5cdFx0fTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG51bU1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdHRpbWVzLnB1c2goXG5cdFx0XHRcdFx0KCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLFxuXHRcdFx0XHRcdGksXG5cdFx0XHRcdFx0KCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7XG5cblx0XHRcdHZhbHVlcy5wdXNoKCAwLCAxLCAwICk7XG5cblx0XHRcdHZhciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XG5cdFx0XHR0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTtcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZVxuXHRcdFx0Ly8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuXG5cdFx0XHRpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7XG5cblx0XHRcdFx0dGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyYWNrcy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKFxuXHRcdFx0XHRcdFx0Jy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLFxuXHRcdFx0XHRcdFx0dGltZXMsIHZhbHVlc1xuXHRcdFx0XHRcdCkuc2NhbGUoIDEuMCAvIGZwcyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIG5hbWUsIC0gMSwgdHJhY2tzICk7XG5cblx0fSxcblxuXHRmaW5kQnlOYW1lOiBmdW5jdGlvbiAoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkge1xuXG5cdFx0dmFyIGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXG5cdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7XG5cblx0XHRcdHZhciBvID0gb2JqZWN0T3JDbGlwQXJyYXk7XG5cdFx0XHRjbGlwQXJyYXkgPSBvLmdlb21ldHJ5ICYmIG8uZ2VvbWV0cnkuYW5pbWF0aW9ucyB8fCBvLmFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGNsaXBBcnJheVsgaSBdLm5hbWUgPT09IG5hbWUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNsaXBBcnJheVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzOiBmdW5jdGlvbiAoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgPSB7fTtcblxuXHRcdC8vIHRlc3RlZCB3aXRoIGh0dHBzOi8vcmVnZXgxMDEuY29tLyBvbiB0cmljayBzZXF1ZW5jZXNcblx0XHQvLyBzdWNoIGZsYW1pbmdvX2ZseUFfMDAzLCBmbGFtaW5nb19ydW4xXzAwMywgY3JkZWF0aDAwNTlcblx0XHR2YXIgcGF0dGVybiA9IC9eKFtcXHctXSo/KShbXFxkXSspJC87XG5cblx0XHQvLyBzb3J0IG1vcnBoIHRhcmdldCBuYW1lcyBpbnRvIGFuaW1hdGlvbiBncm91cHMgYmFzZWRcblx0XHQvLyBwYXR0ZXJucyBsaWtlIFdhbGtfMDAxLCBXYWxrXzAwMiwgUnVuXzAwMSwgUnVuXzAwMlxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXHRcdFx0dmFyIHBhcnRzID0gbW9ycGhUYXJnZXQubmFtZS5tYXRjaCggcGF0dGVybiApO1xuXG5cdFx0XHRpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0dmFyIG5hbWUgPSBwYXJ0c1sgMSBdO1xuXG5cdFx0XHRcdHZhciBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdO1xuXHRcdFx0XHRpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSA9IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNsaXBzID0gW107XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0Y2xpcHMucHVzaCggQW5pbWF0aW9uQ2xpcC5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSggbmFtZSwgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSwgZnBzLCBub0xvb3AgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsaXBzO1xuXG5cdH0sXG5cblx0Ly8gcGFyc2UgdGhlIGFuaW1hdGlvbi5oaWVyYXJjaHkgZm9ybWF0XG5cdHBhcnNlQW5pbWF0aW9uOiBmdW5jdGlvbiAoIGFuaW1hdGlvbiwgYm9uZXMgKSB7XG5cblx0XHRpZiAoICEgYW5pbWF0aW9uICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIiAgbm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YVwiICk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciBhZGROb25lbXB0eVRyYWNrID0gZnVuY3Rpb24gKCB0cmFja1R5cGUsIHRyYWNrTmFtZSwgYW5pbWF0aW9uS2V5cywgcHJvcGVydHlOYW1lLCBkZXN0VHJhY2tzICkge1xuXG5cdFx0XHQvLyBvbmx5IHJldHVybiB0cmFjayBpZiB0aGVyZSBhcmUgYWN0dWFsbHkga2V5cy5cblx0XHRcdGlmICggYW5pbWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTiggYW5pbWF0aW9uS2V5cywgdGltZXMsIHZhbHVlcywgcHJvcGVydHlOYW1lICk7XG5cblx0XHRcdFx0Ly8gZW1wdHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBjaGVjayBhZ2FpblxuXHRcdFx0XHRpZiAoIHRpbWVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0XHRcdGRlc3RUcmFja3MucHVzaCggbmV3IHRyYWNrVHlwZSggdHJhY2tOYW1lLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0XHR2YXIgdHJhY2tzID0gW107XG5cblx0XHR2YXIgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAnZGVmYXVsdCc7XG5cdFx0Ly8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuXG5cdFx0dmFyIGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7XG5cdFx0dmFyIGZwcyA9IGFuaW1hdGlvbi5mcHMgfHwgMzA7XG5cblx0XHR2YXIgaGllcmFyY2h5VHJhY2tzID0gYW5pbWF0aW9uLmhpZXJhcmNoeSB8fCBbXTtcblxuXHRcdGZvciAoIHZhciBoID0gMDsgaCA8IGhpZXJhcmNoeVRyYWNrcy5sZW5ndGg7IGggKysgKSB7XG5cblx0XHRcdHZhciBhbmltYXRpb25LZXlzID0gaGllcmFyY2h5VHJhY2tzWyBoIF0ua2V5cztcblxuXHRcdFx0Ly8gc2tpcCBlbXB0eSB0cmFja3Ncblx0XHRcdGlmICggISBhbmltYXRpb25LZXlzIHx8IGFuaW1hdGlvbktleXMubGVuZ3RoID09PSAwICkgY29udGludWU7XG5cblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggdGFyZ2V0cyBpbiBhIHdheSBleGFjdGx5IGNvbXBhdGlibGVcblx0XHRcdC8vIHdpdGggQW5pbWF0aW9uSGFuZGxlci5pbml0KCBhbmltYXRpb24gKVxuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyAwIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdC8vIGZpZ3VyZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldE5hbWVzID0ge307XG5cblx0XHRcdFx0Zm9yICggdmFyIGsgPSAwOyBrIDwgYW5pbWF0aW9uS2V5cy5sZW5ndGg7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSA8IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1vcnBoVGFyZ2V0TmFtZXNbIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGNyZWF0ZSBhIHRyYWNrIGZvciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvXG5cdFx0XHRcdC8vIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoXG5cdFx0XHRcdC8vIHRoZSBtb3JwaFRhcmdldCBpcyBuYW1lZC5cblx0XHRcdFx0Zm9yICggdmFyIG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3JwaFRhcmdldE5hbWVzICkge1xuXG5cdFx0XHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG0gPSAwOyBtICE9PSBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgKysgbSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGFuaW1hdGlvbktleSA9IGFuaW1hdGlvbktleXNbIGsgXTtcblxuXHRcdFx0XHRcdFx0dGltZXMucHVzaCggYW5pbWF0aW9uS2V5LnRpbWUgKTtcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdldCA9PT0gbW9ycGhUYXJnZXROYW1lICkgPyAxIDogMCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhY2tzLnB1c2goIG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCAnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWycgKyBtb3JwaFRhcmdldE5hbWUgKyAnXScsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkdXJhdGlvbiA9IG1vcnBoVGFyZ2V0TmFtZXMubGVuZ3RoICogKCBmcHMgfHwgMS4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gLi4uYXNzdW1lIHNrZWxldGFsIGFuaW1hdGlvblxuXG5cdFx0XHRcdHZhciBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJztcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJyxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFx0UXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5xdWF0ZXJuaW9uJyxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdyb3QnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJyxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0cmFja3MubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciBjbGlwID0gbmV3IEFuaW1hdGlvbkNsaXAoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzICk7XG5cblx0XHRyZXR1cm4gY2xpcDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcC5wcm90b3R5cGUsIHtcblxuXHRyZXNldER1cmF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gdGhpcy50cmFja3MsIGR1cmF0aW9uID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRoaXMudHJhY2tzWyBpIF07XG5cblx0XHRcdGR1cmF0aW9uID0gTWF0aC5tYXgoIGR1cmF0aW9uLCB0cmFjay50aW1lc1sgdHJhY2sudGltZXMubGVuZ3RoIC0gMSBdICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cblx0fSxcblxuXHR0cmltOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0udHJpbSggMCwgdGhpcy5kdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE1hdGVyaWFsTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXHR0aGlzLnRleHR1cmVzID0ge307XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0ZXJpYWxMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnanNvbicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIGpzb24gKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZXM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy50ZXh0dXJlcztcblxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbHNbIGpzb24udHlwZSBdKCk7XG5cblx0XHRpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDtcblx0XHRpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24uY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXQgPSBqc29uLmNsZWFyQ29hdDtcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyQ29hdFJvdWdobmVzcztcblx0XHRpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3Jtcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9ycztcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcblx0XHRpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hhZGluZyA9IGpzb24uc2hhZGluZztcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblxuXHRcdC8vIGZvciBQb2ludHNNYXRlcmlhbFxuXG5cdFx0aWYgKCBqc29uLnNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemUgPSBqc29uLnNpemU7XG5cdFx0aWYgKCBqc29uLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID0ganNvbi5zaXplQXR0ZW51YXRpb247XG5cblx0XHQvLyBtYXBzXG5cblx0XHRpZiAoIGpzb24ubWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsLmFscGhhTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbHBoYU1hcCApO1xuXHRcdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmJ1bXBNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmJ1bXBNYXAgKTtcblx0XHRpZiAoIGpzb24uYnVtcFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wU2NhbGUgPSBqc29uLmJ1bXBTY2FsZTtcblxuXHRcdGlmICgganNvbi5ub3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24ubm9ybWFsTWFwICk7XG5cdFx0aWYgKCBqc29uLm5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxTY2FsZSA9IGpzb24ubm9ybWFsU2NhbGU7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbm9ybWFsU2NhbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Ly8gQmxlbmRlciBleHBvcnRlciB1c2VkIHRvIGV4cG9ydCBhIHNjYWxhci4gU2VlICM3NDU5XG5cblx0XHRcdFx0bm9ybWFsU2NhbGUgPSBbIG5vcm1hbFNjYWxlLCBub3JtYWxTY2FsZSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIG5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmRpc3BsYWNlbWVudE1hcCApO1xuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGUgPSBqc29uLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRCaWFzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzID0ganNvbi5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0aWYgKCBqc29uLnJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5yb3VnaG5lc3NNYXAgKTtcblx0XHRpZiAoIGpzb24ubWV0YWxuZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1ldGFsbmVzc01hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZU1hcCA9IGdldFRleHR1cmUoIGpzb24uZW1pc3NpdmVNYXAgKTtcblx0XHRpZiAoIGpzb24uZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0ganNvbi5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5zcGVjdWxhck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFyTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW52TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVudk1hcCApO1xuXG5cdFx0aWYgKCBqc29uLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7XG5cblx0XHRpZiAoIGpzb24ubGlnaHRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5saWdodE1hcCApO1xuXHRcdGlmICgganNvbi5saWdodE1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHkgPSBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmFvTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcCA9IGdldFRleHR1cmUoIGpzb24uYW9NYXAgKTtcblx0XHRpZiAoIGpzb24uYW9NYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5ID0ganNvbi5hb01hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5ncmFkaWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ3JhZGllbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmdyYWRpZW50TWFwICk7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdqc29uJyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSgganNvbiApICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHR2YXIgaW5kZXggPSBqc29uLmRhdGEuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgaW5kZXgudHlwZSBdKCBpbmRleC5hcnJheSApO1xuXHRcdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIDEgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBhdHRyaWJ1dGUudHlwZSBdKCBhdHRyaWJ1dGUuYXJyYXkgKTtcblxuXHRcdFx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCBrZXksIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcblxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0Z2VvbWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBqc29uLmRhdGEuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cbn0gKTtcblxudmFyIFRZUEVEX0FSUkFZUyA9IHtcblx0SW50OEFycmF5OiBJbnQ4QXJyYXksXG5cdFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG5cdFVpbnQ4Q2xhbXBlZEFycmF5OiBVaW50OENsYW1wZWRBcnJheSxcblx0SW50MTZBcnJheTogSW50MTZBcnJheSxcblx0VWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxuXHRJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxuXHRVaW50MzJBcnJheTogVWludDMyQXJyYXksXG5cdEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxuXHRGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheVxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExvYWRlcigpIHtcblxuXHR0aGlzLm9uTG9hZFN0YXJ0ID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMub25Mb2FkUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5vbkxvYWRDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbkxvYWRlci5IYW5kbGVycyA9IHtcblxuXHRoYW5kbGVyczogW10sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7XG5cblx0XHR0aGlzLmhhbmRsZXJzLnB1c2goIHJlZ2V4LCBsb2FkZXIgKTtcblxuXHR9LFxuXG5cdGdldDogZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdFx0dmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0dmFyIHJlZ2V4ID0gaGFuZGxlcnNbIGkgXTtcblx0XHRcdHZhciBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTtcblxuXHRcdFx0aWYgKCByZWdleC50ZXN0KCBmaWxlICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGxvYWRlcjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fVxuXG59O1xuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46IHVuZGVmaW5lZCxcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHR2YXIgcGFydHMgPSB1cmwuc3BsaXQoICcvJyApO1xuXG5cdFx0aWYgKCBwYXJ0cy5sZW5ndGggPT09IDEgKSByZXR1cm4gJy4vJztcblxuXHRcdHBhcnRzLnBvcCgpO1xuXG5cdFx0cmV0dXJuIHBhcnRzLmpvaW4oICcvJyApICsgJy8nO1xuXG5cdH0sXG5cblx0aW5pdE1hdGVyaWFsczogZnVuY3Rpb24gKCBtYXRlcmlhbHMsIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbWF0ZXJpYWxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0YXJyYXlbIGkgXSA9IHRoaXMuY3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGNyZWF0ZU1hdGVyaWFsOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBCbGVuZGluZ01vZGUgPSB7XG5cdFx0XHROb0JsZW5kaW5nOiBOb0JsZW5kaW5nLFxuXHRcdFx0Tm9ybWFsQmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxuXHRcdFx0QWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcblx0XHRcdFN1YnRyYWN0aXZlQmxlbmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsXG5cdFx0XHRNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLFxuXHRcdFx0Q3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nXG5cdFx0fTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciB0ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0XHR2YXIgbWF0ZXJpYWxMb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0XHQvLyBjb252ZXJ0IGZyb20gb2xkIG1hdGVyaWFsIGZvcm1hdFxuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdHZhciBmdWxsUGF0aCA9IHRleHR1cmVQYXRoICsgcGF0aDtcblx0XHRcdFx0dmFyIGxvYWRlciA9IExvYWRlci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0dmFyIHRleHR1cmU7XG5cblx0XHRcdFx0aWYgKCBsb2FkZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICk7XG5cdFx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmVMb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByZXBlYXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMCBdICE9PSAxICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAxIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBUID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0XHRcdHRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHRcdHJldHVybiB1dWlkO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdHZhciBqc29uID0ge1xuXHRcdFx0XHR1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSxcblx0XHRcdFx0dHlwZTogJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnXG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtICkge1xuXG5cdFx0XHRcdHZhciB2YWx1ZSA9IG1bIG5hbWUgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnRGJnQ29sb3InOlxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0luZGV4Jzpcblx0XHRcdFx0XHRjYXNlICdvcHRpY2FsRGVuc2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAnaWxsdW1pbmF0aW9uJzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ0RiZ05hbWUnOlxuXHRcdFx0XHRcdFx0anNvbi5uYW1lID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGVuZGluZyc6XG5cdFx0XHRcdFx0XHRqc29uLmJsZW5kaW5nID0gQmxlbmRpbmdNb2RlWyB2YWx1ZSBdO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JBbWJpZW50Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbWJpZW50Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDonLCBuYW1lLCAnaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckRpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5jb2xvciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZSA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NwZWN1bGFyQ29lZic6XG5cdFx0XHRcdFx0XHRqc29uLnNoaW5pbmVzcyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hhZGluZyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N0YW5kYXJkJyApIGpzb24udHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24ubWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VSZXBlYXQsIG0ubWFwRGlmZnVzZU9mZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBtLm1hcEVtaXNzaXZlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodCc6XG5cdFx0XHRcdFx0XHRqc29uLmxpZ2h0TWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcExpZ2h0UmVwZWF0LCBtLm1hcExpZ2h0T2Zmc2V0LCBtLm1hcExpZ2h0V3JhcCwgbS5tYXBMaWdodEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0UmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU8nOlxuXHRcdFx0XHRcdFx0anNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5tYXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9Bbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBT1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9PZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9Bbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXAnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5tYXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFNjYWxlJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxGYWN0b3InOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxTY2FsZSA9IFsgdmFsdWUsIHZhbHVlIF07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhcic6XG5cdFx0XHRcdFx0XHRqc29uLnNwZWN1bGFyTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFNwZWN1bGFyUmVwZWF0LCBtLm1hcFNwZWN1bGFyT2Zmc2V0LCBtLm1hcFNwZWN1bGFyV3JhcCwgbS5tYXBTcGVjdWxhckFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhck9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhckFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ubWV0YWxuZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE1ldGFsbmVzc1JlcGVhdCwgbS5tYXBNZXRhbG5lc3NPZmZzZXQsIG0ubWFwTWV0YWxuZXNzV3JhcCwgbS5tYXBNZXRhbG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3MnOlxuXHRcdFx0XHRcdFx0anNvbi5yb3VnaG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwUm91Z2huZXNzUmVwZWF0LCBtLm1hcFJvdWdobmVzc09mZnNldCwgbS5tYXBSb3VnaG5lc3NXcmFwLCBtLm1hcFJvdWdobmVzc0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhJzpcblx0XHRcdFx0XHRcdGpzb24uYWxwaGFNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQWxwaGFSZXBlYXQsIG0ubWFwQWxwaGFPZmZzZXQsIG0ubWFwQWxwaGFXcmFwLCBtLm1hcEFscGhhQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdmbGlwU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gQmFja1NpZGU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkb3VibGVTaWRlZCc6XG5cdFx0XHRcdFx0XHRqc29uLnNpZGUgPSBEb3VibGVTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndHJhbnNwYXJlbmN5Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDogdHJhbnNwYXJlbmN5IGhhcyBiZWVuIHJlbmFtZWQgdG8gb3BhY2l0eScgKTtcblx0XHRcdFx0XHRcdGpzb24ub3BhY2l0eSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhUZXN0Jzpcblx0XHRcdFx0XHRjYXNlICdkZXB0aFdyaXRlJzpcblx0XHRcdFx0XHRjYXNlICdjb2xvcldyaXRlJzpcblx0XHRcdFx0XHRjYXNlICdvcGFjaXR5Jzpcblx0XHRcdFx0XHRjYXNlICdyZWZsZWN0aXZpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW50Jzpcblx0XHRcdFx0XHRjYXNlICd2aXNpYmxlJzpcblx0XHRcdFx0XHRjYXNlICd3aXJlZnJhbWUnOlxuXHRcdFx0XHRcdFx0anNvblsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd2ZXJ0ZXhDb2xvcnMnOlxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIGpzb24udmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gJ2ZhY2UnICkganNvbi52ZXJ0ZXhDb2xvcnMgPSBGYWNlQ29sb3JzO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IFVuc3VwcG9ydGVkJywgbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24udHlwZSA9PT0gJ01lc2hCYXNpY01hdGVyaWFsJyApIGRlbGV0ZSBqc29uLmVtaXNzaXZlO1xuXHRcdFx0aWYgKCBqc29uLnR5cGUgIT09ICdNZXNoUGhvbmdNYXRlcmlhbCcgKSBkZWxldGUganNvbi5zcGVjdWxhcjtcblxuXHRcdFx0aWYgKCBqc29uLm9wYWNpdHkgPCAxICkganNvbi50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHRcdG1hdGVyaWFsTG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxMb2FkZXIucGFyc2UoIGpzb24gKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0aWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jvb2xlYW4nICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogc2hvd1N0YXR1cyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGNvbnN0cnVjdG9yLicgKTtcblx0XHRtYW5hZ2VyID0gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEpTT05Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGggPT09IFwic3RyaW5nXCIgKSA/IHRoaXMudGV4dHVyZVBhdGggOiBMb2FkZXIucHJvdG90eXBlLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2pzb24nICk7XG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRcdHZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XG5cblx0XHRcdGlmICggbWV0YWRhdGEgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2YXIgdHlwZSA9IG1ldGFkYXRhLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyOiAnICsgdXJsICsgJyBzaG91bGQgYmUgbG9hZGVkIHdpdGggVEhSRUUuT2JqZWN0TG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdzY2VuZScgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyOiAnICsgdXJsICsgJyBzaG91bGQgYmUgbG9hZGVkIHdpdGggVEhSRUUuU2NlbmVMb2FkZXIgaW5zdGVhZC4nICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBvYmplY3QgPSBzY29wZS5wYXJzZSgganNvbiwgdGV4dHVyZVBhdGggKTtcblx0XHRcdG9uTG9hZCggb2JqZWN0Lmdlb21ldHJ5LCBvYmplY3QubWF0ZXJpYWxzICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZVBhdGggPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHRmdW5jdGlvbiBpc0JpdFNldCggdmFsdWUsIHBvc2l0aW9uICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSAmICggMSA8PCBwb3NpdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpLCBqLCBmaSxcblxuXHRcdFx0XHRvZmZzZXQsIHpMZW5ndGgsXG5cblx0XHRcdFx0Y29sb3JJbmRleCwgbm9ybWFsSW5kZXgsIHV2SW5kZXgsIG1hdGVyaWFsSW5kZXgsXG5cblx0XHRcdFx0dHlwZSxcblx0XHRcdFx0aXNRdWFkLFxuXHRcdFx0XHRoYXNNYXRlcmlhbCxcblx0XHRcdFx0aGFzRmFjZVZlcnRleFV2LFxuXHRcdFx0XHRoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFsLFxuXHRcdFx0XHRoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcixcblxuXHRcdFx0XHR2ZXJ0ZXgsIGZhY2UsIGZhY2VBLCBmYWNlQiwgaGV4LCBub3JtYWwsXG5cblx0XHRcdFx0dXZMYXllciwgdXYsIHUsIHYsXG5cblx0XHRcdFx0ZmFjZXMgPSBqc29uLmZhY2VzLFxuXHRcdFx0XHR2ZXJ0aWNlcyA9IGpzb24udmVydGljZXMsXG5cdFx0XHRcdG5vcm1hbHMgPSBqc29uLm5vcm1hbHMsXG5cdFx0XHRcdGNvbG9ycyA9IGpzb24uY29sb3JzLFxuXG5cdFx0XHRcdHNjYWxlID0ganNvbi5zY2FsZSxcblxuXHRcdFx0XHRuVXZMYXllcnMgPSAwO1xuXG5cblx0XHRcdGlmICgganNvbi51dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBkaXNyZWdhcmQgZW1wdHkgYXJyYXlzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBqc29uLnV2cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGpzb24udXZzWyBpIF0ubGVuZ3RoICkgblV2TGF5ZXJzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0ekxlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkge1xuXG5cdFx0XHRcdHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblx0XHRcdFx0dmVydGV4LnkgPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblx0XHRcdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblxuXHRcdFx0XHRnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0ekxlbmd0aCA9IGZhY2VzLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkge1xuXG5cdFx0XHRcdHR5cGUgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0aXNRdWFkID0gaXNCaXRTZXQoIHR5cGUsIDAgKTtcblx0XHRcdFx0aGFzTWF0ZXJpYWwgPSBpc0JpdFNldCggdHlwZSwgMSApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYgPSBpc0JpdFNldCggdHlwZSwgMyApO1xuXHRcdFx0XHRoYXNGYWNlTm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDQgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleE5vcm1hbCA9IGlzQml0U2V0KCB0eXBlLCA1ICk7XG5cdFx0XHRcdGhhc0ZhY2VDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA2ICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA3ICk7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUsIFwiYml0c1wiLCBpc1F1YWQsIGhhc01hdGVyaWFsLCBoYXNGYWNlVmVydGV4VXYsIGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsIGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yKTtcblxuXHRcdFx0XHRpZiAoIGlzUXVhZCApIHtcblxuXHRcdFx0XHRcdGZhY2VBID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZUEuYSA9IGZhY2VzWyBvZmZzZXQgXTtcblx0XHRcdFx0XHRmYWNlQS5iID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQS5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdGZhY2VCID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZUIuYSA9IGZhY2VzWyBvZmZzZXQgKyAxIF07XG5cdFx0XHRcdFx0ZmFjZUIuYiA9IGZhY2VzWyBvZmZzZXQgKyAyIF07XG5cdFx0XHRcdFx0ZmFjZUIuYyA9IGZhY2VzWyBvZmZzZXQgKyAzIF07XG5cblx0XHRcdFx0XHRvZmZzZXQgKz0gNDtcblxuXHRcdFx0XHRcdGlmICggaGFzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlQS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblx0XHRcdFx0XHRcdGZhY2VCLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG8gZ2V0IGZhY2UgPD0+IHV2IGluZGV4IGNvcnJlc3BvbmRlbmNlXG5cblx0XHRcdFx0XHRmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR1dkxheWVyID0ganNvbi51dnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTtcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSArIDEgXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgNDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTtcblx0XHRcdFx0XHRcdFx0XHR2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIGogIT09IDIgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGogIT09IDAgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdLnB1c2goIHV2ICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0ZmFjZUEubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0ZmFjZUIubm9ybWFsLmNvcHkoIGZhY2VBLm5vcm1hbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHRcdCk7XG5cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDIgKSBmYWNlQS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdGZhY2VBLmNvbG9yLnNldEhleCggaGV4ICk7XG5cdFx0XHRcdFx0XHRmYWNlQi5jb2xvci5zZXRIZXgoIGhleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGhleCA9IGNvbG9yc1sgY29sb3JJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VBICk7XG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2UuYSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmIgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0ZmFjZS5jID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTtcblx0XHRcdFx0XHRcdFx0XHR2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlLm5vcm1hbC5zZXQoXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRmYWNlLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlLmNvbG9yLnNldEhleCggY29sb3JzWyBjb2xvckluZGV4IF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0XHRmYWNlLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgY29sb3JJbmRleCBdICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VTa2luKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPSAoIGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCAhPT0gdW5kZWZpbmVkICkgPyBqc29uLmluZmx1ZW5jZXNQZXJWZXJ0ZXggOiAyO1xuXG5cdFx0XHRpZiAoIGpzb24uc2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgeCA9IGpzb24uc2tpbldlaWdodHNbIGkgXTtcblx0XHRcdFx0XHR2YXIgeSA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciB6ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHcgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5XZWlnaHRzLnB1c2goIG5ldyBWZWN0b3I0KCB4LCB5LCB6LCB3ICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkge1xuXG5cdFx0XHRcdFx0dmFyIGEgPSBqc29uLnNraW5JbmRpY2VzWyBpIF07XG5cdFx0XHRcdFx0dmFyIGIgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMSBdIDogMDtcblx0XHRcdFx0XHR2YXIgYyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAyIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBkID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDMgXSA6IDA7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5za2luSW5kaWNlcy5wdXNoKCBuZXcgVmVjdG9yNCggYSwgYiwgYywgZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvbmVzID0ganNvbi5ib25lcztcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICYmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICE9PSBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggfHwgZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICE9PSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdXaGVuIHNraW5uaW5nLCBudW1iZXIgb2YgdmVydGljZXMgKCcgKyBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKyAnKSwgc2tpbkluZGljZXMgKCcgK1xuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCArICcpLCBhbmQgc2tpbldlaWdodHMgKCcgKyBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKyAnKSBzaG91bGQgbWF0Y2guJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHNjYWxlID0ganNvbi5zY2FsZTtcblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXSA9IHt9O1xuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgPSBbXTtcblxuXHRcdFx0XHRcdHZhciBkc3RWZXJ0aWNlcyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXHRcdFx0XHRcdHZhciBzcmNWZXJ0aWNlcyA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgdiA9IDAsIHZsID0gc3JjVmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueCA9IHNyY1ZlcnRpY2VzWyB2IF0gKiBzY2FsZTtcblx0XHRcdFx0XHRcdHZlcnRleC55ID0gc3JjVmVydGljZXNbIHYgKyAxIF0gKiBzY2FsZTtcblx0XHRcdFx0XHRcdHZlcnRleC56ID0gc3JjVmVydGljZXNbIHYgKyAyIF0gKiBzY2FsZTtcblxuXHRcdFx0XHRcdFx0ZHN0VmVydGljZXMucHVzaCggdmVydGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5tb3JwaENvbG9ycyAhPT0gdW5kZWZpbmVkICYmIGpzb24ubW9ycGhDb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5KU09OTG9hZGVyOiBcIm1vcnBoQ29sb3JzXCIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNpbmcgdGhlbSBhcyBmYWNlIGNvbG9ycy4nICk7XG5cblx0XHRcdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0XHRcdHZhciBtb3JwaENvbG9ycyA9IGpzb24ubW9ycGhDb2xvcnNbIDAgXS5jb2xvcnM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2VzWyBpIF0uY29sb3IuZnJvbUFycmF5KCBtb3JwaENvbG9ycywgaSAqIDMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlQW5pbWF0aW9ucygganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvdXRwdXRBbmltYXRpb25zID0gW107XG5cblx0XHRcdC8vIHBhcnNlIG9sZCBzdHlsZSBCb25lL0hpZXJhcmNoeSBhbmltYXRpb25zXG5cdFx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBqc29uLmFuaW1hdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb25zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMuY29uY2F0KCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlQW5pbWF0aW9uKCBhbmltYXRpb25zWyBpIF0sIGdlb21ldHJ5LmJvbmVzICk7XG5cdFx0XHRcdGlmICggY2xpcCApIG91dHB1dEFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHBhcnNlIGltcGxpY2l0IG1vcnBoIGFuaW1hdGlvbnNcblx0XHRcdGlmICggZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCBhbiBhcHByb3ByYWl0ZSBGUFMgaXMgZm9yIG1vcnBoIHRhcmdldCBhbmltYXRpb25zIC0tIGRlZmF1bHRpbmcgdG8gMTAsIGJ1dCByZWFsbHkgaXQgaXMgY29tcGxldGVseSBhcmJpdHJhcnkuXG5cdFx0XHRcdHZhciBtb3JwaEFuaW1hdGlvbkNsaXBzID0gQW5pbWF0aW9uQ2xpcC5DcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyggZ2VvbWV0cnkubW9ycGhUYXJnZXRzLCAxMCApO1xuXHRcdFx0XHRvdXRwdXRBbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9ucy5jb25jYXQoIG1vcnBoQW5pbWF0aW9uQ2xpcHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG91dHB1dEFuaW1hdGlvbnMubGVuZ3RoID4gMCApIGdlb21ldHJ5LmFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICgganNvbiwgdGV4dHVyZVBhdGggKSB7XG5cblx0XHRcdGlmICgganNvbi5kYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gR2VvbWV0cnkgNC4wIHNwZWNcblx0XHRcdFx0anNvbiA9IGpzb24uZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRqc29uLnNjYWxlID0gMS4wIC8ganNvbi5zY2FsZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRqc29uLnNjYWxlID0gMS4wO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0XHRwYXJzZU1vZGVsKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VTa2luKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VNb3JwaGluZygganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlQW5pbWF0aW9ucygganNvbiwgZ2VvbWV0cnkgKTtcblxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0aWYgKCBqc29uLm1hdGVyaWFscyA9PT0gdW5kZWZpbmVkIHx8IGpzb24ubWF0ZXJpYWxzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4geyBnZW9tZXRyeTogZ2VvbWV0cnkgfTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgbWF0ZXJpYWxzID0gTG9hZGVyLnByb3RvdHlwZS5pbml0TWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZVBhdGgsIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdFx0XHRyZXR1cm4geyBnZW9tZXRyeTogZ2VvbWV0cnksIG1hdGVyaWFsczogbWF0ZXJpYWxzIH07XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gT2JqZWN0TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXHR0aGlzLnRleHR1cmVQYXRoID0gJyc7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHRoaXMudGV4dHVyZVBhdGggPT09ICcnICkge1xuXG5cdFx0XHR0aGlzLnRleHR1cmVQYXRoID0gdXJsLnN1YnN0cmluZyggMCwgdXJsLmxhc3RJbmRleE9mKCAnLycgKSArIDEgKTtcblxuXHRcdH1cblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdHZhciBqc29uID0gbnVsbDtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xuXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdFx0aWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBlcnJvciApO1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRTpPYmplY3RMb2FkZXI6IENhblxcJ3QgcGFyc2UgJyArIHVybCArICcuJywgZXJyb3IubWVzc2FnZSApO1xuXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2dlb21ldHJ5JyApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cXCd0IGxvYWQgJyArIHVybCArICcuIFVzZSBUSFJFRS5KU09OTG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0c2NvcGUucGFyc2UoIGpzb24sIG9uTG9hZCApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcyApO1xuXG5cdFx0dmFyIGltYWdlcyA9IHRoaXMucGFyc2VJbWFnZXMoIGpzb24uaW1hZ2VzLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApO1xuXG5cdFx0fSApO1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTtcblx0XHR2YXIgbWF0ZXJpYWxzID0gdGhpcy5wYXJzZU1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVzICk7XG5cblx0XHR2YXIgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgganNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApO1xuXG5cdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgKSB7XG5cblx0XHRcdG9iamVjdC5hbmltYXRpb25zID0gdGhpcy5wYXJzZUFuaW1hdGlvbnMoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmltYWdlcyA9PT0gdW5kZWZpbmVkIHx8IGpzb24uaW1hZ2VzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH0sXG5cblx0cGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeUxvYWRlciA9IG5ldyBKU09OTG9hZGVyKCk7XG5cdFx0XHR2YXIgYnVmZmVyR2VvbWV0cnlMb2FkZXIgPSBuZXcgQnVmZmVyR2VvbWV0cnlMb2FkZXIoKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeTtcblx0XHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0JveEdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdCb3hCdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3ViZUdlb21ldHJ5JzogLy8gYmFja3dhcmRzIGNvbXBhdGlibGVcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGhTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDaXJjbGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuc2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDeWxpbmRlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzVG9wLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c0JvdHRvbSxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDb25lQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0RvZGVjYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdPY3RhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RldHJhaGVkcm9uR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGV0YWlsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEuaW5uZXJSYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3V0ZXJSYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuYXJjXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5wLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnFcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBvaW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGJ1ZmZlckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhLCB0aGlzLnRleHR1cmVQYXRoICkuZ2VvbWV0cnk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlIFwiJyArIGRhdGEudHlwZSArICdcIicgKTtcblxuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdlb21ldHJ5LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0Z2VvbWV0cmllc1sgZGF0YS51dWlkIF0gPSBnZW9tZXRyeTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJpZXM7XG5cblx0fSxcblxuXHRwYXJzZU1hdGVyaWFsczogZnVuY3Rpb24gKCBqc29uLCB0ZXh0dXJlcyApIHtcblxuXHRcdHZhciBtYXRlcmlhbHMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XG5cdFx0XHRsb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkge1xuXG5cdFx0XHRcdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBkYXRhLm1hdGVyaWFscy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGFycmF5LnB1c2goIGxvYWRlci5wYXJzZSggZGF0YS5tYXRlcmlhbHNbIGogXSApICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gYXJyYXk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRlcmlhbHM7XG5cblx0fSxcblxuXHRwYXJzZUFuaW1hdGlvbnM6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblxuXHR9LFxuXG5cdHBhcnNlSW1hZ2VzOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cdFx0dmFyIGltYWdlcyA9IHt9O1xuXG5cdFx0ZnVuY3Rpb24gbG9hZEltYWdlKCB1cmwgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0cmV0dXJuIGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIG1hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoIG9uTG9hZCApO1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCBtYW5hZ2VyICk7XG5cdFx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBpbWFnZSA9IGpzb25bIGkgXTtcblx0XHRcdFx0dmFyIHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIGltYWdlLnVybCApID8gaW1hZ2UudXJsIDogc2NvcGUudGV4dHVyZVBhdGggKyBpbWFnZS51cmw7XG5cblx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBsb2FkSW1hZ2UoIHBhdGggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlcztcblxuXHR9LFxuXG5cdHBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwgaW1hZ2VzICkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7XG5cblx0XHRcdGlmICggdHlwZW9mKCB2YWx1ZSApID09PSAnbnVtYmVyJyApIHJldHVybiB2YWx1ZTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4nLCB2YWx1ZSApO1xuXG5cdFx0XHRyZXR1cm4gdHlwZVsgdmFsdWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdHRleHR1cmUudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0XHRcdGlmICggZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hcHBpbmcgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hcHBpbmcsIFRFWFRVUkVfTUFQUElORyApO1xuXG5cdFx0XHRcdGlmICggZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggZGF0YS5vZmZzZXQgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJlcGVhdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCBkYXRhLnJlcGVhdCApO1xuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWluRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5taW5GaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7XG5cdFx0XHRcdGlmICggZGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFnRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5tYWdGaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7XG5cdFx0XHRcdGlmICggZGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBkYXRhLmFuaXNvdHJvcHk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZsaXBZID0gZGF0YS5mbGlwWTtcblxuXHRcdFx0XHR0ZXh0dXJlc1sgZGF0YS51dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZXM7XG5cblx0fSxcblxuXHRwYXJzZU9iamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyc2VPYmplY3QoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHtcblxuXHRcdFx0dmFyIG9iamVjdDtcblxuXHRcdFx0ZnVuY3Rpb24gZ2V0R2VvbWV0cnkoIG5hbWUgKSB7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGdldE1hdGVyaWFsKCBuYW1lICkge1xuXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblxuXHRcdFx0XHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdXVpZCA9IG5hbWVbIGkgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRlcmlhbHNbIHV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsc1sgdXVpZCBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gYXJyYXk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgbmFtZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRcdGNhc2UgJ1NjZW5lJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBTY2VuZSgpO1xuXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IG5ldyBDb2xvciggZGF0YS5iYWNrZ3JvdW5kICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nJyApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nRXhwMicgKSB7XG5cblx0XHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cuZGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvY3VzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZm9jdXMgPSBkYXRhLmZvY3VzO1xuXHRcdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbUdhdWdlID0gZGF0YS5maWxtR2F1Z2U7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZpbG1PZmZzZXQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtT2Zmc2V0ID0gZGF0YS5maWxtT2Zmc2V0O1xuXHRcdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnQW1iaWVudExpZ2h0JzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU3BvdExpZ2h0JzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1NraW5uZWRNZXNoJzpcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTtcblxuXHRcdFx0XHRjYXNlICdNZXNoJzpcblxuXHRcdFx0XHRcdHZhciBnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XG5cdFx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuYm9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0xPRCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTE9EKCk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdMaW5lJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApLCBkYXRhLm1vZGUgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0xpbmVMb29wJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnTGluZVNlZ21lbnRzJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50Q2xvdWQnOlxuXHRcdFx0XHRjYXNlICdQb2ludHMnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU3ByaXRlJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0dyb3VwJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cdFx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTtcblx0XHRcdFx0bWF0cml4LmRlY29tcG9zZSggb2JqZWN0LnBvc2l0aW9uLCBvYmplY3QucXVhdGVybmlvbiwgb2JqZWN0LnNjYWxlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRcdGlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5yb3RhdGlvbiApO1xuXHRcdFx0XHRpZiAoIGRhdGEucXVhdGVybmlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBkYXRhLnF1YXRlcm5pb24gKTtcblx0XHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkYXRhLmNhc3RTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0YS5jYXN0U2hhZG93O1xuXHRcdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93ICkge1xuXG5cdFx0XHRcdGlmICggZGF0YS5zaGFkb3cuYmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5iaWFzID0gZGF0YS5zaGFkb3cuYmlhcztcblx0XHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRpZiAoIGRhdGEuc2hhZG93Lm1hcFNpemUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoIGRhdGEuc2hhZG93Lm1hcFNpemUgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5jYW1lcmEgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuY2FtZXJhID0gdGhpcy5wYXJzZU9iamVjdCggZGF0YS5zaGFkb3cuY2FtZXJhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkYXRhLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aXNpYmxlID0gZGF0YS52aXNpYmxlO1xuXHRcdFx0aWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBvYmplY3QudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhO1xuXG5cdFx0XHRpZiAoIGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgY2hpbGQgaW4gZGF0YS5jaGlsZHJlbiApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5hZGQoIHRoaXMucGFyc2VPYmplY3QoIGRhdGEuY2hpbGRyZW5bIGNoaWxkIF0sIGdlb21ldHJpZXMsIG1hdGVyaWFscyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGF0YS50eXBlID09PSAnTE9EJyApIHtcblxuXHRcdFx0XHR2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgbCBdO1xuXHRcdFx0XHRcdHZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuYWRkTGV2ZWwoIGNoaWxkLCBsZXZlbC5kaXN0YW5jZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdFx0fTtcblxuXHR9KClcblxufSApO1xuXG52YXIgVEVYVFVSRV9NQVBQSU5HID0ge1xuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcblx0U3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7XG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfRklMVEVSID0ge1xuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tXG4gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmVcbiAqL1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcblxuXHR2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcblx0dmFyIHYxID0gKCBwMyAtIHAxICkgKiAwLjU7XG5cdHZhciB0MiA9IHQgKiB0O1xuXHR2YXIgdDMgPSB0ICogdDI7XG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDIgKiAoIDEgLSB0ICkgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMiggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllciggdCwgcDAsIHAxLCBwMiApIHtcblxuXHRyZXR1cm4gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAwICkgKyBRdWFkcmF0aWNCZXppZXJQMSggdCwgcDEgKSArXG5cdFx0UXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gayAqIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAxKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBFeHRlbnNpYmxlIGN1cnZlIG9iamVjdFxuICpcbiAqIFNvbWUgY29tbW9uIG9mIGN1cnZlIG1ldGhvZHM6XG4gKiAuZ2V0UG9pbnQodCksIGdldFRhbmdlbnQodClcbiAqIC5nZXRQb2ludEF0KHUpLCBnZXRUYW5nZW50QXQodSlcbiAqIC5nZXRQb2ludHMoKSwgLmdldFNwYWNlZFBvaW50cygpXG4gKiAuZ2V0TGVuZ3RoKClcbiAqIC51cGRhdGVBcmNMZW5ndGhzKClcbiAqXG4gKiBUaGlzIGZvbGxvd2luZyBjdXJ2ZXMgaW5oZXJpdCBmcm9tIFRIUkVFLkN1cnZlOlxuICpcbiAqIC0tIDJEIGN1cnZlcyAtLVxuICogVEhSRUUuQXJjQ3VydmVcbiAqIFRIUkVFLkN1YmljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLkVsbGlwc2VDdXJ2ZVxuICogVEhSRUUuTGluZUN1cnZlXG4gKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuU3BsaW5lQ3VydmVcbiAqXG4gKiAtLSAzRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTNcbiAqIFRIUkVFLkN1YmljQmV6aWVyQ3VydmUzXG4gKiBUSFJFRS5MaW5lQ3VydmUzXG4gKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZTNcbiAqXG4gKiBBIHNlcmllcyBvZiBjdXJ2ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVEhSRUUuQ3VydmVQYXRoLlxuICpcbiAqKi9cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlx0QWJzdHJhY3QgQ3VydmUgYmFzZSBjbGFzc1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZSgpIHtcblxuXHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHtcblxuXHQvLyBWaXJ0dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNsYXNzZXNcblx0Ly9cdC0gdCBbMCAuLiAxXVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLicgKTtcblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdC8vIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aFxuXHQvLyAtIHUgWzAgLi4gMV1cblxuXHRnZXRQb2ludEF0OiBmdW5jdGlvbiAoIHUgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdCApO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHNcblxuXHRnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dmFyIGNhY2hlID0gW107XG5cdFx0dmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIHAsIHN1bSA9IDA7XG5cblx0XHRjYWNoZS5wdXNoKCAwICk7XG5cblx0XHRmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XG5cblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcblxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5cblx0fSxcblxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnRcblxuXHRnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0XHR2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHR2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdHZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHR2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xuXHRcdHZhciBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XG5cblx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdHZhciBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcblxuXHRcdHZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xuXG5cdFx0cmV0dXJuIHQ7XG5cblx0fSxcblxuXHQvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0XG5cdC8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcblx0Ly8gMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcblx0Ly8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvblxuXG5cdGdldFRhbmdlbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkZWx0YSA9IDAuMDAwMTtcblx0XHR2YXIgdDEgPSB0IC0gZGVsdGE7XG5cdFx0dmFyIHQyID0gdCArIGRlbHRhO1xuXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxuXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XG5cblx0XHR2YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHR2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcblxuXHRcdHZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApO1xuXHRcdHJldHVybiB2ZWMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcblxuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRhbmdlbnRzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgYmlub3JtYWxzID0gW107XG5cblx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHZhciBpLCB1LCB0aGV0YTtcblxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHUgPSBpIC8gc2VnbWVudHM7XG5cblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApO1xuXHRcdFx0dGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XG5cblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblx0XHR2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XG5cdFx0dmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdHZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcblxuXHRcdGlmICggdHggPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eDtcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHkgPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eTtcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHogPD0gbWluICkge1xuXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcblxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XG5cblxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0YW5nZW50c1sgaSAtIDEgXS5kb3QoIHRhbmdlbnRzWyBpIF0gKSwgLSAxLCAxICkgKTsgLy8gY2xhbXAgZm9yIGZsb2F0aW5nIHB0IGVycm9yc1xuXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZVxuXG5cdFx0aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB0d2lzdCBhIGxpdHRsZS4uLlxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTtcblx0XHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhbmdlbnRzOiB0YW5nZW50cyxcblx0XHRcdG5vcm1hbHM6IG5vcm1hbHMsXG5cdFx0XHRiaW5vcm1hbHM6IGJpbm9ybWFsc1xuXHRcdH07XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIExpbmVDdXJ2ZSggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnYxID0gdjE7XG5cdHRoaXMudjIgPSB2MjtcblxufVxuXG5MaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmlzTGluZUN1cnZlID0gdHJ1ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52Mi5jbG9uZSgpO1xuXG5cdH1cblxuXHR2YXIgcG9pbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7XG5cdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0VGFuZ2VudCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgdGFuZ2VudCA9IHRoaXMudjIuY2xvbmUoKS5zdWIoIHRoaXMudjEgKTtcblxuXHRyZXR1cm4gdGFuZ2VudC5ub3JtYWxpemUoKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuY3VydmVzID0gW107XG5cblx0dGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTsgLy8gQXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHBhdGhcblxufVxuXG5DdXJ2ZVBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3VydmVQYXRoLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBjdXJ2ZSApIHtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0fSxcblxuXHRjbG9zZVBhdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIEFkZCBhIGxpbmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZFxuXHRcdHZhciBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApO1xuXHRcdHZhciBlbmRQb2ludCA9IHRoaXMuY3VydmVzWyB0aGlzLmN1cnZlcy5sZW5ndGggLSAxIF0uZ2V0UG9pbnQoIDEgKTtcblxuXHRcdGlmICggISBzdGFydFBvaW50LmVxdWFscyggZW5kUG9pbnQgKSApIHtcblxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggbmV3IExpbmVDdXJ2ZSggZW5kUG9pbnQsIHN0YXJ0UG9pbnQgKSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdpdGggcmVmZXJlbmNlIHRvXG5cdC8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUgdCxcblx0Ly8gZm9sbG93aW5nIGhhcyB0byBiZSBkb25lOlxuXG5cdC8vIDEuIExlbmd0aCBvZiBlYWNoIHN1YiBwYXRoIGhhdmUgdG8gYmUga25vd25cblx0Ly8gMi4gTG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlXG5cdC8vIDMuIEdldCB0IGZvciB0aGUgY3VydmVcblx0Ly8gNC4gUmV0dXJuIGN1cnZlLmdldFBvaW50QXQodCcpXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkID0gdCAqIHRoaXMuZ2V0TGVuZ3RoKCk7XG5cdFx0dmFyIGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0dmFyIGkgPSAwO1xuXG5cdFx0Ly8gVG8gdGhpbmsgYWJvdXQgYm91bmRhcmllcyBwb2ludHMuXG5cblx0XHR3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkge1xuXG5cdFx0XHRpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7XG5cblx0XHRcdFx0dmFyIGRpZmYgPSBjdXJ2ZUxlbmd0aHNbIGkgXSAtIGQ7XG5cdFx0XHRcdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XG5cblx0XHRcdFx0dmFyIHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcblx0XHRcdFx0dmFyIHUgPSBzZWdtZW50TGVuZ3RoID09PSAwID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdFx0XHRyZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCggdSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGkgKys7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdC8vIGxvb3Agd2hlcmUgc3VtICE9IDAsIHN1bSA+IGQgLCBzdW0rMSA8ZFxuXG5cdH0sXG5cblx0Ly8gV2UgY2Fubm90IHVzZSB0aGUgZGVmYXVsdCBUSFJFRS5DdXJ2ZSBnZXRQb2ludCgpIHdpdGggZ2V0TGVuZ3RoKCkgYmVjYXVzZSBpblxuXHQvLyBUSFJFRS5DdXJ2ZSwgZ2V0TGVuZ3RoKCkgZGVwZW5kcyBvbiBnZXRQb2ludCgpIGJ1dCBpbiBUSFJFRS5DdXJ2ZVBhdGhcblx0Ly8gZ2V0UG9pbnQoKSBkZXBlbmRzIG9uIGdldExlbmd0aFxuXG5cdGdldExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHJldHVybiBsZW5zWyBsZW5zLmxlbmd0aCAtIDEgXTtcblxuXHR9LFxuXG5cdC8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC5cblx0dXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBudWxsO1xuXHRcdHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cblx0fSxcblxuXHQvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW1cblx0Ly8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC5cblxuXHRnZXRDdXJ2ZUxlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMgaWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGhcblxuXHRcdGlmICggdGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1cnZlcy5sZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmNhY2hlTGVuZ3RocztcblxuXHRcdH1cblxuXHRcdC8vIEdldCBsZW5ndGggb2Ygc3ViLWN1cnZlXG5cdFx0Ly8gUHVzaCBzdW1zIGludG8gY2FjaGVkIGFycmF5XG5cblx0XHR2YXIgbGVuZ3RocyA9IFtdLCBzdW1zID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTtcblx0XHRcdGxlbmd0aHMucHVzaCggc3VtcyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xuXG5cdFx0cmV0dXJuIGxlbmd0aHM7XG5cblx0fSxcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQwO1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDw9IGRpdmlzaW9uczsgaSArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGkgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMjtcblxuXHRcdHZhciBwb2ludHMgPSBbXSwgbGFzdDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgY3VydmVzID0gdGhpcy5jdXJ2ZXM7IGkgPCBjdXJ2ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBjdXJ2ZXNbIGkgXTtcblx0XHRcdHZhciByZXNvbHV0aW9uID0gKGN1cnZlICYmIGN1cnZlLmlzRWxsaXBzZUN1cnZlKSA/IGRpdmlzaW9ucyAqIDJcblx0XHRcdFx0OiAoY3VydmUgJiYgY3VydmUuaXNMaW5lQ3VydmUpID8gMVxuXHRcdFx0XHQ6IChjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcblx0XHRcdFx0OiBkaXZpc2lvbnM7XG5cblx0XHRcdHZhciBwdHMgPSBjdXJ2ZS5nZXRQb2ludHMoIHJlc29sdXRpb24gKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaisrICkge1xuXG5cdFx0XHRcdHZhciBwb2ludCA9IHB0c1sgaiBdO1xuXG5cdFx0XHRcdGlmICggbGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNvbnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlc1xuXG5cdFx0XHRcdHBvaW50cy5wdXNoKCBwb2ludCApO1xuXHRcdFx0XHRsYXN0ID0gcG9pbnQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgJiYgcG9pbnRzLmxlbmd0aCA+IDEgJiYgIXBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXHQgKlx0Q3JlYXRlIEdlb21ldHJpZXMgSGVscGVyc1xuXHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblx0Ly8vIEdlbmVyYXRlIGdlb21ldHJ5IGZyb20gcGF0aCBwb2ludHMgKGZvciBMaW5lIG9yIFBvaW50cyBvYmplY3RzKVxuXG5cdGNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHZhciBwdHMgPSB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApO1xuXG5cdH0sXG5cblx0Ly8gR2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aFxuXG5cdGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHZhciBwdHMgPSB0aGlzLmdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zICk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApO1xuXG5cdH0sXG5cblx0Y3JlYXRlR2VvbWV0cnk6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHBvaW50ID0gcG9pbnRzWyBpIF07XG5cdFx0XHRnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5hWCA9IGFYO1xuXHR0aGlzLmFZID0gYVk7XG5cblx0dGhpcy54UmFkaXVzID0geFJhZGl1cztcblx0dGhpcy55UmFkaXVzID0geVJhZGl1cztcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0gYUVuZEFuZ2xlO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IGFDbG9ja3dpc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBhUm90YXRpb24gfHwgMDtcblxufVxuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRWxsaXBzZUN1cnZlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlID0gdHJ1ZTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgdHdvUGkgPSBNYXRoLlBJICogMjtcblx0dmFyIGRlbHRhQW5nbGUgPSB0aGlzLmFFbmRBbmdsZSAtIHRoaXMuYVN0YXJ0QW5nbGU7XG5cdHZhciBzYW1lUG9pbnRzID0gTWF0aC5hYnMoIGRlbHRhQW5nbGUgKSA8IE51bWJlci5FUFNJTE9OO1xuXG5cdC8vIGVuc3VyZXMgdGhhdCBkZWx0YUFuZ2xlIGlzIDAgLi4gMiBQSVxuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPCAwICkgZGVsdGFBbmdsZSArPSB0d29QaTtcblx0d2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3b1BpO1xuXG5cdGlmICggZGVsdGFBbmdsZSA8IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0aWYgKCBzYW1lUG9pbnRzICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSB0d29QaTtcblxuXHRcdH1cblxuXHR9XG5cblx0aWYgKCB0aGlzLmFDbG9ja3dpc2UgPT09IHRydWUgJiYgISBzYW1lUG9pbnRzICkge1xuXG5cdFx0aWYgKCBkZWx0YUFuZ2xlID09PSB0d29QaSApIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IC0gdHdvUGk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgYW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlICsgdCAqIGRlbHRhQW5nbGU7XG5cdHZhciB4ID0gdGhpcy5hWCArIHRoaXMueFJhZGl1cyAqIE1hdGguY29zKCBhbmdsZSApO1xuXHR2YXIgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRpZiAoIHRoaXMuYVJvdGF0aW9uICE9PSAwICkge1xuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCB0aGlzLmFSb3RhdGlvbiApO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggdGhpcy5hUm90YXRpb24gKTtcblxuXHRcdHZhciB0eCA9IHggLSB0aGlzLmFYO1xuXHRcdHZhciB0eSA9IHkgLSB0aGlzLmFZO1xuXG5cdFx0Ly8gUm90YXRlIHRoZSBwb2ludCBhYm91dCB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxuXHRcdHggPSB0eCAqIGNvcyAtIHR5ICogc2luICsgdGhpcy5hWDtcblx0XHR5ID0gdHggKiBzaW4gKyB0eSAqIGNvcyArIHRoaXMuYVk7XG5cblx0fVxuXG5cdHJldHVybiBuZXcgVmVjdG9yMiggeCwgeSApO1xuXG59O1xuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZSggcG9pbnRzIC8qIGFycmF5IG9mIFZlY3RvcjIgKi8gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMucG9pbnRzID0gKCBwb2ludHMgPT09IHVuZGVmaW5lZCApID8gW10gOiBwb2ludHM7XG5cbn1cblxuU3BsaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGxpbmVDdXJ2ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmlzU3BsaW5lQ3VydmUgPSB0cnVlO1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgcG9pbnQgPSAoIHBvaW50cy5sZW5ndGggLSAxICkgKiB0O1xuXG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHBvaW50ICk7XG5cdHZhciB3ZWlnaHQgPSBwb2ludCAtIGludFBvaW50O1xuXG5cdHZhciBwb2ludDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTtcblx0dmFyIHBvaW50MSA9IHBvaW50c1sgaW50UG9pbnQgXTtcblx0dmFyIHBvaW50MiA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMiA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAxIF07XG5cdHZhciBwb2ludDMgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMiBdO1xuXG5cdHJldHVybiBuZXcgVmVjdG9yMihcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHBvaW50MC54LCBwb2ludDEueCwgcG9pbnQyLngsIHBvaW50My54ICksXG5cdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwb2ludDAueSwgcG9pbnQxLnksIHBvaW50Mi55LCBwb2ludDMueSApXG5cdCk7XG5cbn07XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyQ3VydmUoIHYwLCB2MSwgdjIsIHYzICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnYwID0gdjA7XG5cdHRoaXMudjEgPSB2MTtcblx0dGhpcy52MiA9IHYyO1xuXHR0aGlzLnYzID0gdjM7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRyZXR1cm4gbmV3IFZlY3RvcjIoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApXG5cdCk7XG5cbn07XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnYwID0gdjA7XG5cdHRoaXMudjEgPSB2MTtcblx0dGhpcy52MiA9IHYyO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcblxuXHRyZXR1cm4gbmV3IFZlY3RvcjIoXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55IClcblx0KTtcblxufTtcblxudmFyIFBhdGhQcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZVBhdGgucHJvdG90eXBlICksIHtcblxuXHRmcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggdmVjdG9yc1sgMCBdLngsIHZlY3RvcnNbIDAgXS55ICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCB2ZWN0b3JzWyBpIF0ueCwgdmVjdG9yc1sgaSBdLnkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XG5cblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBMaW5lQ3VydmUoIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBWZWN0b3IyKCB4LCB5ICkgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7XG5cblx0fSxcblxuXHRxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBRdWFkcmF0aWNCZXppZXJDdXJ2ZShcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQeCwgYUNQeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0c3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgLypBcnJheSBvZiBWZWN0b3IqLyApIHtcblxuXHRcdHZhciBucHRzID0gWyB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpIF0uY29uY2F0KCBwdHMgKTtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTtcblxuXHR9LFxuXG5cdGFyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cyxcblx0XHRcdGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGFic2FyYzogZnVuY3Rpb24gKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdH0sXG5cblx0ZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0dmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0fSxcblxuXHRhYnNlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdGlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBwcmVzZW50LCBhdHRlbXB0IHRvIGpvaW5cblx0XHRcdHZhciBmaXJzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDAgKTtcblxuXHRcdFx0aWYgKCAhIGZpcnN0UG9pbnQuZXF1YWxzKCB0aGlzLmN1cnJlbnRQb2ludCApICkge1xuXG5cdFx0XHRcdHRoaXMubGluZVRvKCBmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dmFyIGxhc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAxICk7XG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggbGFzdFBvaW50ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQ3JlYXRlcyBmcmVlIGZvcm0gMmQgcGF0aCB1c2luZyBzZXJpZXMgb2YgcG9pbnRzLCBsaW5lcyBvciBjdXJ2ZXMuXG4gKiovXG5cbmZ1bmN0aW9uIFBhdGgoIHBvaW50cyApIHtcblxuXHRDdXJ2ZVBhdGguY2FsbCggdGhpcyApO1xuXHR0aGlzLmN1cnJlbnRQb2ludCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0aWYgKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLmZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdH1cblxufVxuXG5QYXRoLnByb3RvdHlwZSA9IFBhdGhQcm90b3R5cGU7XG5QYXRoUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGF0aDtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBEZWZpbmVzIGEgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMuXG4gKiovXG5cbi8vIFNURVAgMSBDcmVhdGUgYSBwYXRoLlxuLy8gU1RFUCAyIFR1cm4gcGF0aCBpbnRvIHNoYXBlLlxuLy8gU1RFUCAzIEV4dHJ1ZGVHZW9tZXRyeSB0YWtlcyBpbiBTaGFwZS9TaGFwZXNcbi8vIFNURVAgM2EgLSBFeHRyYWN0IHBvaW50cyBmcm9tIGVhY2ggc2hhcGUsIHR1cm4gdG8gdmVydGljZXNcbi8vIFNURVAgM2IgLSBUcmlhbmd1bGF0ZSBlYWNoIHNoYXBlLCBhZGQgZmFjZXMuXG5cbmZ1bmN0aW9uIFNoYXBlKCkge1xuXG5cdFBhdGguYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMuaG9sZXMgPSBbXTtcblxufVxuXG5TaGFwZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQYXRoUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2hhcGUsXG5cblx0Z2V0UG9pbnRzSG9sZXM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0dmFyIGhvbGVzUHRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVzUHRzWyBpIF0gPSB0aGlzLmhvbGVzWyBpIF0uZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBob2xlc1B0cztcblxuXHR9LFxuXG5cdC8vIEdldCBwb2ludHMgb2Ygc2hhcGUgYW5kIGhvbGVzIChrZXlwb2ludHMgYmFzZWQgb24gc2VnbWVudHMgcGFyYW1ldGVyKVxuXG5cdGV4dHJhY3RBbGxQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2hhcGU6IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKSxcblx0XHRcdGhvbGVzOiB0aGlzLmdldFBvaW50c0hvbGVzKCBkaXZpc2lvbnMgKVxuXG5cdFx0fTtcblxuXHR9LFxuXG5cdGV4dHJhY3RQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZXh0cmFjdEFsbFBvaW50cyggZGl2aXNpb25zICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogbWluaW1hbCBjbGFzcyBmb3IgcHJveGluZyBmdW5jdGlvbnMgdG8gUGF0aC4gUmVwbGFjZXMgb2xkIFwiZXh0cmFjdFN1YnBhdGhzKClcIlxuICoqL1xuXG5mdW5jdGlvbiBTaGFwZVBhdGgoKSB7XG5cblx0dGhpcy5zdWJQYXRocyA9IFtdO1xuXHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7XG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTtcblx0XHR0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0fSxcblxuXHR0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcblxuXHRcdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0dmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xuXG5cdFx0XHR2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XG5cblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxuXHRcdFx0dmFyIGluc2lkZSA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcblxuXHRcdFx0XHR2YXIgZWRnZUxvd1B0ICA9IGluUG9seWdvblsgcCBdO1xuXHRcdFx0XHR2YXIgZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcSBdO1xuXG5cdFx0XHRcdHZhciBlZGdlRHggPSBlZGdlSGlnaFB0LnggLSBlZGdlTG93UHQueDtcblx0XHRcdFx0dmFyIGVkZ2VEeSA9IGVkZ2VIaWdoUHQueSAtIGVkZ2VMb3dQdC55O1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIGVkZ2VEeSApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHQvLyBub3QgcGFyYWxsZWxcblx0XHRcdFx0XHRpZiAoIGVkZ2VEeSA8IDAgKSB7XG5cblx0XHRcdFx0XHRcdGVkZ2VMb3dQdCAgPSBpblBvbHlnb25bIHEgXTsgZWRnZUR4ID0gLSBlZGdlRHg7XG5cdFx0XHRcdFx0XHRlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBwIF07IGVkZ2VEeSA9IC0gZWRnZUR5O1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggKCBpblB0LnkgPCBlZGdlTG93UHQueSApIHx8ICggaW5QdC55ID4gZWRnZUhpZ2hQdC55ICkgKSBcdFx0Y29udGludWU7XG5cblx0XHRcdFx0XHRpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaW5QdC54ID09PSBlZGdlTG93UHQueCApXHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cblx0XHRcdFx0XHRcdC8vIGNvbnRpbnVlO1x0XHRcdFx0Ly8gbm8gaW50ZXJzZWN0aW9uIG9yIGVkZ2VMb3dQdCA9PiBkb2Vzbid0IGNvdW50ICEhIVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIHBlcnBFZGdlID0gZWRnZUR5ICogKCBpblB0LnggLSBlZGdlTG93UHQueCApIC0gZWRnZUR4ICogKCBpblB0LnkgLSBlZGdlTG93UHQueSApO1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA9PT0gMCApXHRcdFx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlIDwgMCApIFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcdFx0Ly8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxuXHRcdFx0XHRcdGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIFx0XHRjb250aW51ZTtcdFx0XHQvLyBwYXJhbGxlbFxuXHRcdFx0XHRcdC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5QdFxuXHRcdFx0XHRcdGlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHxcblx0XHRcdFx0XHRcdCAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApXHRcdHJldHVyblx0dHJ1ZTtcdC8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIVxuXHRcdFx0XHRcdC8vIGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm5cdGluc2lkZTtcblxuXHRcdH1cblxuXHRcdHZhciBpc0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7XG5cblx0XHR2YXIgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzO1xuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAwICkgcmV0dXJuIFtdO1xuXG5cdFx0aWYgKCBub0hvbGVzID09PSB0cnVlIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xuXG5cblx0XHR2YXIgc29saWQsIHRtcFBhdGgsIHRtcFNoYXBlLCBzaGFwZXMgPSBbXTtcblxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTtcblx0XHRcdHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApO1xuXHRcdGhvbGVzRmlyc3QgPSBpc0NDVyA/ICEgaG9sZXNGaXJzdCA6IGhvbGVzRmlyc3Q7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhcIkhvbGVzIGZpcnN0XCIsIGhvbGVzRmlyc3QpO1xuXG5cdFx0dmFyIGJldHRlclNoYXBlSG9sZXMgPSBbXTtcblx0XHR2YXIgbmV3U2hhcGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlSG9sZXMgPSBbXTtcblx0XHR2YXIgbWFpbklkeCA9IDA7XG5cdFx0dmFyIHRtcFBvaW50cztcblxuXHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0gdW5kZWZpbmVkO1xuXHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ViUGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07XG5cdFx0XHR0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpO1xuXHRcdFx0c29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7XG5cdFx0XHRzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkO1xuXG5cdFx0XHRpZiAoIHNvbGlkICkge1xuXG5cdFx0XHRcdGlmICggKCAhIGhvbGVzRmlyc3QgKSAmJiAoIG5ld1NoYXBlc1sgbWFpbklkeCBdICkgKVx0bWFpbklkeCArKztcblxuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9O1xuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXS5zLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdGlmICggaG9sZXNGaXJzdCApXHRtYWluSWR4ICsrO1xuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjdycsIGkpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXS5wdXNoKCB7IGg6IHRtcFBhdGgsIHA6IHRtcFBvaW50c1sgMCBdIH0gKTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjY3cnLCBpKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gb25seSBIb2xlcz8gLT4gcHJvYmFibHkgYWxsIFNoYXBlcyB3aXRoIHdyb25nIG9yaWVudGF0aW9uXG5cdFx0aWYgKCAhIG5ld1NoYXBlc1sgMCBdIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xuXG5cblx0XHRpZiAoIG5ld1NoYXBlcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHR2YXIgYW1iaWd1b3VzID0gZmFsc2U7XG5cdFx0XHR2YXIgdG9DaGFuZ2UgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0dmFyIHNobyA9IG5ld1NoYXBlSG9sZXNbIHNJZHggXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaElkeCA9IDA7IGhJZHggPCBzaG8ubGVuZ3RoOyBoSWR4ICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGhvID0gc2hvWyBoSWR4IF07XG5cdFx0XHRcdFx0dmFyIGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBoby5wLCBuZXdTaGFwZXNbIHMySWR4IF0ucCApICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggc0lkeCAhPT0gczJJZHggKVx0dG9DaGFuZ2UucHVzaCggeyBmcm9tczogc0lkeCwgdG9zOiBzMklkeCwgaG9sZTogaElkeCB9ICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aG9sZV91bmFzc2lnbmVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgczJJZHggXS5wdXNoKCBobyApO1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRhbWJpZ3VvdXMgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYW1iaWd1b3VzOiBcIiwgYW1iaWd1b3VzKTtcblx0XHRcdGlmICggdG9DaGFuZ2UubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInRvIGNoYW5nZTogXCIsIHRvQ2hhbmdlKTtcblx0XHRcdFx0aWYgKCAhIGFtYmlndW91cyApXHRuZXdTaGFwZUhvbGVzID0gYmV0dGVyU2hhcGVIb2xlcztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIHRtcEhvbGVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG5ld1NoYXBlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dG1wU2hhcGUgPSBuZXdTaGFwZXNbIGkgXS5zO1xuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cdFx0XHR0bXBIb2xlcyA9IG5ld1NoYXBlSG9sZXNbIGkgXTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHRtcEhvbGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHRtcFNoYXBlLmhvbGVzLnB1c2goIHRtcEhvbGVzWyBqIF0uaCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL2NvbnNvbGUubG9nKFwic2hhcGVcIiwgc2hhcGVzKTtcblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb250KCBkYXRhICkge1xuXG5cdHRoaXMuZGF0YSA9IGRhdGE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udC5wcm90b3R5cGUsIHtcblxuXHRpc0ZvbnQ6IHRydWUsXG5cblx0Z2VuZXJhdGVTaGFwZXM6IGZ1bmN0aW9uICggdGV4dCwgc2l6ZSwgZGl2aXNpb25zICkge1xuXG5cdFx0ZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQgKSB7XG5cblx0XHRcdHZhciBjaGFycyA9IFN0cmluZyggdGV4dCApLnNwbGl0KCAnJyApO1xuXHRcdFx0dmFyIHNjYWxlID0gc2l6ZSAvIGRhdGEucmVzb2x1dGlvbjtcblx0XHRcdHZhciBsaW5lX2hlaWdodCA9ICggZGF0YS5ib3VuZGluZ0JveC55TWF4IC0gZGF0YS5ib3VuZGluZ0JveC55TWluICsgZGF0YS51bmRlcmxpbmVUaGlja25lc3MgKSAqIHNjYWxlO1xuXG5cdFx0XHR2YXIgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwO1xuXG5cdFx0XHR2YXIgcGF0aHMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGFyID0gY2hhcnNbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGNoYXIgPT09ICdcXG4nICkge1xuXG5cdFx0XHRcdFx0b2Zmc2V0WCA9IDA7XG5cdFx0XHRcdFx0b2Zmc2V0WSAtPSBsaW5lX2hlaWdodDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmFyIHJldCA9IGNyZWF0ZVBhdGgoIGNoYXIsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZICk7XG5cdFx0XHRcdFx0b2Zmc2V0WCArPSByZXQub2Zmc2V0WDtcblx0XHRcdFx0XHRwYXRocy5wdXNoKCByZXQucGF0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcGF0aHM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjcmVhdGVQYXRoKCBjLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSApIHtcblxuXHRcdFx0dmFyIGdseXBoID0gZGF0YS5nbHlwaHNbIGMgXSB8fCBkYXRhLmdseXBoc1sgJz8nIF07XG5cblx0XHRcdGlmICggISBnbHlwaCApIHJldHVybjtcblxuXHRcdFx0dmFyIHBhdGggPSBuZXcgU2hhcGVQYXRoKCk7XG5cblx0XHRcdHZhciBwdHMgPSBbXTtcblx0XHRcdHZhciB4LCB5LCBjcHgsIGNweSwgY3B4MCwgY3B5MCwgY3B4MSwgY3B5MSwgY3B4MiwgY3B5MiwgbGFzdGU7XG5cblx0XHRcdGlmICggZ2x5cGgubyApIHtcblxuXHRcdFx0XHR2YXIgb3V0bGluZSA9IGdseXBoLl9jYWNoZWRPdXRsaW5lIHx8ICggZ2x5cGguX2NhY2hlZE91dGxpbmUgPSBnbHlwaC5vLnNwbGl0KCAnICcgKSApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7XG5cblx0XHRcdFx0XHR2YXIgYWN0aW9uID0gb3V0bGluZVsgaSArKyBdO1xuXG5cdFx0XHRcdFx0c3dpdGNoICggYWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRjYXNlICdtJzogLy8gbW92ZVRvXG5cblx0XHRcdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdFx0XHRwYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlICdsJzogLy8gbGluZVRvXG5cblx0XHRcdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdFx0XHRwYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlICdxJzogLy8gcXVhZHJhdGljQ3VydmVUb1xuXG5cdFx0XHRcdFx0XHRcdGNweCAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdGNweSAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRcdFx0cGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0XHRcdGxhc3RlID0gcHRzWyBwdHMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggbGFzdGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRjcHgwID0gbGFzdGUueDtcblx0XHRcdFx0XHRcdFx0XHRjcHkwID0gbGFzdGUueTtcblxuXHRcdFx0XHRcdFx0XHRcdGZvciAoIHZhciBpMiA9IDE7IGkyIDw9IGRpdmlzaW9uczsgaTIgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHZhciB0ID0gaTIgLyBkaXZpc2lvbnM7XG5cdFx0XHRcdFx0XHRcdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIGNweDAsIGNweDEsIGNweCApO1xuXHRcdFx0XHRcdFx0XHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCBjcHkwLCBjcHkxLCBjcHkgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvXG5cblx0XHRcdFx0XHRcdFx0Y3B4ICA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0Y3B5ICA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRcdFx0Y3B4MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRcdFx0Y3B4MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRcdFx0Y3B5MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdFx0XHRwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRcdFx0bGFzdGUgPSBwdHNbIHB0cy5sZW5ndGggLSAxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBsYXN0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGNweDAgPSBsYXN0ZS54O1xuXHRcdFx0XHRcdFx0XHRcdGNweTAgPSBsYXN0ZS55O1xuXG5cdFx0XHRcdFx0XHRcdFx0Zm9yICggdmFyIGkyID0gMTsgaTIgPD0gZGl2aXNpb25zOyBpMiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHQgPSBpMiAvIGRpdmlzaW9ucztcblx0XHRcdFx0XHRcdFx0XHRcdEN1YmljQmV6aWVyKCB0LCBjcHgwLCBjcHgxLCBjcHgyLCBjcHggKTtcblx0XHRcdFx0XHRcdFx0XHRcdEN1YmljQmV6aWVyKCB0LCBjcHkwLCBjcHkxLCBjcHkyLCBjcHkgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IG9mZnNldFg6IGdseXBoLmhhICogc2NhbGUsIHBhdGg6IHBhdGggfTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7XG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQ7XG5cblx0XHR2YXIgZGF0YSA9IHRoaXMuZGF0YTtcblxuXHRcdHZhciBwYXRocyA9IGNyZWF0ZVBhdGhzKCB0ZXh0ICk7XG5cdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHBhdGhzLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBdLnRvU2hhcGVzKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb250TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvbnRMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBjb250ZXh0O1xuXG52YXIgQXVkaW9Db250ZXh0ID0ge1xuXG5cdGdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY29udGV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb250ZXh0ID0gbmV3ICggd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0ICkoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjb250ZXh0O1xuXG5cdH0sXG5cblx0c2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnRleHQgPSB2YWx1ZTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XG5cblx0XHRcdGNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKCBidWZmZXIsIGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCBhdWRpb0J1ZmZlciApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTdGVyZW9DYW1lcmEoKSB7XG5cblx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XG5cblx0dGhpcy5hc3BlY3QgPSAxO1xuXG5cdHRoaXMuZXllU2VwID0gMC4wNjQ7XG5cblx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3RlcmVvQ2FtZXJhLnByb3RvdHlwZSwge1xuXG5cdHVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW5zdGFuY2UsIGZvY3VzLCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyLCB6b29tLCBleWVTZXA7XG5cblx0XHR2YXIgZXllUmlnaHQgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBleWVMZWZ0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdFx0dmFyIG5lZWRzVXBkYXRlID0gaW5zdGFuY2UgIT09IHRoaXMgfHwgZm9jdXMgIT09IGNhbWVyYS5mb2N1cyB8fCBmb3YgIT09IGNhbWVyYS5mb3YgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0IHx8IG5lYXIgIT09IGNhbWVyYS5uZWFyIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmYXIgIT09IGNhbWVyYS5mYXIgfHwgem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgZXllU2VwICE9PSB0aGlzLmV5ZVNlcDtcblxuXHRcdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0XHRpbnN0YW5jZSA9IHRoaXM7XG5cdFx0XHRcdGZvY3VzID0gY2FtZXJhLmZvY3VzO1xuXHRcdFx0XHRmb3YgPSBjYW1lcmEuZm92O1xuXHRcdFx0XHRhc3BlY3QgPSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3Q7XG5cdFx0XHRcdG5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRcdFx0ZmFyID0gY2FtZXJhLmZhcjtcblx0XHRcdFx0em9vbSA9IGNhbWVyYS56b29tO1xuXG5cdFx0XHRcdC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb25cblx0XHRcdFx0Ly8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci9cblxuXHRcdFx0XHR2YXIgcHJvamVjdGlvbk1hdHJpeCA9IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCk7XG5cdFx0XHRcdGV5ZVNlcCA9IHRoaXMuZXllU2VwIC8gMjtcblx0XHRcdFx0dmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcCAqIG5lYXIgLyBmb2N1cztcblx0XHRcdFx0dmFyIHltYXggPSAoIG5lYXIgKiBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIGZvdiAqIDAuNSApICkgLyB6b29tO1xuXHRcdFx0XHR2YXIgeG1pbiwgeG1heDtcblxuXHRcdFx0XHQvLyB0cmFuc2xhdGUgeE9mZnNldFxuXG5cdFx0XHRcdGV5ZUxlZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcDtcblx0XHRcdFx0ZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXA7XG5cblx0XHRcdFx0Ly8gZm9yIGxlZnQgZXllXG5cblx0XHRcdFx0eG1pbiA9IC0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdFx0eG1heCA9IHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIG5lYXIgLyAoIHhtYXggLSB4bWluICk7XG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0XHR0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZm9yIHJpZ2h0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllTGVmdCApO1xuXHRcdFx0dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVSaWdodCApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQ2FtZXJhIGZvciByZW5kZXJpbmcgY3ViZSBtYXBzXG4gKlx0LSByZW5kZXJzIHNjZW5lIGludG8gYXhpcy1hbGlnbmVkIGN1YmVcbiAqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVDYW1lcmEoIG5lYXIsIGZhciwgY3ViZVJlc29sdXRpb24gKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJlQ2FtZXJhJztcblxuXHR2YXIgZm92ID0gOTAsIGFzcGVjdCA9IDE7XG5cblx0dmFyIGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBYLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYVBYLmxvb2tBdCggbmV3IFZlY3RvcjMoIDEsIDAsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFggKTtcblxuXHR2YXIgY2FtZXJhTlggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhTlgubG9va0F0KCBuZXcgVmVjdG9yMyggLSAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5YICk7XG5cblx0dmFyIGNhbWVyYVBZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBZLnVwLnNldCggMCwgMCwgMSApO1xuXHRjYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBZICk7XG5cblx0dmFyIGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5ZLnVwLnNldCggMCwgMCwgLSAxICk7XG5cdGNhbWVyYU5ZLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWSApO1xuXG5cdHZhciBjYW1lcmFQWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAxICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBaICk7XG5cblx0dmFyIGNhbWVyYU5aID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5aLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWiApO1xuXG5cdHZhciBvcHRpb25zID0geyBmb3JtYXQ6IFJHQkZvcm1hdCwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyIH07XG5cblx0dGhpcy5yZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCBjdWJlUmVzb2x1dGlvbiwgY3ViZVJlc29sdXRpb24sIG9wdGlvbnMgKTtcblx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gXCJDdWJlQ2FtZXJhXCI7XG5cblx0dGhpcy51cGRhdGVDdWJlTWFwID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXHRcdHZhciBnZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAyO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA1O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cbn1cblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkN1YmVDYW1lcmEucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZUNhbWVyYTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFycmF5Q2FtZXJhKCBhcnJheSApIHtcblxuXHRQZXJzcGVjdGl2ZUNhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cdHRoaXMuY2FtZXJhcyA9IGFycmF5IHx8IFtdO1xuXG59XG5cbkFycmF5Q2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFycmF5Q2FtZXJhLFxuXG5cdGlzQXJyYXlDYW1lcmE6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9MaXN0ZW5lcigpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInO1xuXG5cdHRoaXMuY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdHRoaXMuZmlsdGVyID0gbnVsbDtcblxufVxuXG5BdWRpb0xpc3RlbmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvTGlzdGVuZXIsXG5cblx0Z2V0SW5wdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW47XG5cblx0fSxcblxuXHRyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uICggKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXI7XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXIgPSB2YWx1ZTtcblx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHR0aGlzLmZpbHRlci5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHR9LFxuXG5cdGdldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xuXG5cdH0sXG5cblx0c2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5nYWluLmdhaW4udmFsdWUgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHZhciBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjtcblx0XHRcdHZhciB1cCA9IHRoaXMudXA7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTtcblxuXHRcdFx0b3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0aWYgKCBsaXN0ZW5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFguc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBYLnNldFZhbHVlQXRUaW1lKCB1cC54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBZLnNldFZhbHVlQXRUaW1lKCB1cC55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBaLnNldFZhbHVlQXRUaW1lKCB1cC56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXHRcdFx0XHRsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50YXRpb24ueCwgb3JpZW50YXRpb24ueSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW8nO1xuXG5cdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XG5cblx0dGhpcy5idWZmZXIgPSBudWxsO1xuXHR0aGlzLmxvb3AgPSBmYWxzZTtcblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLnBsYXliYWNrUmF0ZSA9IDE7XG5cdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTtcblx0dGhpcy5zb3VyY2VUeXBlID0gJ2VtcHR5JztcblxuXHR0aGlzLmZpbHRlcnMgPSBbXTtcblxufVxuXG5BdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBdWRpbyxcblxuXHRnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW47XG5cblx0fSxcblxuXHRzZXROb2RlU291cmNlOiBmdW5jdGlvbiAoIGF1ZGlvTm9kZSApIHtcblxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2F1ZGlvTm9kZSc7XG5cdFx0dGhpcy5zb3VyY2UgPSBhdWRpb05vZGU7XG5cdFx0dGhpcy5jb25uZWN0KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEJ1ZmZlcjogZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHtcblxuXHRcdHRoaXMuYnVmZmVyID0gYXVkaW9CdWZmZXI7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XG5cblx0XHRpZiAoIHRoaXMuYXV0b3BsYXkgKSB0aGlzLnBsYXkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcblxuXHRcdHNvdXJjZS5idWZmZXIgPSB0aGlzLmJ1ZmZlcjtcblx0XHRzb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblx0XHRzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7XG5cdFx0c291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuc3RhcnRUaW1lICk7XG5cdFx0c291cmNlLnN0YXJ0KCAwLCB0aGlzLnN0YXJ0VGltZSApO1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdHRoaXMuc3RhcnRUaW1lID0gMDtcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXJzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXJzO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggISB2YWx1ZSApIHZhbHVlID0gW107XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLmRpc2Nvbm5lY3QoKTtcblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlO1xuXHRcdFx0dGhpcy5jb25uZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbIDAgXTtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCBmaWx0ZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKCBmaWx0ZXIgPyBbIGZpbHRlciBdIDogW10gKTtcblxuXHR9LFxuXG5cdHNldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnBsYXliYWNrUmF0ZSA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlO1xuXG5cdH0sXG5cblx0b25FbmRlZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHR9LFxuXG5cdGdldExvb3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5sb29wO1xuXG5cdH0sXG5cblx0c2V0TG9vcDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmxvb3AgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFZvbHVtZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xuXG5cdH0sXG5cdFxuXHRzZXRWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi52YWx1ZSA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdEF1ZGlvLmNhbGwoIHRoaXMsIGxpc3RlbmVyICk7XG5cblx0dGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7XG5cdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xuXG59XG5cblBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb3NpdGlvbmFsQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXI7XG5cblx0fSxcblxuXHRnZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fSxcblxuXHRzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHRoaXMucGFubmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7XG5cblx0dGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcblx0dGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7XG5cblx0dGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTtcblxuXHRhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHtcblxuXHRnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fSxcblxuXHRnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsdWUgPSAwLCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsdWUgKz0gZGF0YVsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcblx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XG5cblx0dmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksXG5cdFx0bWl4RnVuY3Rpb247XG5cblx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRidWZmZXJUeXBlID0gQXJyYXk7XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblxuXHR9XG5cblx0dGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApO1xuXHQvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBdXG5cdC8vXG5cdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcblx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0Ly9cblx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3Jcblx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdC8vIGNoYW5nZXNcblx0Ly9cblx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cblx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XG5cblx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR0aGlzLnVzZUNvdW50ID0gMDtcblx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHtcblxuXHQvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nXG5cdGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XG5cblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdHZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2FjY3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyXG5cdGFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXG5cblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1c1xuXHRzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZ1xuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdH0sXG5cblxuXHQvLyBtaXggZnVuY3Rpb25zXG5cblx0X3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHRpZiAoIHQgPj0gMC41ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcblxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XG5cblx0fSxcblxuXHRfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHR2YXIgcyA9IDEgLSB0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb21wb3NpdGUoIHRhcmdldEdyb3VwLCBwYXRoLCBvcHRpb25hbFBhcnNlZFBhdGggKSB7XG5cblx0dmFyIHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDtcblx0dGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRlLnByb3RvdHlwZSwge1xuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTsgLy8gYmluZCBhbGwgYmluZGluZ1xuXG5cdFx0dmFyIGZpcnN0VmFsaWRJbmRleCA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmcgPSB0aGlzLl9iaW5kaW5nc1sgZmlyc3RWYWxpZEluZGV4IF07XG5cblx0XHQvLyBhbmQgb25seSBjYWxsIC5nZXRWYWx1ZSBvbiB0aGUgZmlyc3Rcblx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIGJpbmRpbmcuZ2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5iaW5kKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51bmJpbmQoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuXG5mdW5jdGlvbiBQcm9wZXJ0eUJpbmRpbmcoIHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdHRoaXMucGF0aCA9IHBhdGg7XG5cdHRoaXMucGFyc2VkUGF0aCA9IHBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5ub2RlID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCByb290Tm9kZSwgdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgcm9vdE5vZGU7XG5cblx0dGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZywge1xuXG5cdENvbXBvc2l0ZTogQ29tcG9zaXRlLFxuXG5cdGNyZWF0ZTogZnVuY3Rpb24gKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0aWYgKCAhICggcm9vdCAmJiByb290LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXAgKSApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cGFyc2VUcmFja05hbWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XG5cdFx0Ly8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS5cblx0XHR2YXIgZGlyZWN0b3J5UmUgPSAvKCg/OltcXHctXStbXFwvOl0pKikvO1xuXG5cdFx0Ly8gVGFyZ2V0IG5vZGUuIE1heSBjb250YWluIHdvcmQgY2hhcmFjdGVycyAoYS16QS1aMC05XykgYW5kICcuJyBvciAnLScuXG5cdFx0dmFyIG5vZGVSZSA9IC8oW1xcdy1cXC5dKyk/LztcblxuXHRcdC8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBOYW1lIG1heSBjb250YWluIG9ubHkgd29yZFxuXHRcdC8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC5cblx0XHR2YXIgb2JqZWN0UmUgPSAvKD86XFwuKFtcXHctXSspKD86XFxbKC4rKVxcXSk/KT8vO1xuXG5cdFx0Ly8gUHJvcGVydHkgYW5kIGFjY2Vzc29yLiBNYXkgY29udGFpbiBvbmx5IHdvcmQgY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5XG5cdFx0Ly8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy5cblx0XHR2YXIgcHJvcGVydHlSZSA9IC9cXC4oW1xcdy1dKykoPzpcXFsoLispXFxdKT8vO1xuXG5cdFx0dmFyIHRyYWNrUmUgPSBuZXcgUmVnRXhwKCcnXG5cdFx0XHQrICdeJ1xuXHRcdFx0KyBkaXJlY3RvcnlSZS5zb3VyY2Vcblx0XHRcdCsgbm9kZVJlLnNvdXJjZVxuXHRcdFx0KyBvYmplY3RSZS5zb3VyY2Vcblx0XHRcdCsgcHJvcGVydHlSZS5zb3VyY2Vcblx0XHRcdCsgJyQnXG5cdFx0KTtcblxuXHRcdHZhciBzdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIHRyYWNrTmFtZSApIHtcblxuXHRcdFx0XHR2YXIgbWF0Y2hlcyA9IHRyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0aWYgKCAhIG1hdGNoZXMgKSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHJlc3VsdHMgPSB7XG5cdFx0XHRcdFx0Ly8gZGlyZWN0b3J5TmFtZTogbWF0Y2hlc1sgMSBdLCAvLyAodHNjaHcpIGN1cnJlbnRseSB1bnVzZWRcblx0XHRcdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxuXHRcdFx0XHRcdG9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSxcblx0XHRcdFx0XHRvYmplY3RJbmRleDogbWF0Y2hlc1sgNCBdLFxuXHRcdFx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAgICAgLy8gcmVxdWlyZWRcblx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHR2YXIgbGFzdERvdCA9IHJlc3VsdHMubm9kZU5hbWUgJiYgcmVzdWx0cy5ub2RlTmFtZS5sYXN0SW5kZXhPZiggJy4nICk7XG5cblx0XHRcdFx0aWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLTEgKSB7XG5cblx0XHRcdFx0XHR2YXIgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApO1xuXG5cdFx0XHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHRcdFx0Ly8gaXMgbm8gd2F5IHRvIHBhcnNlICdmb28uYmFyLmJheic6ICdiYXonIG11c3QgYmUgYSBwcm9wZXJ0eSwgYnV0XG5cdFx0XHRcdFx0Ly8gJ2JhcicgY291bGQgYmUgdGhlIG9iamVjdE5hbWUsIG9yIHBhcnQgb2YgYSBub2RlTmFtZSAod2hpY2ggY2FuXG5cdFx0XHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRcdFx0aWYgKCBzdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0xICkge1xuXG5cdFx0XHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0XHRcdHJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggcmVzdWx0cy5wcm9wZXJ0eU5hbWUgPT09IG51bGwgfHwgcmVzdWx0cy5wcm9wZXJ0eU5hbWUubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0fTtcblxuXHR9KCksXG5cblx0ZmluZE5vZGU6IGZ1bmN0aW9uICggcm9vdCwgbm9kZU5hbWUgKSB7XG5cblx0XHRpZiAoICEgbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09IFwiXCIgfHwgbm9kZU5hbWUgPT09IFwicm9vdFwiIHx8IG5vZGVOYW1lID09PSBcIi5cIiB8fCBub2RlTmFtZSA9PT0gLSAxIHx8IG5vZGVOYW1lID09PSByb290Lm5hbWUgfHwgbm9kZU5hbWUgPT09IHJvb3QudXVpZCApIHtcblxuXHRcdFx0cmV0dXJuIHJvb3Q7XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBza2VsZXRvbiBib25lcy5cblx0XHRpZiAoIHJvb3Quc2tlbGV0b24gKSB7XG5cblx0XHRcdHZhciBzZWFyY2hTa2VsZXRvbiA9IGZ1bmN0aW9uICggc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc2tlbGV0b24uYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGJvbmUgPSBza2VsZXRvbi5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBib25lLm5hbWUgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gYm9uZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBib25lID0gc2VhcmNoU2tlbGV0b24oIHJvb3Quc2tlbGV0b24gKTtcblxuXHRcdFx0aWYgKCBib25lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdF0sXG5cblx0U2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFtcblxuXHRcdFtcblx0XHRcdC8vIERpcmVjdFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gRW50aXJlQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBBcnJheUVsZW1lbnRcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEhhc1RvRnJvbUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XVxuXG5cdF0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XG5cblx0XHQvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcblx0XHQvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxuXHRcdC8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXG5cdFx0Ly8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXG5cdFx0Ly8gYmVjb21lIG5vLW9wcy5cblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0Ly8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaFxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLFxuXHRcdFx0cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCxcblxuXHRcdFx0b2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSxcblx0XHRcdHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLFxuXHRcdFx0cHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcblxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZShcblx0XHRcdFx0XHR0aGlzLnJvb3ROb2RlLCBwYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgdGhpcy5yb290Tm9kZTtcblxuXHRcdFx0dGhpcy5ub2RlID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2V0IGZhaWwgc3RhdGUgc28gd2UgY2FuIGp1c3QgJ3JldHVybicgb24gZXJyb3Jcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO1xuXG5cdFx0Ly8gZW5zdXJlIHRoZXJlIGlzIGEgdmFsdWUgbm9kZVxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiICB0cnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiBcIiArIHRoaXMucGF0aCArIFwiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuXCIgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0dmFyIG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDtcblxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlcyB3ZXJlIHdlIG5lZWQgdG8gcmVhY2ggZGVlcGVyIGludG8gdGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIGZhY2UgbWF0ZXJpYWxzLi4uLlxuXHRcdFx0c3dpdGNoICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdtYXRlcmlhbHMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJyAgY2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICcgIGNhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5JywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscztcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2JvbmVzJzpcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3Quc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICcgIGNhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXJcblx0XHRcdFx0XHQvLyBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIGkgXS5uYW1lID09PSBvYmplY3RJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3RJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnICBjYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlLCB1bmRlZmluZWQnLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdGlmICggb2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggXCIgIHRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQ6XCIsIHRoaXMsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XG5cdFx0dmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIiAgdHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6IFwiICsgbm9kZU5hbWUgK1xuXHRcdFx0XHQnLicgKyBwcm9wZXJ0eU5hbWUgKyBcIiBidXQgaXQgd2Fzbid0IGZvdW5kLlwiLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZVxuXHRcdHZhciB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7XG5cblx0XHRpZiAoIHRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbFxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybVxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cdFx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBob3cgdGhlIHByb3BlcnR5IGdldHMgYm91bmRcblx0XHR2YXIgYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtcblxuXHRcdGlmICggcHJvcGVydHlJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBhY2Nlc3MgYSBzdWIgZWxlbWVudCBvZiB0aGUgcHJvcGVydHkgYXJyYXkgKG9ubHkgcHJpbWl0aXZlcyBhcmUgc3VwcG9ydGVkIHJpZ2h0IG5vdylcblxuXHRcdFx0aWYgKCBwcm9wZXJ0eU5hbWUgPT09IFwibW9ycGhUYXJnZXRJbmZsdWVuY2VzXCIgKSB7XG5cblx0XHRcdFx0Ly8gcG90ZW50aWFsIG9wdGltaXphdGlvbiwgc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyLCBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxuXHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJyAgY2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhc3VzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeScsIHRoaXMgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJyAgY2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhc3VzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMnLCB0aGlzICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblx0XHRcdHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7XG5cblx0XHR9IGVsc2UgaWYgKCBub2RlUHJvcGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvblxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkge1xuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGdldHRlciAvIHNldHRlclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTtcblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcblxuXHRcdC8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWVcblx0XHQvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZSdcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBcdC1cdEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiBcdFx0Y29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiBcdC1cdEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogXHQtXHRZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlclxuICogXHRcdGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgXHRPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogIFx0c28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogIFx0b24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogXHQtIFx0VGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogXHRcdGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLVx0QSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYVxuICogIFx0dGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk9iamVjdEdyb3VwKCB2YXJfYXJncyApIHtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHQvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXNcblx0dGhpcy5fb2JqZWN0cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblxuXHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IDA7XHRcdFx0Ly8gdGhyZXNob2xkXG5cdC8vIG5vdGU6IHJlYWQgYnkgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZVxuXG5cdHZhciBpbmRpY2VzID0ge307XG5cdHRoaXMuX2luZGljZXNCeVVVSUQgPSBpbmRpY2VzO1x0XHQvLyBmb3IgYm9va2tlZXBpbmdcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0aW5kaWNlc1sgYXJndW1lbnRzWyBpIF0udXVpZCBdID0gaTtcblxuXHR9XG5cblx0dGhpcy5fcGF0aHMgPSBbXTtcdFx0XHRcdFx0Ly8gaW5zaWRlOiBzdHJpbmdcblx0dGhpcy5fcGFyc2VkUGF0aHMgPSBbXTtcdFx0XHRcdC8vIGluc2lkZTogeyB3ZSBkb24ndCBjYXJlLCBoZXJlIH1cblx0dGhpcy5fYmluZGluZ3MgPSBbXTsgXHRcdFx0XHQvLyBpbnNpZGU6IEFycmF5PCBQcm9wZXJ0eUJpbmRpbmcgPlxuXHR0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGggPSB7fTsgXHQvLyBpbnNpZGU6IGluZGljZXMgaW4gdGhlc2UgYXJyYXlzXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0b2JqZWN0czoge1xuXHRcdFx0Z2V0IHRvdGFsKCkgeyByZXR1cm4gc2NvcGUuX29iamVjdHMubGVuZ3RoOyB9LFxuXHRcdFx0Z2V0IGluVXNlKCkgeyByZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXzsgfVxuXHRcdH0sXG5cblx0XHRnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7IHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoOyB9XG5cblx0fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25PYmplY3RHcm91cC5wcm90b3R5cGUsIHtcblxuXHRpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiB0cnVlLFxuXG5cdGFkZDogZnVuY3Rpb24oIHZhcl9hcmdzICkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXSxcblx0XHRcdFx0a25vd25PYmplY3QgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKFxuXHRcdFx0XHRcdFx0XHRuZXcgUHJvcGVydHlCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdGtub3duT2JqZWN0ID0gb2JqZWN0c1sgaW5kZXggXTtcblxuXHRcdFx0XHQvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgQUNUSVZFIHJlZ2lvblxuXG5cdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzXG5cdFx0XHRcdFx0XHQvLyBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQsIHRoZSBiaW5kaW5nIG1heVxuXHRcdFx0XHRcdFx0Ly8gb3IgbWF5IG5vdCBleGlzdFxuXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5QmluZGluZyhcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdHNbIGluZGV4IF0gIT09IGtub3duT2JqZWN0ICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIFwiICtcblx0XHRcdFx0XHRcdFwiZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBcIiArXG5cdFx0XHRcdFx0XHRcImluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4uLlwiICk7XG5cblx0XHRcdH0gLy8gZWxzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgd2hlcmUgd2Ugd2FudCBpdCB0byBiZVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggdmFyX2FyZ3MgKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdHZhciBsYXN0Q2FjaGVkSW5kZXggPSBuQ2FjaGVkT2JqZWN0cyArKyxcblx0XHRcdFx0XHRmaXJzdEFjdGl2ZU9iamVjdCA9IG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdO1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gZmlyc3RBY3RpdmVPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gbGFzdENhY2hlZEluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXSA9IG9iamVjdDtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRmaXJzdEFjdGl2ZSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0sXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gZmlyc3RBY3RpdmU7XG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyByZW1vdmUgJiBmb3JnZXRcblx0dW5jYWNoZTogZnVuY3Rpb24oIHZhcl9hcmdzICkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdFx0dmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdC8vIGxhc3QgY2FjaGVkIG9iamVjdCB0YWtlcyB0aGlzIG9iamVjdCdzIHBsYWNlXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRcdC8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3Bcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdE9iamVjdDtcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xuXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0XHRsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdDtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcFxuXG5cdFx0XHRcdFx0dmFyIGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdE9iamVjdDtcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xuXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IC8vIGNhY2hlZCBvciBhY3RpdmVcblxuXHRcdFx0fSAvLyBpZiBvYmplY3QgaXMga25vd25cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdC8vIEludGVybmFsIGludGVyZmFjZSB1c2VkIGJ5IGJlZnJpZW5kZWQgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZTpcblxuXHRzdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHQvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWRcblx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBncm91cFxuXG5cdFx0dmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXSxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gYmluZGluZ3NbIGluZGV4IF07XG5cblx0XHR2YXIgcGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZ3NGb3JQYXRoID0gbmV3IEFycmF5KCBuT2JqZWN0cyApO1xuXG5cdFx0aW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRpbmRpY2VzQnlQYXRoWyBwYXRoIF0gPSBpbmRleDtcblxuXHRcdHBhdGhzLnB1c2goIHBhdGggKTtcblx0XHRwYXJzZWRQYXRocy5wdXNoKCBwYXJzZWRQYXRoICk7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRoICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IG5DYWNoZWRPYmplY3RzLCBuID0gb2JqZWN0cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBvYmplY3RzWyBpIF07XG5cdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJpbmRpbmdzRm9yUGF0aDtcblxuXHR9LFxuXG5cdHVuc3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoICkge1xuXG5cdFx0Ly8gdGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxvbmdlclxuXHRcdC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJ1xuXG5cdFx0dmFyIGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRcdGxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3RoIC0gMSxcblx0XHRcdFx0bGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0sXG5cdFx0XHRcdGxhc3RCaW5kaW5nc1BhdGggPSBwYXRoWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXG5cdFx0XHRpbmRpY2VzQnlQYXRoWyBsYXN0QmluZGluZ3NQYXRoIF0gPSBpbmRleDtcblxuXHRcdFx0YmluZGluZ3NbIGluZGV4IF0gPSBsYXN0QmluZGluZ3M7XG5cdFx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdFx0cGFyc2VkUGF0aHNbIGluZGV4IF0gPSBwYXJzZWRQYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhcnNlZFBhdGhzLnBvcCgpO1xuXG5cdFx0XHRwYXRoc1sgaW5kZXggXSA9IHBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXHRcdFx0cGF0aHMucG9wKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEFjdGlvbiBwcm92aWRlZCBieSBBbmltYXRpb25NaXhlciBmb3Igc2NoZWR1bGluZyBjbGlwIHBsYXliYWNrIG9uIHNwZWNpZmljXG4gKiBvYmplY3RzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQWN0aW9uKCBtaXhlciwgY2xpcCwgbG9jYWxSb290ICkge1xuXG5cdHRoaXMuX21peGVyID0gbWl4ZXI7XG5cdHRoaXMuX2NsaXAgPSBjbGlwO1xuXHR0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3QgfHwgbnVsbDtcblxuXHR2YXIgdHJhY2tzID0gY2xpcC50cmFja3MsXG5cdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0aW50ZXJwb2xhbnRzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XG5cblx0dmFyIGludGVycG9sYW50U2V0dGluZ3MgPSB7XG5cdFx0XHRlbmRpbmdTdGFydDogXHRaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdFx0ZW5kaW5nRW5kOlx0XHRaZXJvQ3VydmF0dXJlRW5kaW5nXG5cdH07XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50ID0gdHJhY2tzWyBpIF0uY3JlYXRlSW50ZXJwb2xhbnQoIG51bGwgKTtcblx0XHRpbnRlcnBvbGFudHNbIGkgXSA9IGludGVycG9sYW50O1xuXHRcdGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHR9XG5cblx0dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0dGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzO1x0Ly8gYm91bmQgYnkgdGhlIG1peGVyXG5cblx0Ly8gaW5zaWRlOiBQcm9wZXJ0eU1peGVyIChtYW5hZ2VkIGJ5IHRoZSBtaXhlcilcblx0dGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHRoaXMuX2NhY2hlSW5kZXggPSBudWxsO1x0XHRcdC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblx0dGhpcy5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XHRcdC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblxuXHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XG5cdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblxuXHR0aGlzLmxvb3AgPSBMb29wUmVwZWF0O1xuXHR0aGlzLl9sb29wQ291bnQgPSAtMTtcblxuXHQvLyBnbG9iYWwgbWl4ZXIgdGltZSB3aGVuIHRoZSBhY3Rpb24gaXMgdG8gYmUgc3RhcnRlZFxuXHQvLyBpdCdzIHNldCBiYWNrIHRvICdudWxsJyB1cG9uIHN0YXJ0IG9mIHRoZSBhY3Rpb25cblx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcblxuXHQvLyBzY2FsZWQgbG9jYWwgdGltZSBvZiB0aGUgYWN0aW9uXG5cdC8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3Bcblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7XG5cblx0dGhpcy53ZWlnaHQgPSAxO1xuXHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSAxO1xuXG5cdHRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgXHRcdC8vIG5vLiBvZiByZXBldGl0aW9ucyB3aGVuIGxvb3BpbmdcblxuXHR0aGlzLnBhdXNlZCA9IGZhbHNlO1x0XHRcdFx0Ly8gdHJ1ZSAtPiB6ZXJvIGVmZmVjdGl2ZSB0aW1lIHNjYWxlXG5cdHRoaXMuZW5hYmxlZCA9IHRydWU7XHRcdFx0XHQvLyBmYWxzZSAtPiB6ZXJvIGVmZmVjdGl2ZSB3ZWlnaHRcblxuXHR0aGlzLmNsYW1wV2hlbkZpbmlzaGVkIFx0PSBmYWxzZTtcdC8vIGtlZXAgZmVlZGluZyB0aGUgbGFzdCBmcmFtZT9cblxuXHR0aGlzLnplcm9TbG9wZUF0U3RhcnQgXHQ9IHRydWU7XHRcdC8vIGZvciBzbW9vdGggaW50ZXJwb2xhdGlvbiB3L28gc2VwYXJhdGVcblx0dGhpcy56ZXJvU2xvcGVBdEVuZFx0XHQ9IHRydWU7XHRcdC8vIGNsaXBzIGZvciBzdGFydCwgbG9vcCBhbmQgZW5kXG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQWN0aW9uLnByb3RvdHlwZSwge1xuXG5cdC8vIFN0YXRlICYgU2NoZWR1bGluZ1xuXG5cdHBsYXk6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzLnJlc2V0KCk7XG5cblx0fSxcblxuXHRyZXNldDogZnVuY3Rpb24oKSB7XG5cblx0XHR0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cblx0XHR0aGlzLnRpbWUgPSAwO1x0XHRcdC8vIHJlc3RhcnQgY2xpcFxuXHRcdHRoaXMuX2xvb3BDb3VudCA9IC0xO1x0Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcdC8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5lbmFibGVkICYmICEgdGhpcy5wYXVzZWQgJiYgdGhpcy50aW1lU2NhbGUgIT09IDAgJiZcblx0XHRcdFx0dGhpcy5fc3RhcnRUaW1lID09PSBudWxsICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRydWUgd2hlbiBwbGF5IGhhcyBiZWVuIGNhbGxlZFxuXHRpc1NjaGVkdWxlZDogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHRzdGFydEF0OiBmdW5jdGlvbiggdGltZSApIHtcblxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uKCBtb2RlLCByZXBldGl0aW9ucyApIHtcblxuXHRcdHRoaXMubG9vcCA9IG1vZGU7XG5cdFx0dGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBXZWlnaHRcblxuXHQvLyBzZXQgdGhlIHdlaWdodCBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIGZhZGluZ1xuXHQvLyBhbHRob3VnaCAuZW5hYmxlZCA9IGZhbHNlIHlpZWxkcyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5lbmFibGVkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZ1xuXHRzZXRFZmZlY3RpdmVXZWlnaHQ6IGZ1bmN0aW9uKCB3ZWlnaHQgKSB7XG5cblx0XHR0aGlzLndlaWdodCA9IHdlaWdodDtcblxuXHRcdC8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWVcblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB0aGlzLmVuYWJsZWQgPyB3ZWlnaHQgOiAwO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZFxuXHRnZXRFZmZlY3RpdmVXZWlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcblxuXHR9LFxuXG5cdGZhZGVJbjogZnVuY3Rpb24oIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApO1xuXG5cdH0sXG5cblx0ZmFkZU91dDogZnVuY3Rpb24oIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMSwgMCApO1xuXG5cdH0sXG5cblx0Y3Jvc3NGYWRlRnJvbTogZnVuY3Rpb24oIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xuXG5cdFx0aWYoIHdhcnAgKSB7XG5cblx0XHRcdHZhciBmYWRlSW5EdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sXG5cdFx0XHRcdGZhZGVPdXREdXJhdGlvbiA9IGZhZGVPdXRBY3Rpb24uX2NsaXAuZHVyYXRpb24sXG5cblx0XHRcdFx0c3RhcnRFbmRSYXRpbyA9IGZhZGVPdXREdXJhdGlvbiAvIGZhZGVJbkR1cmF0aW9uLFxuXHRcdFx0XHRlbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247XG5cblx0XHRcdGZhZGVPdXRBY3Rpb24ud2FycCggMS4wLCBzdGFydEVuZFJhdGlvLCBkdXJhdGlvbiApO1xuXHRcdFx0dGhpcy53YXJwKCBlbmRTdGFydFJhdGlvLCAxLjAsIGR1cmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNyb3NzRmFkZVRvOiBmdW5jdGlvbiggZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdHJldHVybiBmYWRlSW5BY3Rpb24uY3Jvc3NGYWRlRnJvbSggdGhpcywgZHVyYXRpb24sIHdhcnAgKTtcblxuXHR9LFxuXG5cdHN0b3BGYWRpbmc6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFRpbWUgU2NhbGUgQ29udHJvbFxuXG5cdC8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBpbmdcblx0Ly8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVzZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24oIHRpbWVTY2FsZSApIHtcblxuXHRcdHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlO1xuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6dGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGUgdGltZSBzY2FsZSBjb25zaWRlcmluZyB3YXJwaW5nIGFuZCAucGF1c2VkXG5cdGdldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH0sXG5cblx0c2V0RHVyYXRpb246IGZ1bmN0aW9uKCBkdXJhdGlvbiApIHtcblxuXHRcdHRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdHN5bmNXaXRoOiBmdW5jdGlvbiggYWN0aW9uICkge1xuXG5cdFx0dGhpcy50aW1lID0gYWN0aW9uLnRpbWU7XG5cdFx0dGhpcy50aW1lU2NhbGUgPSBhY3Rpb24udGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGhhbHQ6IGZ1bmN0aW9uKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9LFxuXG5cdHdhcnA6IGZ1bmN0aW9uKCBzdGFydFRpbWVTY2FsZSwgZW5kVGltZVNjYWxlLCBkdXJhdGlvbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCxcblxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XG5cblx0XHR2YWx1ZXNbIDAgXSA9IHN0YXJ0VGltZVNjYWxlIC8gdGltZVNjYWxlO1xuXHRcdHZhbHVlc1sgMSBdID0gZW5kVGltZVNjYWxlIC8gdGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdG9wV2FycGluZzogZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgdGltZVNjYWxlSW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcblxuXHRcdGlmICggdGltZVNjYWxlSW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gT2JqZWN0IEFjY2Vzc29yc1xuXG5cdGdldE1peGVyOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9LFxuXG5cdGdldENsaXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2NsaXA7XG5cblx0fSxcblxuXHRnZXRSb290OiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9sb2NhbFJvb3QgfHwgdGhpcy5fbWl4ZXIuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hXG5cblx0X3VwZGF0ZTogZnVuY3Rpb24oIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XG5cblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cblxuXHRcdFx0dmFyIHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm47IC8vIHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnRcblxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxuXHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XG5cdFx0dmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0dmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xuXHRcdFx0dmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiggdGltZSApIHtcblxuXHRcdHZhciB3ZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgKSB7XG5cblx0XHRcdHdlaWdodCA9IHRoaXMud2VpZ2h0O1xuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0d2VpZ2h0ICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHRcdFx0XHRcdGlmICggaW50ZXJwb2xhbnRWYWx1ZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZmFkZWQgb3V0LCBkaXNhYmxlXG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDtcblx0XHRyZXR1cm4gd2VpZ2h0O1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWVTY2FsZTogZnVuY3Rpb24oIHRpbWUgKSB7XG5cblx0XHR2YXIgdGltZVNjYWxlID0gMDtcblxuXHRcdGlmICggISB0aGlzLnBhdXNlZCApIHtcblxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHRpbWVTY2FsZSAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wV2FycGluZygpO1xuXG5cdFx0XHRcdFx0aWYgKCB0aW1lU2NhbGUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIG1vdGlvbiBoYXMgaGFsdGVkLCBwYXVzZVxuXHRcdFx0XHRcdFx0dGhpcy5wYXVzZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwgdGltZSBzY2FsZVxuXHRcdFx0XHRcdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cdFx0cmV0dXJuIHRpbWVTY2FsZTtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lOiBmdW5jdGlvbiggZGVsdGFUaW1lICkge1xuXG5cdFx0dmFyIHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XG5cblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHJldHVybiB0aW1lO1xuXG5cdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0bG9vcCA9IHRoaXMubG9vcCxcblx0XHRcdGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcblxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtMSApIHtcblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xuXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDtcblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtMSA6IDFcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZ1xuXG5cdFx0XHR2YXIgcGluZ1BvbmcgPSAoIGxvb3AgPT09IExvb3BQaW5nUG9uZyApO1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLTEgKSB7XG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdGlmICggZGVsdGFUaW1lID49IDAgKSB7XG5cblx0XHRcdFx0XHRsb29wQ291bnQgPSAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyhcblx0XHRcdFx0XHRcdFx0dHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbFxuXHRcdFx0XHRcdC8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0aXRpb24sXG5cdFx0XHRcdFx0Ly8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xXG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKFxuXHRcdFx0XHRcdFx0XHR0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwgdGltZSA8IDAgKSB7XG5cdFx0XHRcdC8vIHdyYXAgYXJvdW5kXG5cblx0XHRcdFx0dmFyIGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWRcblx0XHRcdFx0dGltZSAtPSBkdXJhdGlvbiAqIGxvb3BEZWx0YTtcblxuXHRcdFx0XHRsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApO1xuXG5cdFx0XHRcdHZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPCAwICkge1xuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtMVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGtlZXAgcnVubmluZ1xuXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nID09PSAwICkge1xuXHRcdFx0XHRcdFx0Ly8gZW50ZXJpbmcgdGhlIGxhc3Qgcm91bmRcblxuXHRcdFx0XHRcdFx0dmFyIGF0U3RhcnQgPSBkZWx0YVRpbWUgPCAwO1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggYXRTdGFydCwgISBhdFN0YXJ0LCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggZmFsc2UsIGZhbHNlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gbG9vcENvdW50O1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2xvb3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHBpbmdQb25nICYmICggbG9vcENvdW50ICYgMSApID09PSAxICkge1xuXHRcdFx0XHQvLyBpbnZlcnQgdGltZSBmb3IgdGhlIFwicG9uZyByb3VuZFwiXG5cblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblx0XHRcdFx0cmV0dXJuIGR1cmF0aW9uIC0gdGltZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy50aW1lID0gdGltZTtcblx0XHRyZXR1cm4gdGltZTtcblxuXHR9LFxuXG5cdF9zZXRFbmRpbmdzOiBmdW5jdGlvbiggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkge1xuXG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHRcdGlmICggcGluZ1BvbmcgKSB7XG5cblx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0IFx0PSBaZXJvU2xvcGVFbmRpbmc7XG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmRcdFx0PSBaZXJvU2xvcGVFbmRpbmc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlXG5cblx0XHRcdGlmICggYXRTdGFydCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/XG5cdFx0XHRcdFx0XHRaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGF0RW5kICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgP1xuXHRcdFx0XHRcdFx0WmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgXHQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9uKCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkge1xuXG5cdFx0dmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsXG5cdFx0XHRpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7IFx0XHRcdFx0dmFsdWVzWyAwIF0gPSB3ZWlnaHROb3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1x0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIFBsYXllciBmb3IgQW5pbWF0aW9uQ2xpcHMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25NaXhlciggcm9vdCApIHtcblxuXHR0aGlzLl9yb290ID0gcm9vdDtcblx0dGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKTtcblx0dGhpcy5fYWNjdUluZGV4ID0gMDtcblxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMS4wO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk1peGVyLnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdF9iaW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkge1xuXG5cdFx0dmFyIHJvb3QgPSBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0dHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcyxcblx0XHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdFx0YmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3MsXG5cdFx0XHRpbnRlcnBvbGFudHMgPSBhY3Rpb24uX2ludGVycG9sYW50cyxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0dmFyIHRyYWNrID0gdHJhY2tzWyBpIF0sXG5cdFx0XHRcdHRyYWNrTmFtZSA9IHRyYWNrLm5hbWUsXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gZXhpc3RpbmcgYmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93c1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHBhdGggPSBwcm90b3R5cGVBY3Rpb24gJiYgcHJvdG90eXBlQWN0aW9uLlxuXHRcdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0dmFyIHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCxcblx0XHRcdFx0XHRjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdFx0XHR0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTtcblxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIC0tIGJpbmRpbmcudXNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblxuXHRcdHRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTtcblx0XHQvLyBpbnNpZGU6XG5cdFx0Ly8ge1xuXHRcdC8vIFx0XHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPlx0LSB1c2VkIGFzIHByb3RvdHlwZXNcblx0XHQvLyBcdFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb25cdFx0XHQtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDsgfSxcblx0XHRcdFx0Z2V0IGluVXNlKCkgeyByZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zOyB9XG5cdFx0XHR9LFxuXHRcdFx0YmluZGluZ3M6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkgeyByZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDsgfSxcblx0XHRcdFx0Z2V0IGluVXNlKCkgeyByZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5nczsgfVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xJbnRlcnBvbGFudHM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkgeyByZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoOyB9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7IHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7IH1cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHNcblxuXHRfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXHRcdHJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xuXG5cdH0sXG5cblx0X2FkZEluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0ge1xuXG5cdFx0XHRcdGtub3duQWN0aW9uczogWyBhY3Rpb24gXSxcblx0XHRcdFx0YWN0aW9uQnlSb290OiB7fVxuXG5cdFx0XHR9O1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwO1xuXG5cdFx0XHRhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0aW9uc0ZvckNsaXA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsXG5cblx0XHRcdGxhc3RLbm93bkFjdGlvbiA9XG5cdFx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoIC0gMSBdLFxuXG5cdFx0XHRieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4O1xuXG5cdFx0bGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTtcblxuXHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHRfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gICAgICAgIGEgICAgICAgIHNcblx0XHQvLyAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgIHMgICAgICAgIGFcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApIHtcblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsXG5cdFx0XHRyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsXG5cdFx0XHR0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgYmluZGluZ3MubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRiaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZztcblx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdGRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdHJlbW92ZV9lbXB0eV9tYXA6IHtcblxuXHRcdFx0Zm9yICggdmFyIF8gaW4gYmluZGluZ0J5TmFtZSApIGJyZWFrIHJlbW92ZV9lbXB0eV9tYXA7XG5cblx0XHRcdGRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9sZW5kQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7XG5cblx0fSxcblxuXHRfdGFrZUJhY2tCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVCaW5kaW5ncyxcblxuXHRcdFx0bGFzdEFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRsYXN0QWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgb2YgSW50ZXJwb2xhbnRzIGZvciB3ZWlnaHQgYW5kIHRpbWUgc2NhbGVcblxuXHRfbGVuZENvbnRyb2xJbnRlcnBvbGFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyArKyxcblx0XHRcdGludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBuZXcgTGluZWFySW50ZXJwb2xhbnQoXG5cdFx0XHRcdG5ldyBGbG9hdDMyQXJyYXkoIDIgKSwgbmV3IEZsb2F0MzJBcnJheSggMiApLFxuXHRcdFx0XHQxLCB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyICk7XG5cblx0XHRcdGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRcdGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudDogZnVuY3Rpb24gKCBpbnRlcnBvbGFudCApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0cHJldkluZGV4ID0gaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxcblxuXHRcdFx0bGFzdEFjdGl2ZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XG5cblx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGludGVycG9sYW50c1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlSW50ZXJwb2xhbnQ7XG5cblx0fSxcblxuXHRfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjogbmV3IEZsb2F0MzJBcnJheSggMSApLFxuXG5cdC8vIHJldHVybiBhbiBhY3Rpb24gZm9yIGEgY2xpcCBvcHRpb25hbGx5IHVzaW5nIGEgY3VzdG9tIHJvb3QgdGFyZ2V0XG5cdC8vIG9iamVjdCAodGhpcyBtZXRob2QgYWxsb2NhdGVzIGEgbG90IG9mIGR5bmFtaWMgbWVtb3J5IGluIGNhc2UgYVxuXHQvLyBwcmV2aW91c2x5IHVua25vd24gY2xpcC9yb290IGNvbWJpbmF0aW9uIGlzIHNwZWNpZmllZClcblx0Y2xpcEFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXG5cblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCAhPT0gbnVsbCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IG51bGw7XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBleGlzdGluZ0FjdGlvbiA9XG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGV4aXN0aW5nQWN0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQWN0aW9uO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGtub3cgdGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsXG5cdFx0XHQvLyB0aGUgYmluZGluZ3MgYWdhaW4gYnV0IGNhbiBqdXN0IGNvcHlcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdO1xuXG5cdFx0XHQvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb25cblx0XHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApXG5cdFx0XHRcdGNsaXBPYmplY3QgPSBwcm90b3R5cGVBY3Rpb24uX2NsaXA7XG5cblx0XHR9XG5cblx0XHQvLyBjbGlwIG11c3QgYmUga25vd24gd2hlbiBzcGVjaWZpZWQgdmlhIHN0cmluZ1xuXHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXRcblx0XHR2YXIgbmV3QWN0aW9uID0gbmV3IEFuaW1hdGlvbkFjdGlvbiggdGhpcywgY2xpcE9iamVjdCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHR0aGlzLl9iaW5kQWN0aW9uKCBuZXdBY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApO1xuXG5cdFx0Ly8gYW5kIG1ha2UgdGhlIGFjdGlvbiBrbm93biB0byB0aGUgbWVtb3J5IG1hbmFnZXJcblx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggbmV3QWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdHJldHVybiBuZXdBY3Rpb247XG5cblx0fSxcblxuXHQvLyBnZXQgYW4gZXhpc3RpbmcgYWN0aW9uXG5cdGV4aXN0aW5nQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdIHx8IG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdC8vIGRlYWN0aXZhdGVzIGFsbCBwcmV2aW91c2x5IHNjaGVkdWxlZCBhY3Rpb25zXG5cdHN0b3BBbGxBY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xuXG5cdFx0XHRhY3Rpb25zWyBpIF0ucmVzZXQoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVzZUNvdW50ID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gYWR2YW5jZSB0aGUgdGltZSBhbmQgdXBkYXRlIGFwcGx5IHRoZSBhbmltYXRpb25cblx0dXBkYXRlOiBmdW5jdGlvbiAoIGRlbHRhVGltZSApIHtcblxuXHRcdGRlbHRhVGltZSAqPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdHRpbWUgPSB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lLFxuXHRcdFx0dGltZURpcmVjdGlvbiA9IE1hdGguc2lnbiggZGVsdGFUaW1lICksXG5cblx0XHRcdGFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxO1xuXG5cdFx0Ly8gcnVuIGFjdGl2ZSBhY3Rpb25zXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9uc1sgaSBdO1xuXG5cdFx0XHRhY3Rpb24uX3VwZGF0ZSggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5hcHBseSggYWNjdUluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGlzIG1peGVyJ3Mgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdGdldFJvb3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9yb290O1xuXG5cdH0sXG5cblx0Ly8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBjbGlwXG5cdHVuY2FjaGVDbGlwOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXAudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBub3RlOiBqdXN0IGNhbGxpbmcgX3JlbW92ZUluYWN0aXZlQWN0aW9uIHdvdWxkIG1lc3MgdXAgdGhlXG5cdFx0XHQvLyBpdGVyYXRpb24gc3RhdGUgYW5kIGFsc28gcmVxdWlyZSB1cGRhdGluZyB0aGUgc3RhdGUgd2UgY2FuXG5cdFx0XHQvLyBqdXN0IHRocm93IGF3YXlcblxuXHRcdFx0dmFyIGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYWN0aW9uc1RvUmVtb3ZlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9uc1RvUmVtb3ZlWyBpIF07XG5cblx0XHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdFx0dmFyIGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cdFx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF07XG5cblx0XHRcdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblx0XHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcblxuXHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdFx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XG5cdFx0XHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHR1bmNhY2hlUm9vdDogZnVuY3Rpb24gKCByb290ICkge1xuXG5cdFx0dmFyIHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XG5cblx0XHRmb3IgKCB2YXIgY2xpcFV1aWQgaW4gYWN0aW9uc0J5Q2xpcCApIHtcblxuXHRcdFx0dmFyIGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0uYWN0aW9uQnlSb290LFxuXHRcdFx0XHRhY3Rpb24gPSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggYWN0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlXG5cdHVuY2FjaGVBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIGFjdGlvbiA9IHRoaXMuZXhpc3RpbmdBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0aWYgKCBhY3Rpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVW5pZm9ybSggdmFsdWUgKSB7XG5cblx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7XG5cdFx0dmFsdWUgPSBhcmd1bWVudHNbIDEgXTtcblxuXHR9XG5cblx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXG59XG5cblVuaWZvcm0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgVW5pZm9ybSggdGhpcy52YWx1ZS5jbG9uZSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KCkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknO1xuXHR0aGlzLm1heEluc3RhbmNlZENvdW50ID0gdW5kZWZpbmVkO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0YWRkR3JvdXA6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0dGhpcy5ncm91cHMucHVzaCgge1xuXG5cdFx0XHRzdGFydDogc3RhcnQsXG5cdFx0XHRjb3VudDogY291bnQsXG5cdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4XG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBpbmRleCA9IHNvdXJjZS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4LmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gc291cmNlLmdyb3VwcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkICkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyO1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuXG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGNvdW50OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5jb3VudDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFycmF5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIGluZGV4LCB4ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggaW5kZXgsIHcgKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF07XG5cblx0fSxcblxuXHRnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF07XG5cblx0fSxcblxuXHRnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF07XG5cblx0fSxcblxuXHRnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF07XG5cblx0fSxcblxuXHRzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUgKSB7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLnN0cmlkZSA9IHN0cmlkZTtcblx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBzdHJpZGUgOiAwO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLnN0cmlkZSA6IDA7XG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xuXG5cdH0sXG5cblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMuc3RyaWRlID0gc291cmNlLnN0cmlkZTtcblx0XHR0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5zdHJpZGU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5zdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnN0cmlkZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlzLCBhcnJheSwgc3RyaWRlICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLFxuXG5cdGlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIGFycmF5LCBpdGVtU2l6ZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSxcblxuXHRpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIHN0ZXBob21pIC8gaHR0cDovL3N0ZXBoYW5lZ2luaWVyLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXljYXN0ZXIoIG9yaWdpbiwgZGlyZWN0aW9uLCBuZWFyLCBmYXIgKSB7XG5cblx0dGhpcy5yYXkgPSBuZXcgUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdHRoaXMubmVhciA9IG5lYXIgfHwgMDtcblx0dGhpcy5mYXIgPSBmYXIgfHwgSW5maW5pdHk7XG5cblx0dGhpcy5wYXJhbXMgPSB7XG5cdFx0TWVzaDoge30sXG5cdFx0TGluZToge30sXG5cdFx0TE9EOiB7fSxcblx0XHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0U3ByaXRlOiB7fVxuXHR9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywge1xuXHRcdFBvaW50Q2xvdWQ6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLlBvaW50cztcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcblxufVxuXG5mdW5jdGlvbiBhc2NTb3J0KCBhLCBiICkge1xuXG5cdHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcblxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKSB7XG5cblx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0b2JqZWN0LnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUmF5Y2FzdGVyLnByb3RvdHlwZSwge1xuXG5cdGxpbmVQcmVjaXNpb246IDEsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHRcdHRoaXMucmF5LnNldCggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYW1lcmE6IGZ1bmN0aW9uICggY29vcmRzLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkgKSB7XG5cblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHR9IGVsc2UgaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGUuJyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aW50ZXJzZWN0T2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCwgcmVjdXJzaXZlICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBbXTtcblxuXHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdHZhciBpbnRlcnNlY3RzID0gW107XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdHMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4nICk7XG5cdFx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0fVxuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIENsb2NrKCBhdXRvU3RhcnQgKSB7XG5cblx0dGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5kZWZpbmVkICkgPyBhdXRvU3RhcnQgOiB0cnVlO1xuXG5cdHRoaXMuc3RhcnRUaW1lID0gMDtcblx0dGhpcy5vbGRUaW1lID0gMDtcblx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cblx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ2xvY2sucHJvdG90eXBlLCB7XG5cblx0c3RhcnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc3RhcnRUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7IC8vIHNlZSAjMTA3MzJcblxuXHRcdHRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lO1xuXHRcdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXHRcdHRoaXMucnVubmluZyA9IHRydWU7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdldEVsYXBzZWRUaW1lKCk7XG5cdFx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRFbGFwc2VkVGltZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXREZWx0YSgpO1xuXHRcdHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xuXG5cdH0sXG5cblx0Z2V0RGVsdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkaWZmID0gMDtcblxuXHRcdGlmICggdGhpcy5hdXRvU3RhcnQgJiYgISB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHRoaXMuc3RhcnQoKTtcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuXG4gKiBUaGUgZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei5cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDtcblx0dGhpcy5waGkgPSAoIHBoaSAhPT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJvdHRvbSBwb2xlXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWUgRVBTIGFuZCBQSS1FUFNcblx0bWFrZVNhZmU6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dmFyIEVQUyA9IDAuMDAwMDAxO1xuXHRcdHRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkgLSBFUFMsIHRoaXMucGhpICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uKCB2ZWMzICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSB2ZWMzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCB0aGlzLnJhZGl1cyA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IDA7XG5cdFx0XHR0aGlzLnBoaSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTsgLy8gZXF1YXRvciBhbmdsZSBhcm91bmQgeS11cCBheGlzXG5cdFx0XHR0aGlzLnBoaSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHZlYzMueSAvIHRoaXMucmFkaXVzLCAtIDEsIDEgKSApOyAvLyBwb2xhciBhbmdsZVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtXG4gKlxuICovXG5cbmZ1bmN0aW9uIEN5bGluZHJpY2FsKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdHRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOyAvLyBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gY291bnRlcmNsb2Nrd2lzZSBhbmdsZSBpbiB0aGUgeC16IHBsYW5lIG1lYXN1cmVkIGluIHJhZGlhbnMgZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzXG5cdHRoaXMueSA9ICggeSAhPT0gdW5kZWZpbmVkICkgPyB5IDogMDsgLy8gaGVpZ2h0IGFib3ZlIHRoZSB4LXogcGxhbmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBDeWxpbmRyaWNhbC5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBvdGhlciApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcblx0XHR0aGlzLnkgPSBvdGhlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24oIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVjMy56ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7XG5cdFx0dGhpcy55ID0gdmVjMy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxyXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIE1vcnBoQmxlbmRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cclxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHR0aGlzLmFuaW1hdGlvbnNNYXAgPSB7fTtcclxuXHR0aGlzLmFuaW1hdGlvbnNMaXN0ID0gW107XHJcblxyXG5cdC8vIHByZXBhcmUgZGVmYXVsdCBhbmltYXRpb25cclxuXHQvLyAoYWxsIGZyYW1lcyBwbGF5ZWQgdG9nZXRoZXIgaW4gMSBzZWNvbmQpXHJcblxyXG5cdHZhciBudW1GcmFtZXMgPSB0aGlzLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7XHJcblxyXG5cdHZhciBuYW1lID0gXCJfX2RlZmF1bHRcIjtcclxuXHJcblx0dmFyIHN0YXJ0RnJhbWUgPSAwO1xyXG5cdHZhciBlbmRGcmFtZSA9IG51bUZyYW1lcyAtIDE7XHJcblxyXG5cdHZhciBmcHMgPSBudW1GcmFtZXMgLyAxO1xyXG5cclxuXHR0aGlzLmNyZWF0ZUFuaW1hdGlvbiggbmFtZSwgc3RhcnRGcmFtZSwgZW5kRnJhbWUsIGZwcyApO1xyXG5cdHRoaXMuc2V0QW5pbWF0aW9uV2VpZ2h0KCBuYW1lLCAxICk7XHJcblxyXG59XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApO1xyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNb3JwaEJsZW5kTWVzaDtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5jcmVhdGVBbmltYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUsIHN0YXJ0LCBlbmQsIGZwcyApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHtcclxuXHJcblx0XHRzdGFydDogc3RhcnQsXHJcblx0XHRlbmQ6IGVuZCxcclxuXHJcblx0XHRsZW5ndGg6IGVuZCAtIHN0YXJ0ICsgMSxcclxuXHJcblx0XHRmcHM6IGZwcyxcclxuXHRcdGR1cmF0aW9uOiAoIGVuZCAtIHN0YXJ0ICkgLyBmcHMsXHJcblxyXG5cdFx0bGFzdEZyYW1lOiAwLFxyXG5cdFx0Y3VycmVudEZyYW1lOiAwLFxyXG5cclxuXHRcdGFjdGl2ZTogZmFsc2UsXHJcblxyXG5cdFx0dGltZTogMCxcclxuXHRcdGRpcmVjdGlvbjogMSxcclxuXHRcdHdlaWdodDogMSxcclxuXHJcblx0XHRkaXJlY3Rpb25CYWNrd2FyZHM6IGZhbHNlLFxyXG5cdFx0bWlycm9yZWRMb29wOiBmYWxzZVxyXG5cclxuXHR9O1xyXG5cclxuXHR0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXSA9IGFuaW1hdGlvbjtcclxuXHR0aGlzLmFuaW1hdGlvbnNMaXN0LnB1c2goIGFuaW1hdGlvbiApO1xyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5hdXRvQ3JlYXRlQW5pbWF0aW9ucyA9IGZ1bmN0aW9uICggZnBzICkge1xyXG5cclxuXHR2YXIgcGF0dGVybiA9IC8oW2Etel0rKV8/KFxcZCspL2k7XHJcblxyXG5cdHZhciBmaXJzdEFuaW1hdGlvbiwgZnJhbWVSYW5nZXMgPSB7fTtcclxuXHJcblx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHR2YXIgbW9ycGggPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXTtcclxuXHRcdHZhciBjaHVua3MgPSBtb3JwaC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XHJcblxyXG5cdFx0aWYgKCBjaHVua3MgJiYgY2h1bmtzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHR2YXIgbmFtZSA9IGNodW5rc1sgMSBdO1xyXG5cclxuXHRcdFx0aWYgKCAhIGZyYW1lUmFuZ2VzWyBuYW1lIF0gKSBmcmFtZVJhbmdlc1sgbmFtZSBdID0geyBzdGFydDogSW5maW5pdHksIGVuZDogLSBJbmZpbml0eSB9O1xyXG5cclxuXHRcdFx0dmFyIHJhbmdlID0gZnJhbWVSYW5nZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGlmICggaSA8IHJhbmdlLnN0YXJ0ICkgcmFuZ2Uuc3RhcnQgPSBpO1xyXG5cdFx0XHRpZiAoIGkgPiByYW5nZS5lbmQgKSByYW5nZS5lbmQgPSBpO1xyXG5cclxuXHRcdFx0aWYgKCAhIGZpcnN0QW5pbWF0aW9uICkgZmlyc3RBbmltYXRpb24gPSBuYW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCB2YXIgbmFtZSBpbiBmcmFtZVJhbmdlcyApIHtcclxuXHJcblx0XHR2YXIgcmFuZ2UgPSBmcmFtZVJhbmdlc1sgbmFtZSBdO1xyXG5cdFx0dGhpcy5jcmVhdGVBbmltYXRpb24oIG5hbWUsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIGZwcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHRoaXMuZmlyc3RBbmltYXRpb24gPSBmaXJzdEFuaW1hdGlvbjtcclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uRGlyZWN0aW9uRm9yd2FyZCA9IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24uZGlyZWN0aW9uID0gMTtcclxuXHRcdGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25EaXJlY3Rpb25CYWNrd2FyZCA9IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24uZGlyZWN0aW9uID0gLSAxO1xyXG5cdFx0YW5pbWF0aW9uLmRpcmVjdGlvbkJhY2t3YXJkcyA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uRlBTID0gZnVuY3Rpb24gKCBuYW1lLCBmcHMgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLmZwcyA9IGZwcztcclxuXHRcdGFuaW1hdGlvbi5kdXJhdGlvbiA9ICggYW5pbWF0aW9uLmVuZCAtIGFuaW1hdGlvbi5zdGFydCApIC8gYW5pbWF0aW9uLmZwcztcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uICggbmFtZSwgZHVyYXRpb24gKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLmR1cmF0aW9uID0gZHVyYXRpb247XHJcblx0XHRhbmltYXRpb24uZnBzID0gKCBhbmltYXRpb24uZW5kIC0gYW5pbWF0aW9uLnN0YXJ0ICkgLyBhbmltYXRpb24uZHVyYXRpb247XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uV2VpZ2h0ID0gZnVuY3Rpb24gKCBuYW1lLCB3ZWlnaHQgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLndlaWdodCA9IHdlaWdodDtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zZXRBbmltYXRpb25UaW1lID0gZnVuY3Rpb24gKCBuYW1lLCB0aW1lICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi50aW1lID0gdGltZTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5nZXRBbmltYXRpb25UaW1lID0gZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHR2YXIgdGltZSA9IDA7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0dGltZSA9IGFuaW1hdGlvbi50aW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB0aW1lO1xyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5nZXRBbmltYXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0dmFyIGR1cmF0aW9uID0gLSAxO1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGR1cmF0aW9uID0gYW5pbWF0aW9uLmR1cmF0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBkdXJhdGlvbjtcclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUucGxheUFuaW1hdGlvbiA9IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24udGltZSA9IDA7XHJcblx0XHRhbmltYXRpb24uYWN0aXZlID0gdHJ1ZTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTW9ycGhCbGVuZE1lc2g6IGFuaW1hdGlvbltcIiArIG5hbWUgKyBcIl0gdW5kZWZpbmVkIGluIC5wbGF5QW5pbWF0aW9uKClcIiApO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnN0b3BBbmltYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICggZGVsdGEgKSB7XHJcblxyXG5cdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmFuaW1hdGlvbnNMaXN0Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNMaXN0WyBpIF07XHJcblxyXG5cdFx0aWYgKCAhIGFuaW1hdGlvbi5hY3RpdmUgKSBjb250aW51ZTtcclxuXHJcblx0XHR2YXIgZnJhbWVUaW1lID0gYW5pbWF0aW9uLmR1cmF0aW9uIC8gYW5pbWF0aW9uLmxlbmd0aDtcclxuXHJcblx0XHRhbmltYXRpb24udGltZSArPSBhbmltYXRpb24uZGlyZWN0aW9uICogZGVsdGE7XHJcblxyXG5cdFx0aWYgKCBhbmltYXRpb24ubWlycm9yZWRMb29wICkge1xyXG5cclxuXHRcdFx0aWYgKCBhbmltYXRpb24udGltZSA+IGFuaW1hdGlvbi5kdXJhdGlvbiB8fCBhbmltYXRpb24udGltZSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdGFuaW1hdGlvbi5kaXJlY3Rpb24gKj0gLSAxO1xyXG5cclxuXHRcdFx0XHRpZiAoIGFuaW1hdGlvbi50aW1lID4gYW5pbWF0aW9uLmR1cmF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdGFuaW1hdGlvbi50aW1lID0gYW5pbWF0aW9uLmR1cmF0aW9uO1xyXG5cdFx0XHRcdFx0YW5pbWF0aW9uLmRpcmVjdGlvbkJhY2t3YXJkcyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBhbmltYXRpb24udGltZSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0YW5pbWF0aW9uLnRpbWUgPSAwO1xyXG5cdFx0XHRcdFx0YW5pbWF0aW9uLmRpcmVjdGlvbkJhY2t3YXJkcyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGFuaW1hdGlvbi50aW1lID0gYW5pbWF0aW9uLnRpbWUgJSBhbmltYXRpb24uZHVyYXRpb247XHJcblxyXG5cdFx0XHRpZiAoIGFuaW1hdGlvbi50aW1lIDwgMCApIGFuaW1hdGlvbi50aW1lICs9IGFuaW1hdGlvbi5kdXJhdGlvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGtleWZyYW1lID0gYW5pbWF0aW9uLnN0YXJ0ICsgX01hdGguY2xhbXAoIE1hdGguZmxvb3IoIGFuaW1hdGlvbi50aW1lIC8gZnJhbWVUaW1lICksIDAsIGFuaW1hdGlvbi5sZW5ndGggLSAxICk7XHJcblx0XHR2YXIgd2VpZ2h0ID0gYW5pbWF0aW9uLndlaWdodDtcclxuXHJcblx0XHRpZiAoIGtleWZyYW1lICE9PSBhbmltYXRpb24uY3VycmVudEZyYW1lICkge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5sYXN0RnJhbWUgXSA9IDA7XHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24uY3VycmVudEZyYW1lIF0gPSAxICogd2VpZ2h0O1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGtleWZyYW1lIF0gPSAwO1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLmxhc3RGcmFtZSA9IGFuaW1hdGlvbi5jdXJyZW50RnJhbWU7XHJcblx0XHRcdGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgPSBrZXlmcmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIG1peCA9ICggYW5pbWF0aW9uLnRpbWUgJSBmcmFtZVRpbWUgKSAvIGZyYW1lVGltZTtcclxuXHJcblx0XHRpZiAoIGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgKSBtaXggPSAxIC0gbWl4O1xyXG5cclxuXHRcdGlmICggYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSAhPT0gYW5pbWF0aW9uLmxhc3RGcmFtZSApIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24uY3VycmVudEZyYW1lIF0gPSBtaXggKiB3ZWlnaHQ7XHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24ubGFzdEZyYW1lIF0gPSAoIDEgLSBtaXggKSAqIHdlaWdodDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgXSA9IHdlaWdodDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbW1lZGlhdGVSZW5kZXJPYmplY3QoIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJDYWxsYmFjayApIHt9O1xuXG59XG5cbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbW1lZGlhdGVSZW5kZXJPYmplY3Q7XG5cbkltbWVkaWF0ZVJlbmRlck9iamVjdC5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiovXG5cbmZ1bmN0aW9uIFZlcnRleE5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0dGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQgKSA/IHNpemUgOiAxO1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmYwMDAwO1xuXG5cdHZhciB3aWR0aCA9ICggbGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSA/IGxpbmV3aWR0aCA6IDE7XG5cblx0Ly9cblxuXHR2YXIgbk5vcm1hbHMgPSAwO1xuXG5cdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuZmFjZXMubGVuZ3RoICogMztcblxuXHR9IGVsc2UgaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5jb3VudDtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTtcblxuXHQvL1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZlcnRleE5vcm1hbHNIZWxwZXI7XG5cblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXG5cdFx0dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdG5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdC8vXG5cblx0XHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdHZhciBmYWNlcyA9IG9iakdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlc1sgZmFjZVsga2V5c1sgaiBdIF0gXTtcblxuXHRcdFx0XHRcdHZhciBub3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHNbIGogXTtcblxuXHRcdFx0XHRcdHYxLmNvcHkoIHZlcnRleCApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdHYyLmNvcHkoIG5vcm1hbCApLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgb2JqUG9zID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0dmFyIG9iak5vcm0gPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRcdC8vIGZvciBzaW1wbGljaXR5LCBpZ25vcmUgaW5kZXggYW5kIGRyYXdjYWxscywgYW5kIHJlbmRlciBldmVyeSBub3JtYWxcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IG9ialBvcy5jb3VudDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHYxLnNldCggb2JqUG9zLmdldFgoIGogKSwgb2JqUG9zLmdldFkoIGogKSwgb2JqUG9zLmdldFooIGogKSApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2Mi5zZXQoIG9iak5vcm0uZ2V0WCggaiApLCBvYmpOb3JtLmdldFkoIGogKSwgb2JqTm9ybS5nZXRaKCBqICkgKTtcblxuXHRcdFx0XHR2Mi5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4qL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gW1xuXHRcdDAsIDAsIDAsICAgMCwgICAwLCAgIDEsXG5cdFx0MCwgMCwgMCwgICAxLCAgIDAsICAgMSxcblx0XHQwLCAwLCAwLCAtIDEsICAgMCwgICAxLFxuXHRcdDAsIDAsIDAsICAgMCwgICAxLCAgIDEsXG5cdFx0MCwgMCwgMCwgICAwLCAtIDEsICAgMVxuXHRdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHR2YXIgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjtcblx0XHR2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjtcblxuXHRcdHBvc2l0aW9ucy5wdXNoKFxuXHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxXG5cdFx0KTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcG90TGlnaHRIZWxwZXI7XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHR2YXIgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0aGlzLmxpZ2h0LmFuZ2xlICk7XG5cblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBjb25lV2lkdGgsIGNvbmVXaWR0aCwgY29uZUxlbmd0aCApO1xuXG5cdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHZlY3RvcjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggdmVjdG9yMi5zdWIoIHZlY3RvciApICk7XG5cblx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIFNlYW4gR3JpZmZpbiAvIGh0dHA6Ly90d2l0dGVyLmNvbS9zZ3JpZlxuICogQGF1dGhvciBNaWNoYWVsIEd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gU2tlbGV0b25IZWxwZXIoIG9iamVjdCApIHtcblxuXHR0aGlzLmJvbmVzID0gdGhpcy5nZXRCb25lTGlzdCggb2JqZWN0ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgY29sb3IxID0gbmV3IENvbG9yKCAwLCAwLCAxICk7XG5cdHZhciBjb2xvcjIgPSBuZXcgQ29sb3IoIDAsIDEsIDAgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzLCBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnJvb3QgPSBvYmplY3Q7XG5cblx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTa2VsZXRvbkhlbHBlcjtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLmdldEJvbmVMaXN0ID0gZnVuY3Rpb24oIG9iamVjdCApIHtcblxuXHR2YXIgYm9uZUxpc3QgPSBbXTtcblxuXHRpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNCb25lICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaCggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRib25lTGlzdC5wdXNoLmFwcGx5KCBib25lTGlzdCwgdGhpcy5nZXRCb25lTGlzdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0gKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYm9uZUxpc3Q7XG5cbn07XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGJvbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXG5cdFx0bWF0cml4V29ybGRJbnYuZ2V0SW52ZXJzZSggdGhpcy5yb290Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5ib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHRIZWxwZXIoIGxpZ2h0LCBzcGhlcmVTaXplICkge1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggc3BoZXJlU2l6ZSwgNCwgMiApO1xuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTtcblx0bWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHQvKlxuXHR2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7XG5cdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHR0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVyaWFsICk7XG5cdHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7XG5cblx0dmFyIGQgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cblx0dGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApO1xuXHQqL1xuXG59XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTtcblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRMaWdodEhlbHBlcjtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHQvKlxuXHR2YXIgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7XG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblx0Ki9cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0SGVscGVyKCBsaWdodCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBsaWdodC5jb2xvciB9ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA1ICogMyApLCAzICkgKTtcblxuXHR0aGlzLmFkZCggbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWN0QXJlYUxpZ2h0SGVscGVyO1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgbGluZSA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcblxuXHQvLyB1cGRhdGUgbWF0ZXJpYWxcblxuXHRsaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHQvLyBjYWxjdWxhdGUgbmV3IGRpbWVuc2lvbnMgb2YgdGhlIGhlbHBlclxuXG5cdHZhciBoeCA9IHRoaXMubGlnaHQud2lkdGggKiAwLjU7XG5cdHZhciBoeSA9IHRoaXMubGlnaHQuaGVpZ2h0ICogMC41O1xuXG5cdHZhciBwb3NpdGlvbiA9IGxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0Ly8gdXBkYXRlIHZlcnRpY2VzXG5cblx0YXJyYXlbICAwIF0gPSAgIGh4OyBhcnJheVsgIDEgXSA9IC0gaHk7IGFycmF5WyAgMiBdID0gMDtcblx0YXJyYXlbICAzIF0gPSAgIGh4OyBhcnJheVsgIDQgXSA9ICAgaHk7IGFycmF5WyAgNSBdID0gMDtcblx0YXJyYXlbICA2IF0gPSAtIGh4OyBhcnJheVsgIDcgXSA9ICAgaHk7IGFycmF5WyAgOCBdID0gMDtcblx0YXJyYXlbICA5IF0gPSAtIGh4OyBhcnJheVsgMTAgXSA9IC0gaHk7IGFycmF5WyAxMSBdID0gMDtcblx0YXJyYXlbIDEyIF0gPSAgIGh4OyBhcnJheVsgMTMgXSA9IC0gaHk7IGFycmF5WyAxNCBdID0gMDtcblxuXHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodEhlbHBlciggbGlnaHQsIHNpemUgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHNpemUgKTtcblx0Z2VvbWV0cnkucm90YXRlWSggTWF0aC5QSSAqIDAuNSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgd2lyZWZyYW1lOiB0cnVlIH0gKTtcblxuXHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxpZ2h0SGVscGVyO1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvcigpO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0dmFyIGNvbG9ycyA9IG1lc2guZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnY29sb3InICk7XG5cblx0XHRjb2xvcjEuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdGNvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY29sb3IgPSAoIGkgPCAoIGwgLyAyICkgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0fVxuXG5cdFx0bWVzaC5sb29rQXQoIHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKS5uZWdhdGUoKSApO1xuXG5cdFx0Y29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcmlkSGVscGVyKCBzaXplLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDEwO1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTA7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgY2VudGVyID0gZGl2aXNpb25zIC8gMjtcblx0dmFyIHN0ZXAgPSBzaXplIC8gZGl2aXNpb25zO1xuXHR2YXIgaGFsZlNpemUgPSBzaXplIC8gMjtcblxuXHR2YXIgdmVydGljZXMgPSBbXSwgY29sb3JzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBqID0gMCwgayA9IC0gaGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAtIGhhbGZTaXplLCAwLCBrLCBoYWxmU2l6ZSwgMCwgayApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGssIDAsIC0gaGFsZlNpemUsIGssIDAsIGhhbGZTaXplICk7XG5cblx0XHR2YXIgY29sb3IgPSBpID09PSBjZW50ZXIgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXG5cdH1cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHcmlkSGVscGVyO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIEhlY3RhdGUgLyBodHRwOi8vd3d3LmdpdGh1Yi5jb20vSGVjdGF0ZVxuICovXG5cbmZ1bmN0aW9uIFBvbGFyR3JpZEhlbHBlciggcmFkaXVzLCByYWRpYWxzLCBjaXJjbGVzLCBkaXZpc2lvbnMsIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxMDtcblx0cmFkaWFscyA9IHJhZGlhbHMgfHwgMTY7XG5cdGNpcmNsZXMgPSBjaXJjbGVzIHx8IDg7XG5cdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCA2NDtcblx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7XG5cdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xvcjIgOiAweDg4ODg4OCApO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIHgsIHo7XG5cdHZhciB2LCBpLCBqLCByLCBjb2xvcjtcblxuXHQvLyBjcmVhdGUgdGhlIHJhZGlhbHNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSByYWRpYWxzOyBpICsrICkge1xuXG5cdFx0diA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdHggPSBNYXRoLnNpbiggdiApICogcmFkaXVzO1xuXHRcdHogPSBNYXRoLmNvcyggdiApICogcmFkaXVzO1xuXG5cdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdH1cblxuXHQvLyBjcmVhdGUgdGhlIGNpcmNsZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkge1xuXG5cdFx0Y29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRyID0gcmFkaXVzIC0gKCByYWRpdXMgLyBjaXJjbGVzICogaSApO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCBkaXZpc2lvbnM7IGogKysgKSB7XG5cblx0XHRcdC8vIGZpcnN0IHZlcnRleFxuXG5cdFx0XHR2ID0gKCBqIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0Ly8gc2Vjb25kIHZlcnRleFxuXG5cdFx0XHR2ID0gKCAoIGogKyAxICkgLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xuXHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cblBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9sYXJHcmlkSGVscGVyO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiovXG5cbmZ1bmN0aW9uIEZhY2VOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkge1xuXG5cdC8vIEZhY2VOb3JtYWxzSGVscGVyIG9ubHkgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnlcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0fSBlbHNlIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZhY2VOb3JtYWxzSGVscGVyOiBvbmx5IFRIUkVFLkdlb21ldHJ5IGlzIHN1cHBvcnRlZC4gVXNlIFRIUkVFLlZlcnRleE5vcm1hbHNIZWxwZXIsIGluc3RlYWQuJyApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmFjZU5vcm1hbHNIZWxwZXI7XG5cbkZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdG5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdC8vXG5cblx0XHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHR2MS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKVxuXHRcdFx0XHQuYWRkKCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKVxuXHRcdFx0XHQuYWRkKCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKVxuXHRcdFx0XHQuZGl2aWRlU2NhbGFyKCAzIClcblx0XHRcdFx0LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0fVxuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodEhlbHBlciggbGlnaHQsIHNpemUgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFtcblx0XHQtIHNpemUsICAgc2l6ZSwgMCxcblx0XHQgIHNpemUsICAgc2l6ZSwgMCxcblx0XHQgIHNpemUsIC0gc2l6ZSwgMCxcblx0XHQtIHNpemUsIC0gc2l6ZSwgMCxcblx0XHQtIHNpemUsICAgc2l6ZSwgMFxuXHRdLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5hZGQoIG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSApO1xuXG5cdGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTtcblxuXHR0aGlzLmFkZCggbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERpcmVjdGlvbmFsTGlnaHRIZWxwZXI7XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGxpZ2h0UGxhbmUgPSB0aGlzLmNoaWxkcmVuWyAwIF07XG5cdHZhciB0YXJnZXRMaW5lID0gdGhpcy5jaGlsZHJlblsgMSBdO1xuXG5cdGxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHRsaWdodFBsYW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0dGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdHYzLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXG5cdFx0dmFyIGxpZ2h0UGxhbmUgPSB0aGlzLmNoaWxkcmVuWyAwIF07XG5cdFx0dmFyIHRhcmdldExpbmUgPSB0aGlzLmNoaWxkcmVuWyAxIF07XG5cblx0XHRsaWdodFBsYW5lLmxvb2tBdCggdjMgKTtcblx0XHRsaWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdHRhcmdldExpbmUubG9va0F0KCB2MyApO1xuXHRcdHRhcmdldExpbmUuc2NhbGUueiA9IHYzLmxlbmd0aCgpO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKlx0LSBzaG93cyBmcnVzdHVtLCBsaW5lIG9mIHNpZ2h0IGFuZCB1cCBvZiB0aGUgY2FtZXJhXG4gKlx0LSBzdWl0YWJsZSBmb3IgZmFzdCB1cGRhdGVzXG4gKiBcdC0gYmFzZWQgb24gZnJ1c3R1bSB2aXN1YWxpemF0aW9uIGluIGxpZ2h0Z2wuanMgc2hhZG93bWFwIGV4YW1wbGVcbiAqXHRcdGh0dHA6Ly9ldmFudy5naXRodWIuY29tL2xpZ2h0Z2wuanMvdGVzdHMvc2hhZG93bWFwLmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBDYW1lcmFIZWxwZXIoIGNhbWVyYSApIHtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgdmVydGV4Q29sb3JzOiBGYWNlQ29sb3JzIH0gKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBwb2ludE1hcCA9IHt9O1xuXG5cdC8vIGNvbG9yc1xuXG5cdHZhciBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XG5cdHZhciBjb2xvckNvbmUgPSBuZXcgQ29sb3IoIDB4ZmYwMDAwICk7XG5cdHZhciBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFmZiApO1xuXHR2YXIgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdHZhciBjb2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApO1xuXG5cdC8vIG5lYXJcblxuXHRhZGRMaW5lKCBcIm4xXCIsIFwibjJcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwibjJcIiwgXCJuNFwiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJuNFwiLCBcIm4zXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcIm4zXCIsIFwibjFcIiwgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gZmFyXG5cblx0YWRkTGluZSggXCJmMVwiLCBcImYyXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcImYyXCIsIFwiZjRcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwiZjRcIiwgXCJmM1wiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJmM1wiLCBcImYxXCIsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIHNpZGVzXG5cblx0YWRkTGluZSggXCJuMVwiLCBcImYxXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcIm4yXCIsIFwiZjJcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwibjNcIiwgXCJmM1wiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJuNFwiLCBcImY0XCIsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIGNvbmVcblxuXHRhZGRMaW5lKCBcInBcIiwgXCJuMVwiLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggXCJwXCIsIFwibjJcIiwgY29sb3JDb25lICk7XG5cdGFkZExpbmUoIFwicFwiLCBcIm4zXCIsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCBcInBcIiwgXCJuNFwiLCBjb2xvckNvbmUgKTtcblxuXHQvLyB1cFxuXG5cdGFkZExpbmUoIFwidTFcIiwgXCJ1MlwiLCBjb2xvclVwICk7XG5cdGFkZExpbmUoIFwidTJcIiwgXCJ1M1wiLCBjb2xvclVwICk7XG5cdGFkZExpbmUoIFwidTNcIiwgXCJ1MVwiLCBjb2xvclVwICk7XG5cblx0Ly8gdGFyZ2V0XG5cblx0YWRkTGluZSggXCJjXCIsIFwidFwiLCBjb2xvclRhcmdldCApO1xuXHRhZGRMaW5lKCBcInBcIiwgXCJjXCIsIGNvbG9yQ3Jvc3MgKTtcblxuXHQvLyBjcm9zc1xuXG5cdGFkZExpbmUoIFwiY24xXCIsIFwiY24yXCIsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggXCJjbjNcIiwgXCJjbjRcIiwgY29sb3JDcm9zcyApO1xuXG5cdGFkZExpbmUoIFwiY2YxXCIsIFwiY2YyXCIsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggXCJjZjNcIiwgXCJjZjRcIiwgY29sb3JDcm9zcyApO1xuXG5cdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0YWRkUG9pbnQoIGEsIGNvbG9yICk7XG5cdFx0YWRkUG9pbnQoIGIsIGNvbG9yICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdGlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdHBvaW50TWFwWyBpZCBdLnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXHRpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMucG9pbnRNYXAgPSBwb2ludE1hcDtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FtZXJhSGVscGVyO1xuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZ2VvbWV0cnksIHBvaW50TWFwO1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgY2FtZXJhID0gbmV3IENhbWVyYSgpO1xuXG5cdGZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwgeiApIHtcblxuXHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSApO1xuXG5cdFx0dmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xuXG5cdFx0aWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBpIF0sIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0Z2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDtcblxuXHRcdHZhciB3ID0gMSwgaCA9IDE7XG5cblx0XHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoIFwiY1wiLCAwLCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJ0XCIsIDAsIDAsICAxICk7XG5cblx0XHQvLyBuZWFyXG5cblx0XHRzZXRQb2ludCggXCJuMVwiLCAtIHcsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwibjJcIiwgICB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcIm4zXCIsIC0gdywgICBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJuNFwiLCAgIHcsICAgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCBcImYxXCIsIC0gdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoIFwiZjJcIiwgICB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggXCJmM1wiLCAtIHcsICAgaCwgMSApO1xuXHRcdHNldFBvaW50KCBcImY0XCIsICAgdywgICBoLCAxICk7XG5cblx0XHQvLyB1cFxuXG5cdFx0c2V0UG9pbnQoIFwidTFcIiwgICB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJ1MlwiLCAtIHcgKiAwLjcsIGggKiAxLjEsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcInUzXCIsICAgICAgICAgMCwgaCAqIDIsICAgLSAxICk7XG5cblx0XHQvLyBjcm9zc1xuXG5cdFx0c2V0UG9pbnQoIFwiY2YxXCIsIC0gdywgICAwLCAxICk7XG5cdFx0c2V0UG9pbnQoIFwiY2YyXCIsICAgdywgICAwLCAxICk7XG5cdFx0c2V0UG9pbnQoIFwiY2YzXCIsICAgMCwgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoIFwiY2Y0XCIsICAgMCwgICBoLCAxICk7XG5cblx0XHRzZXRQb2ludCggXCJjbjFcIiwgLSB3LCAgIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcImNuMlwiLCAgIHcsICAgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwiY24zXCIsICAgMCwgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJjbjRcIiwgICAwLCAgIGgsIC0gMSApO1xuXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IDB4ZmZmZjAwO1xuXG5cdHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggOCAqIDMgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuQm94SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkJveEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hIZWxwZXI7XG5cbkJveEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuJyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRcdHZhciBtaW4gPSBib3gubWluO1xuXHRcdHZhciBtYXggPSBib3gubWF4O1xuXG5cdFx0Lypcblx0XHQgIDVfX19fNFxuXHRcdDEvX19fMC98XG5cdFx0fCA2X198Xzdcblx0XHQyL19fXzMvXG5cblx0XHQwOiBtYXgueCwgbWF4LnksIG1heC56XG5cdFx0MTogbWluLngsIG1heC55LCBtYXguelxuXHRcdDI6IG1pbi54LCBtaW4ueSwgbWF4Lnpcblx0XHQzOiBtYXgueCwgbWluLnksIG1heC56XG5cdFx0NDogbWF4LngsIG1heC55LCBtaW4uelxuXHRcdDU6IG1pbi54LCBtYXgueSwgbWluLnpcblx0XHQ2OiBtaW4ueCwgbWluLnksIG1pbi56XG5cdFx0NzogbWF4LngsIG1pbi55LCBtaW4uelxuXHRcdCovXG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0XHRhcnJheVsgIDAgXSA9IG1heC54OyBhcnJheVsgIDEgXSA9IG1heC55OyBhcnJheVsgIDIgXSA9IG1heC56O1xuXHRcdGFycmF5WyAgMyBdID0gbWluLng7IGFycmF5WyAgNCBdID0gbWF4Lnk7IGFycmF5WyAgNSBdID0gbWF4Lno7XG5cdFx0YXJyYXlbICA2IF0gPSBtaW4ueDsgYXJyYXlbICA3IF0gPSBtaW4ueTsgYXJyYXlbICA4IF0gPSBtYXguejtcblx0XHRhcnJheVsgIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xuXHRcdGFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH07XG5cbn0gKSgpO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnNldEZyb21PYmplY3QgPSBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0dGhpcy51cGRhdGUoKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqXG4gKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zXG4gKlxuICogUGFyYW1ldGVyczpcbiAqICBkaXIgLSBWZWN0b3IzXG4gKiAgb3JpZ2luIC0gVmVjdG9yM1xuICogIGxlbmd0aCAtIE51bWJlclxuICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlXG4gKiAgaGVhZExlbmd0aCAtIE51bWJlclxuICogIGhlYWRXaWR0aCAtIE51bWJlclxuICovXG5cbnZhciBsaW5lR2VvbWV0cnk7XG52YXIgY29uZUdlb21ldHJ5O1xuXG5mdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cdGlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSBsZW5ndGggPSAxO1xuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdGlmICggbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRsaW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0Y29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdGNvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0fVxuXG5cdHRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGxpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBjb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnNldERpcmVjdGlvbiggZGlyICk7XG5cdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG59XG5cbkFycm93SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQXJyb3dIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyb3dIZWxwZXI7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByYWRpYW5zO1xuXG5cdHJldHVybiBmdW5jdGlvbiBzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCByYWRpYW5zICk7XG5cblx0XHR9XG5cblx0fTtcblxufSgpICk7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRMZW5ndGggPSBmdW5jdGlvbiAoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAsIGxlbmd0aCAtIGhlYWRMZW5ndGggKSwgMSApO1xuXHR0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5jb25lLnNjYWxlLnNldCggaGVhZFdpZHRoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTtcblxufTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBzcm91Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBeGlzSGVscGVyKCBzaXplICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDE7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDAsIDAsIDAsICBzaXplLCAwLCAwLFxuXHRcdDAsIDAsIDAsICAwLCBzaXplLCAwLFxuXHRcdDAsIDAsIDAsICAwLCAwLCBzaXplXG5cdF07XG5cblx0dmFyIGNvbG9ycyA9IFtcblx0XHQxLCAwLCAwLCAgMSwgMC42LCAwLFxuXHRcdDAsIDEsIDAsICAwLjYsIDEsIDAsXG5cdFx0MCwgMCwgMSwgIDAsIDAuNiwgMVxuXHRdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuQXhpc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5BeGlzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4aXNIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKlxuICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcbiAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxuICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcbiAqXG4gKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cbiAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcbiAqL1xuXG5cbi8qXG5CYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXG4gLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xuIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXG5cblRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcbmJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxud2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxuKi9cblxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xuXG5cdHZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cblx0Lypcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcblx0ICogc3VjaCB0aGF0XG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcblx0ICogIGFuZFxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcblxuXHRcdGMwID0geDA7XG5cdFx0YzEgPSB0MDtcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcblxuXHRcdH0sXG5cblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cblx0XHRcdHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XG5cdFx0XHR2YXIgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xuXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cblx0XHRcdHQxICo9IGR0MTtcblx0XHRcdHQyICo9IGR0MTtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcblxuXHRcdH0sXG5cblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHRcdHZhciB0MiA9IHQgKiB0O1xuXHRcdFx0dmFyIHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG52YXIgdG1wID0gbmV3IFZlY3RvcjMoKTtcbnZhciBweCA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweSA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcCAvKiBhcnJheSBvZiBWZWN0b3IzICovICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnBvaW50cyA9IHAgfHwgW107XG5cdHRoaXMuY2xvc2VkID0gZmFsc2U7XG5cbn1cblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMztcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0aWYgKCBsIDwgMiApIGNvbnNvbGUubG9nKCAnZHVoLCB5b3UgbmVlZCBhdCBsZWFzdCAyIHBvaW50cycgKTtcblxuXHR2YXIgcG9pbnQgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDtcblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcG9pbnQgKTtcblx0dmFyIHdlaWdodCA9IHBvaW50IC0gaW50UG9pbnQ7XG5cblx0aWYgKCB0aGlzLmNsb3NlZCApIHtcblxuXHRcdGludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGguYWJzKCBpbnRQb2ludCApIC8gcG9pbnRzLmxlbmd0aCApICsgMSApICogcG9pbnRzLmxlbmd0aDtcblxuXHR9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkge1xuXG5cdFx0aW50UG9pbnQgPSBsIC0gMjtcblx0XHR3ZWlnaHQgPSAxO1xuXG5cdH1cblxuXHR2YXIgcDAsIHAxLCBwMiwgcDM7IC8vIDQgcG9pbnRzXG5cblx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCA+IDAgKSB7XG5cblx0XHRwMCA9IHBvaW50c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgZmlyc3QgcG9pbnRcblx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyAwIF0sIHBvaW50c1sgMSBdICkuYWRkKCBwb2ludHNbIDAgXSApO1xuXHRcdHAwID0gdG1wO1xuXG5cdH1cblxuXHRwMSA9IHBvaW50c1sgaW50UG9pbnQgJSBsIF07XG5cdHAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdO1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgKyAyIDwgbCApIHtcblxuXHRcdHAzID0gcG9pbnRzWyAoIGludFBvaW50ICsgMiApICUgbCBdO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBleHRyYXBvbGF0ZSBsYXN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgbCAtIDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTtcblx0XHRwMyA9IHRtcDtcblxuXHR9XG5cblx0aWYgKCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy50eXBlID09PSAnY2hvcmRhbCcgKSB7XG5cblx0XHQvLyBpbml0IENlbnRyaXBldGFsIC8gQ2hvcmRhbCBDYXRtdWxsLVJvbVxuXHRcdHZhciBwb3cgPSB0aGlzLnR5cGUgPT09ICdjaG9yZGFsJyA/IDAuNSA6IDAuMjU7XG5cdFx0dmFyIGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7XG5cdFx0dmFyIGR0MSA9IE1hdGgucG93KCBwMS5kaXN0YW5jZVRvU3F1YXJlZCggcDIgKSwgcG93ICk7XG5cdFx0dmFyIGR0MiA9IE1hdGgucG93KCBwMi5kaXN0YW5jZVRvU3F1YXJlZCggcDMgKSwgcG93ICk7XG5cblx0XHQvLyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50c1xuXHRcdGlmICggZHQxIDwgMWUtNCApIGR0MSA9IDEuMDtcblx0XHRpZiAoIGR0MCA8IDFlLTQgKSBkdDAgPSBkdDE7XG5cdFx0aWYgKCBkdDIgPCAxZS00ICkgZHQyID0gZHQxO1xuXG5cdFx0cHguaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCBkdDAsIGR0MSwgZHQyICk7XG5cdFx0cHkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7XG5cdFx0cHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7XG5cblx0fSBlbHNlIGlmICggdGhpcy50eXBlID09PSAnY2F0bXVsbHJvbScgKSB7XG5cblx0XHR2YXIgdGVuc2lvbiA9IHRoaXMudGVuc2lvbiAhPT0gdW5kZWZpbmVkID8gdGhpcy50ZW5zaW9uIDogMC41O1xuXHRcdHB4LmluaXRDYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCB0ZW5zaW9uICk7XG5cdFx0cHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRlbnNpb24gKTtcblx0XHRwei5pbml0Q2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgdGVuc2lvbiApO1xuXG5cdH1cblxuXHRyZXR1cm4gbmV3IFZlY3RvcjMoIHB4LmNhbGMoIHdlaWdodCApLCBweS5jYWxjKCB3ZWlnaHQgKSwgcHouY2FsYyggd2VpZ2h0ICkgKTtcblxufTtcblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIsIHYzICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnYwID0gdjA7XG5cdHRoaXMudjEgPSB2MTtcblx0dGhpcy52MiA9IHYyO1xuXHR0aGlzLnYzID0gdjM7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMztcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IzKFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXG5cdCk7XG5cbn07XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy52MCA9IHYwO1xuXHR0aGlzLnYxID0gdjE7XG5cdHRoaXMudjIgPSB2MjtcblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmUzO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHJldHVybiBuZXcgVmVjdG9yMyhcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxuXHQpO1xuXG59O1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudjEgPSB2MTtcblx0dGhpcy52MiA9IHYyO1xuXG59XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTM7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHJldHVybiB0aGlzLnYyLmNsb25lKCk7XG5cblx0fVxuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZlY3Rvci5zdWJWZWN0b3JzKCB0aGlzLnYyLCB0aGlzLnYxICk7IC8vIGRpZmZcblx0dmVjdG9yLm11bHRpcGx5U2NhbGFyKCB0ICk7XG5cdHZlY3Rvci5hZGQoIHRoaXMudjEgKTtcblxuXHRyZXR1cm4gdmVjdG9yO1xuXG59O1xuXG5mdW5jdGlvbiBBcmNDdXJ2ZSggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdEVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxufVxuXG5BcmNDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFbGxpcHNlQ3VydmUucHJvdG90eXBlICk7XG5BcmNDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcmNDdXJ2ZTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBTY2VuZVV0aWxzID0ge1xuXG5cdGNyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG1hdGVyaWFscyApIHtcblxuXHRcdHZhciBncm91cCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbWF0ZXJpYWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGdyb3VwLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbHNbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ3JvdXA7XG5cblx0fSxcblxuXHRkZXRhY2g6IGZ1bmN0aW9uICggY2hpbGQsIHBhcmVudCwgc2NlbmUgKSB7XG5cblx0XHRjaGlsZC5hcHBseU1hdHJpeCggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0cGFyZW50LnJlbW92ZSggY2hpbGQgKTtcblx0XHRzY2VuZS5hZGQoIGNoaWxkICk7XG5cblx0fSxcblxuXHRhdHRhY2g6IGZ1bmN0aW9uICggY2hpbGQsIHNjZW5lLCBwYXJlbnQgKSB7XG5cblx0XHR2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0XHRtYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0Y2hpbGQuYXBwbHlNYXRyaXgoIG1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0c2NlbmUucmVtb3ZlKCBjaGlsZCApO1xuXHRcdHBhcmVudC5hZGQoIGNoaWxkICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmFjZTQoIGEsIGIsIGMsIGQsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZTQgaGFzIGJlZW4gcmVtb3ZlZC4gQSBUSFJFRS5GYWNlMyB3aWxsIGJlIGNyZWF0ZWQgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKTtcblxufVxuXG52YXIgTGluZVN0cmlwID0gMDtcblxudmFyIExpbmVQaWVjZXMgPSAxO1xuXG5mdW5jdGlvbiBNZXNoRmFjZU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gTXVsdGlNYXRlcmlhbCggbWF0ZXJpYWxzICkge1xuXG5cdGlmICggbWF0ZXJpYWxzID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbHMgPSBbXTtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NdWx0aU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTtcblx0bWF0ZXJpYWxzLmlzTXVsdGlNYXRlcmlhbCA9IHRydWU7XG5cdG1hdGVyaWFscy5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7XG5cdG1hdGVyaWFscy5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBtYXRlcmlhbHMuc2xpY2UoKTtcblxuXHR9O1xuXHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG59XG5cbmZ1bmN0aW9uIFBvaW50Q2xvdWQoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4nICk7XG5cdHJldHVybiBuZXcgU3ByaXRlKCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW0gaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBWZXJ0ZXgoIHgsIHksIHogKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFZlY3RvcjMoIHgsIHksIHogKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBEeW5hbWljQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSgpLnNldER5bmFtaWMoIHRydWUgKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApLnNldER5bmFtaWMoIHRydWUgKTtcblxufVxuXG5mdW5jdGlvbiBJbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDhDbGFtcGVkQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhDbGFtcGVkQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBJbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBJbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBGbG9hdDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBGbG9hdDY0QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQ2NEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG4vL1xuXG5DdXJ2ZS5jcmVhdGUgPSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7XG5cblx0Y29uc29sZS5sb2coICdUSFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkJyApO1xuXG5cdGNvbnN0cnVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdDtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5nZXRQb2ludCA9IGdldFBvaW50O1xuXG5cdHJldHVybiBjb25zdHJ1Y3Q7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIENsb3NlZFNwbGluZUN1cnZlMyggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkNsb3NlZFNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTtcblxuXHRDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXHR0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7XG5cdHRoaXMuY2xvc2VkID0gdHJ1ZTtcblxufVxuXG5DbG9zZWRTcGxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgKTtcblxuLy9cblxuZnVuY3Rpb24gU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblxufVxuXG5TcGxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgKTtcblxuLy9cblxuZnVuY3Rpb24gU3BsaW5lKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BsaW5lIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblxufVxuXG5TcGxpbmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgKTtcblxuT2JqZWN0LmFzc2lnbiggU3BsaW5lLnByb3RvdHlwZSwge1xuXG5cdGluaXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggYSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Z2V0Q29udHJvbFBvaW50c0FycmF5OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmdldENvbnRyb2xQb2ludHNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aDogZnVuY3Rpb24gKCBzYW1wbGluZ0NvZWYgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5mdW5jdGlvbiBCb3VuZGluZ0JveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKTtcblxufVxuXG5mdW5jdGlvbiBFZGdlc0hlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgRWRnZXNHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nICk7XG5cbn07XG5cbmZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2lyZWZyYW1lSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBYSFJMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRmlsZUxvYWRlciggbWFuYWdlciApO1xuXG59XG5cbmZ1bmN0aW9uIEJpbmFyeVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQmluYXJ5VGV4dHVyZUxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkRhdGFUZXh0dXJlTG9hZGVyLicgKTtcblx0cmV0dXJuIG5ldyBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApO1xuXG59XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0c2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH1cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbkxpbmUzLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbl9NYXRoLnJhbmRvbTE2ID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGgucmFuZG9tMTYoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgTWF0aC5yYW5kb20oKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIE1hdGgucmFuZG9tKCk7XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSBtYXRyaXguYXBwbHlUb1ZlY3RvcjNBcnJheSggYXJyYXkgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvVmVjdG9yM0FycmF5KCBhICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24oIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24oIGFycmF5LCBvZmZzZXQsIGxlbmd0aCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdH0sXG5cdG11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VG9BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCBhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIG1hdHJpeC5hcHBseVRvVmVjdG9yM0FycmF5KCBhcnJheSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9WZWN0b3IzQXJyYXkoIGEgKTtcblxuXHR9LFxuXHRyb3RhdGVBeGlzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0di50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXHRjcm9zc1ZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVaKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlQnlBeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUJ5QXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uKCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRtYWtlRnJ1c3R1bTogZnVuY3Rpb24oIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApO1xuXG5cdH1cblxufSApO1xuXG5QbGFuZS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lID0gZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4nICk7XG5cdHJldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKCBsaW5lICk7XG5cbn07XG5cblF1YXRlcm5pb24ucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgaXMgbm93IHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHRoaXMgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzUGxhbmUoIHBsYW5lICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBTaGFwZS5wcm90b3R5cGUsIHtcblxuXHRleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9LFxuXHRtYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7XG5cblx0c2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0c2V0RXVsZXJGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbSApO1xuXG5cdH0sXG5cdGdldFNjYWxlRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoIG0gKTtcblxuXHR9LFxuXHRnZXRDb2x1bW5Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbWF0cml4LCBpbmRleCApO1xuXG5cdH0sXG5cdGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtICk7XG5cblx0fSxcblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwge1xuXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuR2VvbWV0cnkucHJvdG90eXBlLmNvbXB1dGVUYW5nZW50cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBPYmplY3QzRC5wcm90b3R5cGUsIHtcblxuXHRnZXRDaGlsZEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoIG5hbWUgKTtcblxuXHR9LFxuXHRyZW5kZXJEZXB0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggZGlzdGFuY2UsIGF4aXMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGV1bGVyT3JkZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0dGhpcy5yb3RhdGlvbi5vcmRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR1c2VRdWF0ZXJuaW9uOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMT0QucHJvdG90eXBlLCB7XG5cblx0b2JqZWN0czoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5sZXZlbHM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIFNrZWxldG9uLnByb3RvdHlwZSwgJ3VzZVZlcnRleFRleHR1cmUnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1cnZlLnByb3RvdHlwZSwgJ19fYXJjTGVuZ3RoRGl2aXNpb25zJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZS5zZXRMZW5zID0gZnVuY3Rpb24gKCBmb2NhbExlbmd0aCwgZmlsbUdhdWdlICkge1xuXG5cdGNvbnNvbGUud2FybiggXCJUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYS5zZXRMZW5zIGlzIGRlcHJlY2F0ZWQuIFwiICtcblx0XHRcdFwiVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuXCIgKTtcblxuXHRpZiAoIGZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgdGhpcy5maWxtR2F1Z2UgPSBmaWxtR2F1Z2U7XG5cdHRoaXMuc2V0Rm9jYWxMZW5ndGgoIGZvY2FsTGVuZ3RoICk7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMaWdodC5wcm90b3R5cGUsIHtcblx0b25seVNoYWRvdzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZvdjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZm92ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUxlZnQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEubGVmdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFSaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVRvcDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEudG9wID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUJvdHRvbToge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYU5lYXI6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEubmVhciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFGYXI6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmZhciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFWaXNpYmxlOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dCaWFzOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5iaWFzID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0RhcmtuZXNzOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93RGFya25lc3MgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFdpZHRoOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcFdpZHRoIGlzIG5vdyAuc2hhZG93Lm1hcFNpemUud2lkdGguJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBIZWlnaHQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRsZW5ndGg6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGg7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRhZGRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLicgKTtcblx0XHR0aGlzLnNldEluZGV4KCBpbmRleCApO1xuXG5cdH0sXG5cdGFkZERyYXdDYWxsOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgaW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoIGluZGV4T2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuJyApO1xuXG5cdFx0fVxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBpcyBub3cgLmFkZEdyb3VwKCkuJyApO1xuXHRcdHRoaXMuYWRkR3JvdXAoIHN0YXJ0LCBjb3VudCApO1xuXG5cdH0sXG5cdGNsZWFyRHJhd0NhbGxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLicgKTtcblx0XHR0aGlzLmNsZWFyR3JvdXBzKCk7XG5cblx0fSxcblx0Y29tcHV0ZVRhbmdlbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGNvbXB1dGVPZmZzZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRkcmF3Y2FsbHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuZHJhd2NhbGxzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5ncm91cHM7XG5cblx0XHR9XG5cdH0sXG5cdG9mZnNldHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5ncm91cHM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVW5pZm9ybS5wcm90b3R5cGUsIHtcblxuXHRkeW5hbWljOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0b25VcGRhdGU6IHtcblx0XHR2YWx1ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHR3cmFwQXJvdW5kOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0d3JhcFJHQjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0bWV0YWw6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdGRlcml2YXRpdmVzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0Z2V0Q3VycmVudFJlbmRlclRhcmdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHR9LFxuXG5cdHN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQmxlbmRNaW5NYXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnRVhUX2JsZW5kX21pbm1heFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0fSxcblx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdH0sXG5cdHN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHR9LFxuXHRlbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLicgKTtcblx0XHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cblx0fSxcblx0aW5pdE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUG9zdFBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHR1cGRhdGVTaGFkb3dNYXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0c2hhZG93TWFwRW5hYmxlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwVHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwQ3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLmN1bGxGYWNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBpcyBub3cgLnNoYWRvd01hcC5jdWxsRmFjZS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC5jdWxsRmFjZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHtcblxuXHRjdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yZW5kZXJSZXZlcnNlU2lkZWQgPyBDdWxsRmFjZUZyb250IDogQ3VsbEZhY2VCYWNrO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggY3VsbEZhY2UgKSB7XG5cblx0XHRcdHZhciB2YWx1ZSA9ICggY3VsbEZhY2UgIT09IEN1bGxGYWNlQmFjayApO1xuXHRcdFx0Y29uc29sZS53YXJuKCBcIldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaXMgZGVwcmVjYXRlZC4gU2V0IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIHRvIFwiICsgdmFsdWUgKyBcIi5cIiApO1xuXHRcdFx0dGhpcy5yZW5kZXJSZXZlcnNlU2lkZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbkF1ZGlvLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4nICk7XG5cdHZhciBzY29wZSA9IHRoaXM7XG5cdHZhciBhdWRpb0xvYWRlciA9IG5ldyBBdWRpb0xvYWRlcigpO1xuXHRhdWRpb0xvYWRlci5sb2FkKCBmaWxlLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdHNjb3BlLnNldEJ1ZmZlciggYnVmZmVyICk7XG5cblx0fSApO1xuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQXVkaW9BbmFseXNlci5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG59O1xuXG4vL1xuXG52YXIgR2VvbWV0cnlVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEsIGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7XG5cdFx0dmFyIG1hdHJpeDtcblxuXHRcdGlmICggZ2VvbWV0cnkyLmlzTWVzaCApIHtcblxuXHRcdFx0Z2VvbWV0cnkyLm1hdHJpeEF1dG9VcGRhdGUgJiYgZ2VvbWV0cnkyLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHRtYXRyaXggPSBnZW9tZXRyeTIubWF0cml4O1xuXHRcdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkyLmdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkxLm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIGdlb21ldHJ5LmNlbnRlcigpO1xuXG5cdH1cblxufTtcblxudmFyIEltYWdlVXRpbHMgPSB7XG5cblx0Y3Jvc3NPcmlnaW46IHVuZGVmaW5lZCxcblxuXHRsb2FkVGV4dHVyZTogZnVuY3Rpb24gKCB1cmwsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJsLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0bG9hZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmVDdWJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJscywgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdGxvYWRDb21wcmVzc2VkVGV4dHVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fSxcblxuXHRsb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBQcm9qZWN0b3IoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4nICk7XG5cblx0dGhpcy5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnByb2plY3QoIGNhbWVyYSApO1xuXG5cdH07XG5cblx0dGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAudW5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0fTtcblxuXHR0aGlzLnBpY2tpbmdSYXkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yOiAucGlja2luZ1JheSgpIGlzIG5vdyByYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSgpLicgKTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL0NhbnZhc1JlbmRlcmVyLmpzJyApO1xuXG5cdHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoKSB7fTtcblxufVxuXG5leHBvcnQgeyBXZWJHTFJlbmRlclRhcmdldEN1YmUsIFdlYkdMUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlcmVyLCBTaGFkZXJMaWIsIFVuaWZvcm1zTGliLCBVbmlmb3Jtc1V0aWxzLCBTaGFkZXJDaHVuaywgRm9nRXhwMiwgRm9nLCBTY2VuZSwgTGVuc0ZsYXJlLCBTcHJpdGUsIExPRCwgU2tpbm5lZE1lc2gsIFNrZWxldG9uLCBCb25lLCBNZXNoLCBMaW5lU2VnbWVudHMsIExpbmVMb29wLCBMaW5lLCBQb2ludHMsIEdyb3VwLCBWaWRlb1RleHR1cmUsIERhdGFUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZSwgQ3ViZVRleHR1cmUsIENhbnZhc1RleHR1cmUsIERlcHRoVGV4dHVyZSwgVGV4dHVyZSwgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIsIERhdGFUZXh0dXJlTG9hZGVyLCBDdWJlVGV4dHVyZUxvYWRlciwgVGV4dHVyZUxvYWRlciwgT2JqZWN0TG9hZGVyLCBNYXRlcmlhbExvYWRlciwgQnVmZmVyR2VvbWV0cnlMb2FkZXIsIERlZmF1bHRMb2FkaW5nTWFuYWdlciwgTG9hZGluZ01hbmFnZXIsIEpTT05Mb2FkZXIsIEltYWdlTG9hZGVyLCBGb250TG9hZGVyLCBGaWxlTG9hZGVyLCBMb2FkZXIsIENhY2hlLCBBdWRpb0xvYWRlciwgU3BvdExpZ2h0U2hhZG93LCBTcG90TGlnaHQsIFBvaW50TGlnaHQsIFJlY3RBcmVhTGlnaHQsIEhlbWlzcGhlcmVMaWdodCwgRGlyZWN0aW9uYWxMaWdodFNoYWRvdywgRGlyZWN0aW9uYWxMaWdodCwgQW1iaWVudExpZ2h0LCBMaWdodFNoYWRvdywgTGlnaHQsIFN0ZXJlb0NhbWVyYSwgUGVyc3BlY3RpdmVDYW1lcmEsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgQ3ViZUNhbWVyYSwgQXJyYXlDYW1lcmEsIENhbWVyYSwgQXVkaW9MaXN0ZW5lciwgUG9zaXRpb25hbEF1ZGlvLCBBdWRpb0NvbnRleHQsIEF1ZGlvQW5hbHlzZXIsIEF1ZGlvLCBWZWN0b3JLZXlmcmFtZVRyYWNrLCBTdHJpbmdLZXlmcmFtZVRyYWNrLCBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgTnVtYmVyS2V5ZnJhbWVUcmFjaywgQ29sb3JLZXlmcmFtZVRyYWNrLCBCb29sZWFuS2V5ZnJhbWVUcmFjaywgUHJvcGVydHlNaXhlciwgUHJvcGVydHlCaW5kaW5nLCBLZXlmcmFtZVRyYWNrLCBBbmltYXRpb25VdGlscywgQW5pbWF0aW9uT2JqZWN0R3JvdXAsIEFuaW1hdGlvbk1peGVyLCBBbmltYXRpb25DbGlwLCBVbmlmb3JtLCBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSwgQnVmZmVyR2VvbWV0cnksIEdlb21ldHJ5SWRDb3VudCwgR2VvbWV0cnksIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLCBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciwgSW50ZXJsZWF2ZWRCdWZmZXIsIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwgRmFjZTMsIE9iamVjdDNELCBSYXljYXN0ZXIsIExheWVycywgRXZlbnREaXNwYXRjaGVyLCBDbG9jaywgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LCBMaW5lYXJJbnRlcnBvbGFudCwgRGlzY3JldGVJbnRlcnBvbGFudCwgQ3ViaWNJbnRlcnBvbGFudCwgSW50ZXJwb2xhbnQsIFRyaWFuZ2xlLCBfTWF0aCBhcyBNYXRoLCBTcGhlcmljYWwsIEN5bGluZHJpY2FsLCBQbGFuZSwgRnJ1c3R1bSwgU3BoZXJlLCBSYXksIE1hdHJpeDQsIE1hdHJpeDMsIEJveDMsIEJveDIsIExpbmUzLCBFdWxlciwgVmVjdG9yNCwgVmVjdG9yMywgVmVjdG9yMiwgUXVhdGVybmlvbiwgQ29sb3IsIE1vcnBoQmxlbmRNZXNoLCBJbW1lZGlhdGVSZW5kZXJPYmplY3QsIFZlcnRleE5vcm1hbHNIZWxwZXIsIFNwb3RMaWdodEhlbHBlciwgU2tlbGV0b25IZWxwZXIsIFBvaW50TGlnaHRIZWxwZXIsIFJlY3RBcmVhTGlnaHRIZWxwZXIsIEhlbWlzcGhlcmVMaWdodEhlbHBlciwgR3JpZEhlbHBlciwgUG9sYXJHcmlkSGVscGVyLCBGYWNlTm9ybWFsc0hlbHBlciwgRGlyZWN0aW9uYWxMaWdodEhlbHBlciwgQ2FtZXJhSGVscGVyLCBCb3hIZWxwZXIsIEFycm93SGVscGVyLCBBeGlzSGVscGVyLCBDYXRtdWxsUm9tQ3VydmUzLCBDdWJpY0JlemllckN1cnZlMywgUXVhZHJhdGljQmV6aWVyQ3VydmUzLCBMaW5lQ3VydmUzLCBBcmNDdXJ2ZSwgRWxsaXBzZUN1cnZlLCBTcGxpbmVDdXJ2ZSwgQ3ViaWNCZXppZXJDdXJ2ZSwgUXVhZHJhdGljQmV6aWVyQ3VydmUsIExpbmVDdXJ2ZSwgU2hhcGUsIFBhdGgsIFNoYXBlUGF0aCwgRm9udCwgQ3VydmVQYXRoLCBDdXJ2ZSwgU2hhcGVVdGlscywgU2NlbmVVdGlscywgV2lyZWZyYW1lR2VvbWV0cnksIFBhcmFtZXRyaWNHZW9tZXRyeSwgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LCBUZXRyYWhlZHJvbkdlb21ldHJ5LCBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBPY3RhaGVkcm9uR2VvbWV0cnksIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSwgSWNvc2FoZWRyb25HZW9tZXRyeSwgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSwgRG9kZWNhaGVkcm9uR2VvbWV0cnksIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBQb2x5aGVkcm9uR2VvbWV0cnksIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSwgVHViZUdlb21ldHJ5LCBUdWJlQnVmZmVyR2VvbWV0cnksIFRvcnVzS25vdEdlb21ldHJ5LCBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSwgVG9ydXNHZW9tZXRyeSwgVG9ydXNCdWZmZXJHZW9tZXRyeSwgVGV4dEdlb21ldHJ5LCBUZXh0QnVmZmVyR2VvbWV0cnksIFNwaGVyZUdlb21ldHJ5LCBTcGhlcmVCdWZmZXJHZW9tZXRyeSwgUmluZ0dlb21ldHJ5LCBSaW5nQnVmZmVyR2VvbWV0cnksIFBsYW5lR2VvbWV0cnksIFBsYW5lQnVmZmVyR2VvbWV0cnksIExhdGhlR2VvbWV0cnksIExhdGhlQnVmZmVyR2VvbWV0cnksIFNoYXBlR2VvbWV0cnksIFNoYXBlQnVmZmVyR2VvbWV0cnksIEV4dHJ1ZGVHZW9tZXRyeSwgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LCBFZGdlc0dlb21ldHJ5LCBDb25lR2VvbWV0cnksIENvbmVCdWZmZXJHZW9tZXRyeSwgQ3lsaW5kZXJHZW9tZXRyeSwgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSwgQ2lyY2xlR2VvbWV0cnksIENpcmNsZUJ1ZmZlckdlb21ldHJ5LCBCb3hHZW9tZXRyeSwgQm94QnVmZmVyR2VvbWV0cnksIFNoYWRvd01hdGVyaWFsLCBTcHJpdGVNYXRlcmlhbCwgUmF3U2hhZGVyTWF0ZXJpYWwsIFNoYWRlck1hdGVyaWFsLCBQb2ludHNNYXRlcmlhbCwgTWVzaFBoeXNpY2FsTWF0ZXJpYWwsIE1lc2hTdGFuZGFyZE1hdGVyaWFsLCBNZXNoUGhvbmdNYXRlcmlhbCwgTWVzaFRvb25NYXRlcmlhbCwgTWVzaE5vcm1hbE1hdGVyaWFsLCBNZXNoTGFtYmVydE1hdGVyaWFsLCBNZXNoRGVwdGhNYXRlcmlhbCwgTWVzaEJhc2ljTWF0ZXJpYWwsIExpbmVEYXNoZWRNYXRlcmlhbCwgTGluZUJhc2ljTWF0ZXJpYWwsIE1hdGVyaWFsLCBGbG9hdDY0QnVmZmVyQXR0cmlidXRlLCBGbG9hdDMyQnVmZmVyQXR0cmlidXRlLCBVaW50MzJCdWZmZXJBdHRyaWJ1dGUsIEludDMyQnVmZmVyQXR0cmlidXRlLCBVaW50MTZCdWZmZXJBdHRyaWJ1dGUsIEludDE2QnVmZmVyQXR0cmlidXRlLCBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUsIFVpbnQ4QnVmZmVyQXR0cmlidXRlLCBJbnQ4QnVmZmVyQXR0cmlidXRlLCBCdWZmZXJBdHRyaWJ1dGUsIFJFVklTSU9OLCBNT1VTRSwgQ3VsbEZhY2VOb25lLCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIEN1bGxGYWNlRnJvbnRCYWNrLCBGcm9udEZhY2VEaXJlY3Rpb25DVywgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXLCBCYXNpY1NoYWRvd01hcCwgUENGU2hhZG93TWFwLCBQQ0ZTb2Z0U2hhZG93TWFwLCBGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLCBGbGF0U2hhZGluZywgU21vb3RoU2hhZGluZywgTm9Db2xvcnMsIEZhY2VDb2xvcnMsIFZlcnRleENvbG9ycywgTm9CbGVuZGluZywgTm9ybWFsQmxlbmRpbmcsIEFkZGl0aXZlQmxlbmRpbmcsIFN1YnRyYWN0aXZlQmxlbmRpbmcsIE11bHRpcGx5QmxlbmRpbmcsIEN1c3RvbUJsZW5kaW5nLCBBZGRFcXVhdGlvbiwgU3VidHJhY3RFcXVhdGlvbiwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sIE1pbkVxdWF0aW9uLCBNYXhFcXVhdGlvbiwgWmVyb0ZhY3RvciwgT25lRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgT25lTWludXNTcmNDb2xvckZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIERzdEFscGhhRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBEc3RDb2xvckZhY3RvciwgT25lTWludXNEc3RDb2xvckZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgTmV2ZXJEZXB0aCwgQWx3YXlzRGVwdGgsIExlc3NEZXB0aCwgTGVzc0VxdWFsRGVwdGgsIEVxdWFsRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBHcmVhdGVyRGVwdGgsIE5vdEVxdWFsRGVwdGgsIE11bHRpcGx5T3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIEFkZE9wZXJhdGlvbiwgTm9Ub25lTWFwcGluZywgTGluZWFyVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIFVuY2hhcnRlZDJUb25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcsIFVWTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywgUmVwZWF0V3JhcHBpbmcsIENsYW1wVG9FZGdlV3JhcHBpbmcsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsIE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgVW5zaWduZWRCeXRlVHlwZSwgQnl0ZVR5cGUsIFNob3J0VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIEludFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgRmxvYXRUeXBlLCBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgQWxwaGFGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgUkdCRUZvcm1hdCwgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdCwgTG9vcE9uY2UsIExvb3BSZXBlYXQsIExvb3BQaW5nUG9uZywgSW50ZXJwb2xhdGVEaXNjcmV0ZSwgSW50ZXJwb2xhdGVMaW5lYXIsIEludGVycG9sYXRlU21vb3RoLCBaZXJvQ3VydmF0dXJlRW5kaW5nLCBaZXJvU2xvcGVFbmRpbmcsIFdyYXBBcm91bmRFbmRpbmcsIFRyaWFuZ2xlc0RyYXdNb2RlLCBUcmlhbmdsZVN0cmlwRHJhd01vZGUsIFRyaWFuZ2xlRmFuRHJhd01vZGUsIExpbmVhckVuY29kaW5nLCBzUkdCRW5jb2RpbmcsIEdhbW1hRW5jb2RpbmcsIFJHQkVFbmNvZGluZywgTG9nTHV2RW5jb2RpbmcsIFJHQk03RW5jb2RpbmcsIFJHQk0xNkVuY29kaW5nLCBSR0JERW5jb2RpbmcsIEJhc2ljRGVwdGhQYWNraW5nLCBSR0JBRGVwdGhQYWNraW5nLCBCb3hHZW9tZXRyeSBhcyBDdWJlR2VvbWV0cnksIEZhY2U0LCBMaW5lU3RyaXAsIExpbmVQaWVjZXMsIE1lc2hGYWNlTWF0ZXJpYWwsIE11bHRpTWF0ZXJpYWwsIFBvaW50Q2xvdWQsIFBhcnRpY2xlLCBQYXJ0aWNsZVN5c3RlbSwgUG9pbnRDbG91ZE1hdGVyaWFsLCBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWwsIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwsIFZlcnRleCwgRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSwgSW50OEF0dHJpYnV0ZSwgVWludDhBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSwgSW50MTZBdHRyaWJ1dGUsIFVpbnQxNkF0dHJpYnV0ZSwgSW50MzJBdHRyaWJ1dGUsIFVpbnQzMkF0dHJpYnV0ZSwgRmxvYXQzMkF0dHJpYnV0ZSwgRmxvYXQ2NEF0dHJpYnV0ZSwgQ2xvc2VkU3BsaW5lQ3VydmUzLCBTcGxpbmVDdXJ2ZTMsIFNwbGluZSwgQm91bmRpbmdCb3hIZWxwZXIsIEVkZ2VzSGVscGVyLCBXaXJlZnJhbWVIZWxwZXIsIFhIUkxvYWRlciwgQmluYXJ5VGV4dHVyZUxvYWRlciwgR2VvbWV0cnlVdGlscywgSW1hZ2VVdGlscywgUHJvamVjdG9yLCBDYW52YXNSZW5kZXJlciB9O1xuIiwiZXhwb3J0IHsgX3R5cGVvZiBhcyB0eXBlb2YsIF9qc3ggYXMganN4LCBfYXN5bmNJdGVyYXRvciBhcyBhc3luY0l0ZXJhdG9yLCBfQXdhaXRWYWx1ZSBhcyBBd2FpdFZhbHVlLCBfQXN5bmNHZW5lcmF0b3IgYXMgQXN5bmNHZW5lcmF0b3IsIF93cmFwQXN5bmNHZW5lcmF0b3IgYXMgd3JhcEFzeW5jR2VuZXJhdG9yLCBfYXdhaXRBc3luY0dlbmVyYXRvciBhcyBhd2FpdEFzeW5jR2VuZXJhdG9yLCBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSBhcyBhc3luY0dlbmVyYXRvckRlbGVnYXRlLCBfYXN5bmNUb0dlbmVyYXRvciBhcyBhc3luY1RvR2VuZXJhdG9yLCBfY2xhc3NDYWxsQ2hlY2sgYXMgY2xhc3NDYWxsQ2hlY2ssIF9jcmVhdGVDbGFzcyBhcyBjcmVhdGVDbGFzcywgX2RlZmluZUVudW1lcmFibGVQcm9wZXJ0aWVzIGFzIGRlZmluZUVudW1lcmFibGVQcm9wZXJ0aWVzLCBfZGVmYXVsdHMgYXMgZGVmYXVsdHMsIF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZpbmVQcm9wZXJ0eSwgX2V4dGVuZHMgYXMgZXh0ZW5kcywgX29iamVjdFNwcmVhZCBhcyBvYmplY3RTcHJlYWQsIF9pbmhlcml0cyBhcyBpbmhlcml0cywgX2luaGVyaXRzTG9vc2UgYXMgaW5oZXJpdHNMb29zZSwgX2dldFByb3RvdHlwZU9mIGFzIGdldFByb3RvdHlwZU9mLCBfc2V0UHJvdG90eXBlT2YgYXMgc2V0UHJvdG90eXBlT2YsIF9jb25zdHJ1Y3QgYXMgY29uc3RydWN0LCBfd3JhcE5hdGl2ZVN1cGVyIGFzIHdyYXBOYXRpdmVTdXBlciwgX2luc3RhbmNlb2YgYXMgaW5zdGFuY2VvZiwgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCBhcyBpbnRlcm9wUmVxdWlyZURlZmF1bHQsIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIGFzIGludGVyb3BSZXF1aXJlV2lsZGNhcmQsIF9uZXdBcnJvd0NoZWNrIGFzIG5ld0Fycm93Q2hlY2ssIF9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkgYXMgb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5LCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgYXMgb2JqZWN0V2l0aG91dFByb3BlcnRpZXMsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgYXMgYXNzZXJ0VGhpc0luaXRpYWxpemVkLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBhcyBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLCBfc3VwZXJQcm9wQmFzZSBhcyBzdXBlclByb3BCYXNlLCBfZ2V0IGFzIGdldCwgX3NldCBhcyBzZXQsIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwgYXMgdGFnZ2VkVGVtcGxhdGVMaXRlcmFsLCBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UgYXMgdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UsIF90ZW1wb3JhbFJlZiBhcyB0ZW1wb3JhbFJlZiwgX3JlYWRPbmx5RXJyb3IgYXMgcmVhZE9ubHlFcnJvciwgX2NsYXNzTmFtZVREWkVycm9yIGFzIGNsYXNzTmFtZVREWkVycm9yLCBfdGVtcG9yYWxVbmRlZmluZWQgYXMgdGVtcG9yYWxVbmRlZmluZWQsIF9zbGljZWRUb0FycmF5IGFzIHNsaWNlZFRvQXJyYXksIF9zbGljZWRUb0FycmF5TG9vc2UgYXMgc2xpY2VkVG9BcnJheUxvb3NlLCBfdG9BcnJheSBhcyB0b0FycmF5LCBfdG9Db25zdW1hYmxlQXJyYXkgYXMgdG9Db25zdW1hYmxlQXJyYXksIF9hcnJheVdpdGhvdXRIb2xlcyBhcyBhcnJheVdpdGhvdXRIb2xlcywgX2FycmF5V2l0aEhvbGVzIGFzIGFycmF5V2l0aEhvbGVzLCBfaXRlcmFibGVUb0FycmF5IGFzIGl0ZXJhYmxlVG9BcnJheSwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0IGFzIGl0ZXJhYmxlVG9BcnJheUxpbWl0LCBfaXRlcmFibGVUb0FycmF5TGltaXRMb29zZSBhcyBpdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlLCBfbm9uSXRlcmFibGVTcHJlYWQgYXMgbm9uSXRlcmFibGVTcHJlYWQsIF9ub25JdGVyYWJsZVJlc3QgYXMgbm9uSXRlcmFibGVSZXN0LCBfc2tpcEZpcnN0R2VuZXJhdG9yTmV4dCBhcyBza2lwRmlyc3RHZW5lcmF0b3JOZXh0LCBfdG9Qcm9wZXJ0eUtleSBhcyB0b1Byb3BlcnR5S2V5LCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGFzIGluaXRpYWxpemVyV2FybmluZ0hlbHBlciwgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgYXMgaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBhcyBhcHBseURlY29yYXRlZERlc2NyaXB0b3IsIF9jbGFzc1ByaXZhdGVGaWVsZExvb3NlS2V5IGFzIGNsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXksIF9jbGFzc1ByaXZhdGVGaWVsZExvb3NlQmFzZSBhcyBjbGFzc1ByaXZhdGVGaWVsZExvb3NlQmFzZSwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IGFzIGNsYXNzUHJpdmF0ZUZpZWxkR2V0LCBfY2xhc3NQcml2YXRlRmllbGRTZXQgYXMgY2xhc3NQcml2YXRlRmllbGRTZXQgfTtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFO1xuXG5mdW5jdGlvbiBfanN4KHR5cGUsIHByb3BzLCBrZXksIGNoaWxkcmVuKSB7XG4gIGlmICghUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgMHhlYWM3O1xuICB9XG5cbiAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHM7XG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAzO1xuXG4gIGlmICghcHJvcHMgJiYgY2hpbGRyZW5MZW5ndGggIT09IDApIHtcbiAgICBwcm9wcyA9IHtcbiAgICAgIGNoaWxkcmVuOiB2b2lkIDBcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb3BzICYmIGRlZmF1bHRQcm9wcykge1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCFwcm9wcykge1xuICAgIHByb3BzID0gZGVmYXVsdFByb3BzIHx8IHt9O1xuICB9XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IG5ldyBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDNdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogJycgKyBrZXksXG4gICAgcmVmOiBudWxsLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICBfb3duZXI6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jSXRlcmF0b3IoaXRlcmFibGUpIHtcbiAgdmFyIG1ldGhvZDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKFN5bWJvbC5hc3luY0l0ZXJhdG9yKSB7XG4gICAgICBtZXRob2QgPSBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl07XG4gICAgICBpZiAobWV0aG9kICE9IG51bGwpIHJldHVybiBtZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgfVxuXG4gICAgaWYgKFN5bWJvbC5pdGVyYXRvcikge1xuICAgICAgbWV0aG9kID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXTtcbiAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgcmV0dXJuIG1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGlzIG5vdCBhc3luYyBpdGVyYWJsZVwiKTtcbn1cblxuZnVuY3Rpb24gX0F3YWl0VmFsdWUodmFsdWUpIHtcbiAgdGhpcy53cmFwcGVkID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9Bc3luY0dlbmVyYXRvcihnZW4pIHtcbiAgdmFyIGZyb250LCBiYWNrO1xuXG4gIGZ1bmN0aW9uIHNlbmQoa2V5LCBhcmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlcXVlc3QgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBhcmc6IGFyZyxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0OiByZWplY3QsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG5cbiAgICAgIGlmIChiYWNrKSB7XG4gICAgICAgIGJhY2sgPSBiYWNrLm5leHQgPSByZXF1ZXN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJvbnQgPSBiYWNrID0gcmVxdWVzdDtcbiAgICAgICAgcmVzdW1lKGtleSwgYXJnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZShrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIHZhciB3cmFwcGVkQXdhaXQgPSB2YWx1ZSBpbnN0YW5jZW9mIF9Bd2FpdFZhbHVlO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHdyYXBwZWRBd2FpdCA/IHZhbHVlLndyYXBwZWQgOiB2YWx1ZSkudGhlbihmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIGlmICh3cmFwcGVkQXdhaXQpIHtcbiAgICAgICAgICByZXN1bWUoXCJuZXh0XCIsIGFyZyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGxlKHJlc3VsdC5kb25lID8gXCJyZXR1cm5cIiA6IFwibm9ybWFsXCIsIGFyZyk7XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHJlc3VtZShcInRocm93XCIsIGVycik7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNldHRsZShcInRocm93XCIsIGVycik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwicmV0dXJuXCI6XG4gICAgICAgIGZyb250LnJlc29sdmUoe1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcInRocm93XCI6XG4gICAgICAgIGZyb250LnJlamVjdCh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmcm9udC5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZyb250ID0gZnJvbnQubmV4dDtcblxuICAgIGlmIChmcm9udCkge1xuICAgICAgcmVzdW1lKGZyb250LmtleSwgZnJvbnQuYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFjayA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5faW52b2tlID0gc2VuZDtcblxuICBpZiAodHlwZW9mIGdlbi5yZXR1cm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoaXMucmV0dXJuID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHtcbiAgX0FzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbl9Bc3luY0dlbmVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcIm5leHRcIiwgYXJnKTtcbn07XG5cbl9Bc3luY0dlbmVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJ0aHJvd1wiLCBhcmcpO1xufTtcblxuX0FzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJyZXR1cm5cIiwgYXJnKTtcbn07XG5cbmZ1bmN0aW9uIF93cmFwQXN5bmNHZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IF9Bc3luY0dlbmVyYXRvcihmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2F3YWl0QXN5bmNHZW5lcmF0b3IodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBfQXdhaXRWYWx1ZSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlKGlubmVyLCBhd2FpdFdyYXApIHtcbiAgdmFyIGl0ZXIgPSB7fSxcbiAgICAgIHdhaXRpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwdW1wKGtleSwgdmFsdWUpIHtcbiAgICB3YWl0aW5nID0gdHJ1ZTtcbiAgICB2YWx1ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGlubmVyW2tleV0odmFsdWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZTogYXdhaXRXcmFwKHZhbHVlKVxuICAgIH07XG4gIH1cblxuICA7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG5cbiAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHdhaXRpbmcpIHtcbiAgICAgIHdhaXRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHVtcChcIm5leHRcIiwgdmFsdWUpO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgaW5uZXIudGhyb3cgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGl0ZXIudGhyb3cgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICAgIHdhaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdW1wKFwidGhyb3dcIiwgdmFsdWUpO1xuICAgIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGlubmVyLnJldHVybiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlci5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBwdW1wKFwicmV0dXJuXCIsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGl0ZXI7XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIHN0ZXAoa2V5LCBhcmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgc3RlcChcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIHN0ZXAoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVFbnVtZXJhYmxlUHJvcGVydGllcyhvYmosIGRlc2NzKSB7XG4gIGZvciAodmFyIGtleSBpbiBkZXNjcykge1xuICAgIHZhciBkZXNjID0gZGVzY3Nba2V5XTtcbiAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IGRlc2MuZW51bWVyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIGRlc2MpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgb2JqZWN0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZGVzY3MpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RTeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3ltID0gb2JqZWN0U3ltYm9sc1tpXTtcbiAgICAgIHZhciBkZXNjID0gZGVzY3Nbc3ltXTtcbiAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gZGVzYy5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzYykgZGVzYy53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBzeW0sIGRlc2MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7XG5cbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfaW5zdGFuY2VvZihsZWZ0LCByaWdodCkge1xuICBpZiAocmlnaHQgIT0gbnVsbCAmJiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIHJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0pIHtcbiAgICByZXR1cm4gcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXShsZWZ0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgZGVmYXVsdDogb2JqXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikge1xuICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV3T2JqID0ge307XG5cbiAgICBpZiAob2JqICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiB7fTtcblxuICAgICAgICAgIGlmIChkZXNjLmdldCB8fCBkZXNjLnNldCkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdPYmouZGVmYXVsdCA9IG9iajtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9uZXdBcnJvd0NoZWNrKGlubmVyVGhpcywgYm91bmRUaGlzKSB7XG4gIGlmIChpbm5lclRoaXMgIT09IGJvdW5kVGhpcykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5zdGFudGlhdGUgYW4gYXJyb3cgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29iamVjdERlc3RydWN0dXJpbmdFbXB0eShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGRlc3RydWN0dXJlIHVuZGVmaW5lZFwiKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5mdW5jdGlvbiBfc3VwZXJQcm9wQmFzZShvYmplY3QsIHByb3BlcnR5KSB7XG4gIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5mdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBSZWZsZWN0LmdldCkge1xuICAgIF9nZXQgPSBSZWZsZWN0LmdldDtcbiAgfSBlbHNlIHtcbiAgICBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKCFiYXNlKSByZXR1cm47XG4gICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgUmVmbGVjdC5zZXQpIHtcbiAgICBzZXQgPSBSZWZsZWN0LnNldDtcbiAgfSBlbHNlIHtcbiAgICBzZXQgPSBmdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpO1xuXG4gICAgICB2YXIgZGVzYztcblxuICAgICAgaWYgKGJhc2UpIHtcbiAgICAgICAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgICAgIGRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghZGVzYy53cml0YWJsZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWNlaXZlciwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoZGVzYykge1xuICAgICAgICBpZiAoIWRlc2Mud3JpdGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBkZXNjLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwgcHJvcGVydHksIGRlc2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xufVxuXG5mdW5jdGlvbiBfc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlciwgaXNTdHJpY3QpIHtcbiAgdmFyIHMgPSBzZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyIHx8IHRhcmdldCk7XG5cbiAgaWYgKCFzICYmIGlzU3RyaWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2V0IHByb3BlcnR5Jyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoc3RyaW5ncywgcmF3KSB7XG4gIGlmICghcmF3KSB7XG4gICAgcmF3ID0gc3RyaW5ncy5zbGljZSgwKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0cmluZ3MsIHtcbiAgICByYXc6IHtcbiAgICAgIHZhbHVlOiBPYmplY3QuZnJlZXplKHJhdylcbiAgICB9XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKHN0cmluZ3MsIHJhdykge1xuICBpZiAoIXJhdykge1xuICAgIHJhdyA9IHN0cmluZ3Muc2xpY2UoMCk7XG4gIH1cblxuICBzdHJpbmdzLnJhdyA9IHJhdztcbiAgcmV0dXJuIHN0cmluZ3M7XG59XG5cbmZ1bmN0aW9uIF90ZW1wb3JhbFJlZih2YWwsIG5hbWUpIHtcbiAgaWYgKHZhbCA9PT0gX3RlbXBvcmFsVW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG5hbWUgKyBcIiBpcyBub3QgZGVmaW5lZCAtIHRlbXBvcmFsIGRlYWQgem9uZVwiKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9yZWFkT25seUVycm9yKG5hbWUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiXFxcIlwiICsgbmFtZSArIFwiXFxcIiBpcyByZWFkLW9ubHlcIik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc05hbWVURFpFcnJvcihuYW1lKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgY2Fubm90IGJlIHJlZmVyZW5jZWQgaW4gY29tcHV0ZWQgcHJvcGVydHkga2V5cy5cIik7XG59XG5cbnZhciBfdGVtcG9yYWxVbmRlZmluZWQgPSB7fTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5TG9vc2UoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXRMb29zZShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlKGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICBfYXJyLnB1c2goX3N0ZXAudmFsdWUpO1xuXG4gICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxuZnVuY3Rpb24gX3NraXBGaXJzdEdlbmVyYXRvck5leHQoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGl0Lm5leHQoKTtcbiAgICByZXR1cm4gaXQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGtleSkge1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgIHJldHVybiBrZXk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFN0cmluZyhrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIoZGVzY3JpcHRvciwgY29udGV4dCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0RlY29yYXRpbmcgY2xhc3MgcHJvcGVydHkgZmFpbGVkLiBQbGVhc2UgZW5zdXJlIHRoYXQgJyArICdwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGlzIGVuYWJsZWQgYW5kIHNldCB0byB1c2UgbG9vc2UgbW9kZS4gJyArICdUbyB1c2UgcHJvcG9zYWwtY2xhc3MtcHJvcGVydGllcyBpbiBzcGVjIG1vZGUgd2l0aCBkZWNvcmF0b3JzLCB3YWl0IGZvciAnICsgJ3RoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgZGVjb3JhdG9ycyBpbiBzdGFnZSAyLicpO1xufVxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7XG4gIGlmICghZGVzY3JpcHRvcikgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZSxcbiAgICBjb25maWd1cmFibGU6IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlLFxuICAgIHdyaXRhYmxlOiBkZXNjcmlwdG9yLndyaXRhYmxlLFxuICAgIHZhbHVlOiBkZXNjcmlwdG9yLmluaXRpYWxpemVyID8gZGVzY3JpcHRvci5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHtcbiAgdmFyIGRlc2MgPSB7fTtcbiAgT2JqZWN0WydrZScgKyAneXMnXShkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07XG4gIH0pO1xuICBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTtcbiAgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlO1xuXG4gIGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikge1xuICAgIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICB9XG5cbiAgZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7XG4gIH0sIGRlc2MpO1xuXG4gIGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkge1xuICAgIGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwO1xuICAgIGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7XG4gICAgT2JqZWN0WydkZWZpbmUnICsgJ1Byb3BlcnR5J10odGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7XG4gICAgZGVzYyA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gZGVzYztcbn1cblxudmFyIGlkID0gMDtcblxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXkobmFtZSkge1xuICByZXR1cm4gXCJfX3ByaXZhdGVfXCIgKyBpZCsrICsgXCJfXCIgKyBuYW1lO1xufVxuXG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRMb29zZUJhc2UocmVjZWl2ZXIsIHByaXZhdGVLZXkpIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVjZWl2ZXIsIHByaXZhdGVLZXkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byB1c2UgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICByZXR1cm4gcmVjZWl2ZXI7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSIsImltcG9ydCB7XG4gIEZyb250U2lkZSxcbiAgQmFja1NpZGUsXG4gIERvdWJsZVNpZGUsXG5cbiAgU21vb3RoU2hhZGluZyxcbiAgRmxhdFNoYWRpbmcsXG5cbiAgTm9CbGVuZGluZyxcbiAgTm9ybWFsQmxlbmRpbmcsXG4gIEFkZGl0aXZlQmxlbmRpbmcsXG4gIFN1YnRyYWN0aXZlQmxlbmRpbmcsXG4gIE11bHRpcGx5QmxlbmRpbmcsXG4gIEN1c3RvbUJsZW5kaW5nLFxuXG4gIE5ldmVyRGVwdGgsXG4gIEFsd2F5c0RlcHRoLFxuICBMZXNzRGVwdGgsXG4gIExlc3NFcXVhbERlcHRoLFxuICBHcmVhdGVyRXF1YWxEZXB0aCxcbiAgR3JlYXRlckRlcHRoLFxuICBOb3RFcXVhbERlcHRoXG59IGZyb20gJ3RocmVlJztcblxuY29uc3QgYWRkaXRpb25hbCA9IHtcbiAgd2lyZWZyYW1lOiB7XG4gICAgd2lyZWZyYW1lOiAnYm9vbGVhbicsXG4gICAgd2lyZWZyYW1lTGluZWNhcDogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddLFxuICAgIHdpcmVmcmFtZUxpbmVqb2luOiBbJ3JvdW5kJywgJ2JldmVsJywgJ21pdGVyJ10sXG4gICAgd2lyZWZyYW1lTGluZXdpZHRoOiAnbnVtYmVyJ1xuICB9LFxuXG4gIHJlZnI6IHtcbiAgICByZWZsZWN0aXZpdHk6ICdudW1iZXInLFxuICAgIHJlZnJhY3Rpb25SYXRpbzogJ251bWJlcidcbiAgfSxcblxuICBtYXBzOiB7XG4gICAgbWFwOiAndGV4dHVyZScsXG4gICAgYWxwaGFNYXA6ICd0ZXh0dXJlJyxcbiAgICBlbnZNYXA6ICd0ZXh0dXJlJyxcbiAgICBsaWdodE1hcDogJ3RleHR1cmUnLFxuICAgIGxpZ2h0TWFwSW50ZW5zaXR5OiAnbnVtYmVyJ1xuICB9LFxuXG4gIG5vcm1hbDoge1xuICAgIG5vcm1hbE1hcDogJ3RleHR1cmUnLFxuICAgIG5vcm1hbFNjYWxlOiAnbnVtYmVyJ1xuICB9LFxuXG4gIGRpc3BsYWNlbWVudDoge1xuICAgIGRpc3BsYWNlbWVudFNjYWxlOiAnbnVtYmVyJyxcbiAgICBkaXNwbGFjZW1lbnRCaWFzOiAnbnVtYmVyJyxcbiAgICBkaXNwbGFjZW1lbnRNYXA6ICd0ZXh0dXJlJ1xuICB9LFxuXG4gIGVtaXNzaXZlOiB7XG4gICAgZW1pc3NpdmU6ICdjb2xvcicsXG4gICAgZW1pc3NpdmVNYXA6ICd0ZXh0dXJlJyxcbiAgICBlbWlzc2l2ZUludGVuc2l0eTogJ251bWJlcidcbiAgfSxcblxuICBzcGVjdWxhcjoge1xuICAgIHNwZWN1bGFyOiAnY29sb3InLFxuICAgIHNwZWN1bGFyTWFwOiAndGV4dHVyZSdcbiAgfSxcblxuICBhbzoge1xuICAgIGFvTWFwOiAndGV4dHVyZScsXG4gICAgYW9NYXBJbnRlbnNpdHk6ICdudW1iZXInXG4gIH1cbn1cblxuY29uc3QgYWRkID0gKG9yaWdpbiwgLi4uYWRkdikgPT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihvcmlnaW4sIC4uLmFkZHYubWFwKHZhbHVlID0+IGFkZGl0aW9uYWxbdmFsdWVdKSlcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhbnk6IGFkZCh7XG4gICAgc2lkZToge0Zyb250U2lkZSwgQmFja1NpZGUsIERvdWJsZVNpZGV9LFxuICAgIHNoYWRpbmc6IHtTbW9vdGhTaGFkaW5nLCBGbGF0U2hhZGluZ30sXG4gICAgYmxlbmRpbmc6IHtcbiAgICAgIE5vQmxlbmRpbmcsIE5vcm1hbEJsZW5kaW5nLCBBZGRpdGl2ZUJsZW5kaW5nLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBNdWx0aXBseUJsZW5kaW5nLCBDdXN0b21CbGVuZGluZ1xuICAgIH0sXG4gICAgZGVwdGhGdW5jOiB7XG4gICAgICBOZXZlckRlcHRoLCBBbHdheXNEZXB0aCwgTGVzc0RlcHRoLCBMZXNzRXF1YWxEZXB0aCwgR3JlYXRlckVxdWFsRGVwdGgsIEdyZWF0ZXJEZXB0aCwgTm90RXF1YWxEZXB0aFxuICAgIH1cbiAgfSwgJ3dpcmVmcmFtZScpLFxuXG4gIE1lc2hCYXNpY01hdGVyaWFsOiB7XG4gICAgY29sb3I6ICdjb2xvcicsXG4gICAgbGlnaHRzOiAnYm9vbGVhbicsXG4gICAgbGluZXdpZHRoOiAnbnVtYmVyJyxcbiAgICBsaW5lY2FwOiBbJ2J1dHQnLCAncm91bmQnLCAnc3F1YXJlJ10sXG4gICAgbGluZWpvaW46IFsncm91bmQnLCAnYmV2ZWwnLCAnbWl0ZXInXVxuICB9LFxuXG4gIE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IGFkZCh7XG4gICAgY29sb3I6ICdjb2xvcicsXG4gICAgc2tpbm5pbmc6ICdib29sZWFuJyxcbiAgICBtb3JwaFRhcmdldHM6ICdib29sZWFuJyxcbiAgICBtb3JwaE5vcm1hbHM6ICdib29sZWFuJ1xuICB9LCAnZW1pc3NpdmUnLCAncmVmcicsICdtYXBzJywgJ25vcm1hbCcsICdzcGVjdWxhcicsICdhbycpLFxuXG4gIE1lc2hQaG9uZ01hdGVyaWFsOiBhZGQoe1xuICAgIGNvbG9yOiAnY29sb3InLFxuICAgIHNraW5uaW5nOiAnYm9vbGVhbicsXG4gICAgbW9ycGhUYXJnZXRzOiAnYm9vbGVhbicsXG4gICAgbW9ycGhOb3JtYWxzOiAnYm9vbGVhbidcbiAgfSwgJ2Rpc3BsYWNlbWVudCcsICdlbWlzc2l2ZScsICdtYXBzJywgJ3JlZnInLCAnc3BlY3VsYXInLCAnYW8nKSxcblxuICBNZXNoRGVwdGhNYXRlcmlhbDoge1xuXG4gIH1cbiAgLy8gVG8gYmUgY29udGludWVkLi4uXG59XG4iLCJleHBvcnQgY2xhc3MgRGF0QVBJIHtcbiAgZm9sZE9iamVjdChvYmplY3QsIG9yaWdpbiwgaW5zdGFuY2UgPSB0aGlzLmZvbGQsIG9uQ2hhbmdlID0gKCkgPT4ge30pIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gb3JpZ2luKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgIGlmICh2YWx1ZS5pc0NvbG9yKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sb3Iob2JqZWN0LCBrZXksIGluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9yaWdpbltrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAob2JqZWN0W2tleV0gPT09IG9iamVjdCkgY29udGludWU7XG4gICAgICAgIHRoaXMuZm9sZE9iamVjdChvYmplY3Rba2V5XSwgb3JpZ2luW2tleV0sIGluc3RhbmNlLmFkZEZvbGRlcihrZXkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxldCByYW5nZSA9ICcxJyArICcwJy5yZXBlYXQodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgpO1xuICAgICAgICAvLyBpZiAodmFsdWUudG9TdHJpbmcoKS5pbmRleE9mKCcuJykgIT09IC0xKSByYW5nZSA9IDE7XG5cbiAgICAgICAgaW5zdGFuY2UuYWRkKG9iamVjdCwga2V5KVxuICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAuc3RlcCgwLjAwMSlcbiAgICAgICAgICAub25DaGFuZ2Uob25DaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGd1aVRyYW5zZm9ybXMobmF0aXZlLCBpbnN0YW5jZSA9IHRoaXMuZm9sZCkge1xuICAgIGlmICghdGhpcy5wYXJhbXMudHJhbnNmb3JtcykgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IGluc3RhbmNlLmFkZEZvbGRlcigndHJhbnNmb3JtcycpO1xuXG4gICAgLy8gcG9zaXRpb25cbiAgICBjb25zdCBwb3NpdGlvbiA9IGNvbnRyb2xsZXIuYWRkRm9sZGVyKCdwb3NpdGlvbicpO1xuICAgIHBvc2l0aW9uLmFkZChuYXRpdmUucG9zaXRpb24sICd4Jyk7XG4gICAgcG9zaXRpb24uYWRkKG5hdGl2ZS5wb3NpdGlvbiwgJ3knKTtcbiAgICBwb3NpdGlvbi5hZGQobmF0aXZlLnBvc2l0aW9uLCAneicpO1xuXG4gICAgLy8gcm90YXRpb25cbiAgICBjb25zdCByb3RhdGlvbiA9IGNvbnRyb2xsZXIuYWRkRm9sZGVyKCdyb3RhdGlvbicpO1xuICAgIHJvdGF0aW9uLmFkZChuYXRpdmUucm90YXRpb24sICd4Jykuc3RlcCgwLjEpO1xuICAgIHJvdGF0aW9uLmFkZChuYXRpdmUucm90YXRpb24sICd5Jykuc3RlcCgwLjEpO1xuICAgIHJvdGF0aW9uLmFkZChuYXRpdmUucm90YXRpb24sICd6Jykuc3RlcCgwLjEpO1xuXG4gICAgLy8gc2NhbGVcbiAgICBpZiAoIW5hdGl2ZS5zY2FsZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNjYWxlID0gY29udHJvbGxlci5hZGRGb2xkZXIoJ3NjYWxlJyk7XG4gICAgc2NhbGUuYWRkKG5hdGl2ZS5zY2FsZSwgJ3gnKS5zdGVwKDAuMSk7XG4gICAgc2NhbGUuYWRkKG5hdGl2ZS5zY2FsZSwgJ3knKS5zdGVwKDAuMSk7XG4gICAgc2NhbGUuYWRkKG5hdGl2ZS5zY2FsZSwgJ3onKS5zdGVwKDAuMSk7XG4gIH1cbn1cbiIsImltcG9ydCBtYXRlcmlhbHMgZnJvbSAnLi9tYXRlcmlhbHMnO1xuaW1wb3J0IHtEYXRBUEl9IGZyb20gJy4vRGF0QVBJJztcblxuZXhwb3J0IGNsYXNzIERhdE1lc2hNb2R1bGUgZXh0ZW5kcyBEYXRBUEkge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSwgZ3VpKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBuYW1lOiAnVW5rbm93biBtZXNoJyxcbiAgICAgIGdlb21ldHJ5OiB0cnVlLFxuICAgICAgbWF0ZXJpYWw6IHRydWUsXG4gICAgICB0cmFuc2Zvcm1zOiB0cnVlLFxuICAgICAgZ3VpOiBmYWxzZVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLmd1aSA9IGd1aTtcbiAgICB0aGlzLmZvbGQgPSB0aGlzLmd1aS5hZGRGb2xkZXIodGhpcy5wYXJhbXMubmFtZSk7XG4gICAgdGhpcy5jdXN0b21NYXRlcmlhbHMgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZENvbG9yKG9iamVjdCwgcHJvcGVydHksIGluc3RhbmNlID0gdGhpcy5mb2xkKSB7XG4gICAgY29uc3QgY29sb3IgPSBvYmplY3RbcHJvcGVydHldO1xuXG4gICAgaW5zdGFuY2UuYWRkQ29sb3Ioe1twcm9wZXJ0eV06IGNvbG9yLmdldEhleCgpfSwgcHJvcGVydHkpLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB2YWx1ZS5yZXBsYWNlKCcjJywgJzB4Jyk7XG4gICAgICBjb2xvci5zZXRIZXgodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZ3VpTWF0ZXJpYWwoY29tcG9uZW50LCBtYXRlcmlhbCwgaW5zdGFuY2UgPSB0aGlzLmZvbGQpIHtcbiAgICBjb25zdCBwYXJhbXNQcm9jZXNzb3IgPSBwYXJhbXMgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXNba2V5XSAmJiBtYXRlcmlhbFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzd2l0Y2ggKHBhcmFtc1trZXldKSB7XG4gICAgICAgICAgICBjYXNlICdjb2xvcic6XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ29sb3IobWF0ZXJpYWwsIGtleSwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICBpbnN0YW5jZS5hZGQobWF0ZXJpYWwsIGtleSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgaW5zdGFuY2UuYWRkKG1hdGVyaWFsLCBrZXkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RleHR1cmUnOlxuICAgICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaW5zdGFuY2UuYWRkKG1hdGVyaWFsLCBrZXksIHBhcmFtc1trZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGFyYW1zUHJvY2Vzc29yKG1hdGVyaWFsc1ttYXRlcmlhbC50eXBlXSk7XG4gICAgcGFyYW1zUHJvY2Vzc29yKG1hdGVyaWFscy5hbnkpO1xuICB9XG5cbiAgZ3VpR2VvbWV0cnkoY29tcG9uZW50LCBpbnN0YW5jZSA9IHRoaXMuZm9sZCkge1xuICAgIGlmICghY29tcG9uZW50LmdfKSB0aHJvdyBuZXcgRXJyb3IoJ0RhdEdVSU1vZHVsZSByZXF1aXJlcyBXSFMuRHluYW1pY0dlb21ldHJ5TW9kdWxlIGZvciBnZW9tZXRyeSB1cGRhdGVzLicpO1xuXG4gICAgY29uc3QgZ2VvbVBhcmFtcyA9IGNvbXBvbmVudC5wYXJhbXMuZ2VvbWV0cnk7XG4gICAgY29uc3QgZ2VvbURhdGEgPSB0aGlzLnBhcmFtcy5nZW9tZXRyeTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGdlb21QYXJhbXMpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZW9tRGF0YVtrZXldO1xuXG4gICAgICBjb25zdCByYW5nZSA9IGRhdGEgJiYgZGF0YS5yYW5nZSA/IGRhdGEucmFuZ2UgOiBbMCwgMTAwXTtcblxuICAgICAgaW5zdGFuY2UuYWRkKGdlb21QYXJhbXMsIGtleSlcbiAgICAgICAgLm1pbihyYW5nZVswXSlcbiAgICAgICAgLm1heChyYW5nZVsxXSlcbiAgICAgICAgLnN0ZXAoa2V5LmluZGV4T2YoJ1NlZ21lbnRzJykgPiAwID8gMSA6IDAuMSlcbiAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZ18oe1trZXldOiB2YWx1ZX0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBtYXRlcmlhbHMobWF0ZXJpYWxzID0ge30pIHtcbiAgICB0aGlzLmN1c3RvbU1hdGVyaWFscyA9IG1hdGVyaWFscztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIG1hdGVyaWFsKG1hdGVyaWFsLCBzZWxmKSB7XG4gICAgICBpZiAoIXNlbGYucGFyYW1zLm1hdGVyaWFsKSByZXR1cm4gbWF0ZXJpYWw7XG5cbiAgICAgIGNvbnN0IGZvbGRlciA9IHNlbGYuZm9sZC5hZGRGb2xkZXIoJ21hdGVyaWFsJyk7XG4gICAgICBzZWxmLmd1aU1hdGVyaWFsKHRoaXMsIG1hdGVyaWFsLCBmb2xkZXIpO1xuXG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfSxcblxuICAgIGdlb21ldHJ5KGdlb21ldHJ5LCBzZWxmKSB7XG4gICAgICBpZiAoIXNlbGYucGFyYW1zLmdlb21ldHJ5KSByZXR1cm4gZ2VvbWV0cnk7XG4gICAgICBpZiAoIXRoaXMuZ18pIHRocm93IG5ldyBFcnJvcignV0hTLkR5bmFtaWNHZW9tZXRyeU1vZHVsZSBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbXBvbmVudCAoYmVmb3JlIGd1aSknKTtcblxuICAgICAgY29uc3QgZm9sZGVyID0gc2VsZi5mb2xkLmFkZEZvbGRlcignZ2VvbWV0cnknKTtcbiAgICAgIHNlbGYuZ3VpR2VvbWV0cnkodGhpcywgZm9sZGVyKTtcblxuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH0sXG5cbiAgICBtZXNoKG1lc2gsIHNlbGYpIHtcbiAgICAgIGlmICghc2VsZi5jdXN0b21NYXRlcmlhbHMpIHJldHVybiBtZXNoO1xuXG4gICAgICBzZWxmLmN1c3RvbU1hdGVyaWFscy5jdXJyZW50ID0gbWVzaC5tYXRlcmlhbDtcblxuICAgICAgLy8gY29uc3QgbWF0QWxpYXMgPSB7bWF0ZXJpYWw6ICdjdXJyZW50J307XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc2VsZi5jdXN0b21NYXRlcmlhbHMpO1xuICAgICAgY29uc3QgZm9sZGVyID0gc2VsZi5mb2xkO1xuXG4gICAgICBmb2xkZXIuYWRkKHt0eXBlOiAnY3VycmVudCd9LCAndHlwZScsIGtleXMpLm9uQ2hhbmdlKHYgPT4ge1xuICAgICAgICBtZXNoLm1hdGVyaWFsID0gc2VsZi5jdXN0b21NYXRlcmlhbHNbdl07XG4gICAgICAgIGZvbGRlci5yZW1vdmVGb2xkZXIoJ21hdGVyaWFsJyk7XG4gICAgICAgIHNlbGYuZ3VpTWF0ZXJpYWwodGhpcywgbWVzaC5tYXRlcmlhbCwgZm9sZGVyLmFkZEZvbGRlcignbWF0ZXJpYWwnKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG1lc2g7XG4gICAgfSxcblxuICAgIG9uV3JhcChhLCBzZWxmKSB7XG4gICAgICBzZWxmLmd1aVRyYW5zZm9ybXModGhpcy5uYXRpdmUsIHNlbGYuZm9sZCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge0RhdEFQSX0gZnJvbSAnLi9EYXRBUEknO1xuXG5leHBvcnQgY2xhc3MgRGF0TGlnaHRNb2R1bGUgZXh0ZW5kcyBEYXRBUEkge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSwgZ3VpKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBuYW1lOiAnVW5rbm93biBsaWdodCcsXG4gICAgICBsaWdodDogdHJ1ZSxcbiAgICAgIHNoYWRvdzogdHJ1ZSxcbiAgICAgIHRyYW5zZm9ybXM6IHRydWUsXG4gICAgICBndWk6IGZhbHNlXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuZ3VpID0gZ3VpO1xuICAgIHRoaXMuZm9sZCA9IHRoaXMuZ3VpLmFkZEZvbGRlcih0aGlzLnBhcmFtcy5uYW1lKTtcbiAgfVxuXG4gIGFkZENvbG9yKG9iamVjdCwgcHJvcGVydHksIGluc3RhbmNlID0gdGhpcy5mb2xkKSB7XG4gICAgY29uc3QgY29sb3IgPSBvYmplY3RbcHJvcGVydHldO1xuXG4gICAgaW5zdGFuY2UuYWRkQ29sb3Ioe1twcm9wZXJ0eV06IGNvbG9yLmdldEhleCgpfSwgcHJvcGVydHkpLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB2YWx1ZS5yZXBsYWNlKCcjJywgJzB4Jyk7XG4gICAgICBjb2xvci5zZXRIZXgodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIGxpZ2h0KGxpZ2h0LCBzZWxmKSB7XG4gICAgICBpZiAoIXNlbGYucGFyYW1zLmxpZ2h0KSByZXR1cm4gbGlnaHQ7XG5cbiAgICAgIGNvbnN0IGxpZ2h0UGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMpO1xuICAgICAgZGVsZXRlIGxpZ2h0UGFyYW1zLnBvc2l0aW9uO1xuICAgICAgZGVsZXRlIGxpZ2h0UGFyYW1zLnJvdGF0aW9uO1xuICAgICAgZGVsZXRlIGxpZ2h0UGFyYW1zLnNoYWRvdztcblxuICAgICAgc2VsZi5mb2xkT2JqZWN0KGxpZ2h0LCBsaWdodFBhcmFtcywgc2VsZi5mb2xkLmFkZEZvbGRlcignbGlnaHQnKSk7XG5cbiAgICAgIGlmIChsaWdodC5zaGFkb3cpIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Rm9sZGVyID0gc2VsZi5mb2xkLmFkZEZvbGRlcignc2hhZG93Jyk7XG4gICAgICAgIHNlbGYuZm9sZE9iamVjdChsaWdodC5zaGFkb3csIHRoaXMucGFyYW1zLnNoYWRvdywgc2hhZG93Rm9sZGVyKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhsaWdodCk7XG5cbiAgICAgICAgc2hhZG93Rm9sZGVyLmFkZChsaWdodCwgJ2Nhc3RTaGFkb3cnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpZ2h0O1xuICAgIH0sXG5cbiAgICBvbldyYXAoYSwgc2VsZikge1xuICAgICAgc2VsZi5ndWlUcmFuc2Zvcm1zKHRoaXMubmF0aXZlLCBzZWxmLmZvbGQpO1xuICAgIH1cbiAgfVxufTtcbiIsImltcG9ydCB7RGF0QVBJfSBmcm9tICcuL0RhdEFQSSc7XG5cbmV4cG9ydCBjbGFzcyBEYXRDYW1lcmFNb2R1bGUgZXh0ZW5kcyBEYXRBUEkge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSwgZ3VpKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBuYW1lOiAnVW5rbm93biBjYW1lcmEnLFxuICAgICAgdHJhbnNmb3JtczogdHJ1ZSxcbiAgICAgIGNhbWVyYTogdHJ1ZVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICB0aGlzLmd1aSA9IGd1aTtcbiAgICB0aGlzLmZvbGQgPSB0aGlzLmd1aS5hZGRGb2xkZXIodGhpcy5wYXJhbXMubmFtZSk7XG4gIH1cblxuICBicmlkZ2UgPSB7XG4gICAgY2FtZXJhKGNhbWVyYSwgc2VsZikge1xuICAgICAgaWYgKCFzZWxmLnBhcmFtcy5jYW1lcmEpIHJldHVybiBjYW1lcmE7XG4gICAgICBzZWxmLmZvbGRPYmplY3QoY2FtZXJhLCB0aGlzLnBhcmFtcywgc2VsZi5mb2xkLCAoKSA9PiB7XG4gICAgICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNhbWVyYTtcbiAgICB9LFxuXG4gICAgb25XcmFwKGEsIHNlbGYpIHtcbiAgICAgIHNlbGYuZ3VpVHJhbnNmb3Jtcyh0aGlzLm5hdGl2ZSwgc2VsZi5mb2xkKTtcbiAgICB9XG4gIH1cbn07XG4iLCJleHBvcnQgY2xhc3MgRGF0Q3VzdG9tTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMgPSBbXSwgZ3VpKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZ3VpID0gZ3VpO1xuXG4gICAgcHJvcHMuZm9yRWFjaCh0aGlzLmFkZC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZCh7XG4gICAgbmFtZSxcbiAgICB2YWx1ZSxcbiAgICByYW5nZSA9IFtmYWxzZSwgZmFsc2VdLFxuICAgIHN0ZXAgPSAxLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uRmluaXNoQ2hhbmdlLFxuICAgIGxpc3RlbiA9IGZhbHNlXG4gIH0pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5ndWkuYWRkKHtbbmFtZV06IHZhbHVlfSwgbmFtZSwgcmFuZ2VbMF0gfHwgMCwgcmFuZ2VbMV0gfHwgMSk7XG5cbiAgICBjb250cm9sbGVyLm9uQ2hhbmdlKG9uQ2hhbmdlKTtcbiAgICBpZiAob25GaW5pc2hDaGFuZ2UpIGNvbnRyb2xsZXIub25GaW5pc2hDaGFuZ2Uob25GaW5pc2hDaGFuZ2UpO1xuICAgIGlmIChsaXN0ZW4pIGNvbnRyb2xsZXIubGlzdGVuKCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgfVxufTtcbiIsImltcG9ydCBkYXQgZnJvbSAnZGF0LWd1aSc7XG5cbmltcG9ydCB7RGF0TWVzaE1vZHVsZX0gZnJvbSAnLi9kYXRndWkvRGF0TWVzaE1vZHVsZSc7XG5pbXBvcnQge0RhdExpZ2h0TW9kdWxlfSBmcm9tICcuL2RhdGd1aS9EYXRMaWdodE1vZHVsZSc7XG5pbXBvcnQge0RhdENhbWVyYU1vZHVsZX0gZnJvbSAnLi9kYXRndWkvRGF0Q2FtZXJhTW9kdWxlJztcbmltcG9ydCB7RGF0Q3VzdG9tTW9kdWxlfSBmcm9tICcuL2RhdGd1aS9EYXRDdXN0b21Nb2R1bGUnO1xuXG4vLyBQb2x5ZmlsbFxuZGF0LkdVSS5wcm90b3R5cGUucmVtb3ZlRm9sZGVyID0gZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZm9sZGVyID0gdGhpcy5fX2ZvbGRlcnNbbmFtZV07XG4gIGlmICghZm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvbGRlci5jbG9zZSgpO1xuICB0aGlzLl9fdWwucmVtb3ZlQ2hpbGQoZm9sZGVyLmRvbUVsZW1lbnQucGFyZW50Tm9kZSk7XG4gIGRlbGV0ZSB0aGlzLl9fZm9sZGVyc1tuYW1lXTtcbiAgdGhpcy5vblJlc2l6ZSgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRHVUlNb2R1bGUge1xuICBzdGF0aWMgbmV3KHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgRGF0R1VJTW9kdWxlKG5ldyBkYXQuR1VJKHBhcmFtcykpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZ3VpID0gbmV3IGRhdC5HVUkoe2F1dG9QbGFjZTogZmFsc2V9KSkge1xuICAgIHRoaXMuZ3VpID0gZ3VpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ2d1aS9kYXQuZ3VpJyk7XG4gICAgY29uc3QgZG9tID0gdGhpcy5ndWkuZG9tRWxlbWVudDtcbiAgICBjb25zdCBzdHlsZSA9IGRvbS5zdHlsZTtcblxuICAgIHN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBzdHlsZS50b3AgPSAwO1xuICAgIHN0eWxlLnJpZ2h0ID0gJzIwcHgnO1xuXG4gICAgbWFuYWdlci5nZXQoJ2VsZW1lbnQnKS5hcHBlbmRDaGlsZCh0aGlzLmd1aS5kb21FbGVtZW50KTtcbiAgfVxuXG4gIHNldChndWkpIHtcbiAgICB0aGlzLmd1aSA9IGd1aTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvbGRlcihuYW1lID0gJ2ZvbGRlcicpIHtcbiAgICByZXR1cm4gbmV3IERhdEdVSU1vZHVsZSh0aGlzLmd1aS5hZGRGb2xkZXIobmFtZSkpO1xuICB9XG5cbiAgTWVzaChwYXJhbXMgPSB7fSwgZ3VpID0gdGhpcy5ndWkpIHtcbiAgICByZXR1cm4gbmV3IERhdE1lc2hNb2R1bGUocGFyYW1zLCBndWkpO1xuICB9XG5cbiAgTGlnaHQocGFyYW1zID0ge30sIGd1aSA9IHRoaXMuZ3VpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRMaWdodE1vZHVsZShwYXJhbXMsIGd1aSk7XG4gIH1cblxuICBDYW1lcmEocGFyYW1zID0ge30sIGd1aSA9IHRoaXMuZ3VpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRDYW1lcmFNb2R1bGUocGFyYW1zLCBndWkpO1xuICB9XG5cbiAgQ3VzdG9tKHBhcmFtcyA9IHt9LCBndWkgPSB0aGlzLmd1aSkge1xuICAgIHJldHVybiBuZXcgRGF0Q3VzdG9tTW9kdWxlKHBhcmFtcywgZ3VpKTtcbiAgfVxufVxuXG5EYXRHVUlNb2R1bGUuZGF0ID0gZGF0O1xuIl0sIm5hbWVzIjpbInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQxIiwiYWRkaXRpb25hbCIsIndpcmVmcmFtZSIsIndpcmVmcmFtZUxpbmVjYXAiLCJ3aXJlZnJhbWVMaW5lam9pbiIsIndpcmVmcmFtZUxpbmV3aWR0aCIsInJlZnIiLCJyZWZsZWN0aXZpdHkiLCJyZWZyYWN0aW9uUmF0aW8iLCJtYXBzIiwibWFwIiwiYWxwaGFNYXAiLCJlbnZNYXAiLCJsaWdodE1hcCIsImxpZ2h0TWFwSW50ZW5zaXR5Iiwibm9ybWFsIiwibm9ybWFsTWFwIiwibm9ybWFsU2NhbGUiLCJkaXNwbGFjZW1lbnQiLCJkaXNwbGFjZW1lbnRTY2FsZSIsImRpc3BsYWNlbWVudEJpYXMiLCJkaXNwbGFjZW1lbnRNYXAiLCJlbWlzc2l2ZSIsImVtaXNzaXZlTWFwIiwiZW1pc3NpdmVJbnRlbnNpdHkiLCJzcGVjdWxhciIsInNwZWN1bGFyTWFwIiwiYW8iLCJhb01hcCIsImFvTWFwSW50ZW5zaXR5IiwiYWRkIiwib3JpZ2luIiwiYWRkdiIsIk9iamVjdCIsImFzc2lnbiIsInZhbHVlIiwiYW55Iiwic2lkZSIsIkZyb250U2lkZSIsIkJhY2tTaWRlIiwiRG91YmxlU2lkZSIsInNoYWRpbmciLCJTbW9vdGhTaGFkaW5nIiwiRmxhdFNoYWRpbmciLCJibGVuZGluZyIsIk5vQmxlbmRpbmciLCJOb3JtYWxCbGVuZGluZyIsIkFkZGl0aXZlQmxlbmRpbmciLCJTdWJ0cmFjdGl2ZUJsZW5kaW5nIiwiTXVsdGlwbHlCbGVuZGluZyIsIkN1c3RvbUJsZW5kaW5nIiwiZGVwdGhGdW5jIiwiTmV2ZXJEZXB0aCIsIkFsd2F5c0RlcHRoIiwiTGVzc0RlcHRoIiwiTGVzc0VxdWFsRGVwdGgiLCJHcmVhdGVyRXF1YWxEZXB0aCIsIkdyZWF0ZXJEZXB0aCIsIk5vdEVxdWFsRGVwdGgiLCJNZXNoQmFzaWNNYXRlcmlhbCIsImNvbG9yIiwibGlnaHRzIiwibGluZXdpZHRoIiwibGluZWNhcCIsImxpbmVqb2luIiwiTWVzaExhbWJlcnRNYXRlcmlhbCIsInNraW5uaW5nIiwibW9ycGhUYXJnZXRzIiwibW9ycGhOb3JtYWxzIiwiTWVzaFBob25nTWF0ZXJpYWwiLCJNZXNoRGVwdGhNYXRlcmlhbCIsIkRhdEFQSSIsIm9iamVjdCIsImluc3RhbmNlIiwiZm9sZCIsIm9uQ2hhbmdlIiwia2V5IiwiaXNDb2xvciIsImFkZENvbG9yIiwicm9sbHVwUGx1Z2luQmFiZWxIZWxwZXJzLnR5cGVvZiIsImZvbGRPYmplY3QiLCJhZGRGb2xkZXIiLCJtaW4iLCJzdGVwIiwibmF0aXZlIiwicGFyYW1zIiwidHJhbnNmb3JtcyIsImNvbnRyb2xsZXIiLCJwb3NpdGlvbiIsInJvdGF0aW9uIiwic2NhbGUiLCJEYXRNZXNoTW9kdWxlIiwiZ3VpIiwibWF0ZXJpYWwiLCJzZWxmIiwiZm9sZGVyIiwiZ3VpTWF0ZXJpYWwiLCJnZW9tZXRyeSIsImdfIiwiRXJyb3IiLCJndWlHZW9tZXRyeSIsIm1lc2giLCJjdXN0b21NYXRlcmlhbHMiLCJjdXJyZW50Iiwia2V5cyIsInR5cGUiLCJ2IiwicmVtb3ZlRm9sZGVyIiwib25XcmFwIiwiYSIsImd1aVRyYW5zZm9ybXMiLCJuYW1lIiwicHJvcGVydHkiLCJnZXRIZXgiLCJyZXBsYWNlIiwic2V0SGV4IiwiY29tcG9uZW50IiwicGFyYW1zUHJvY2Vzc29yIiwidW5kZWZpbmVkIiwibWF0ZXJpYWxzIiwiZ2VvbVBhcmFtcyIsImdlb21EYXRhIiwiZGF0YSIsInJhbmdlIiwibWF4IiwiaW5kZXhPZiIsIkRhdExpZ2h0TW9kdWxlIiwibGlnaHQiLCJsaWdodFBhcmFtcyIsInNoYWRvdyIsInNoYWRvd0ZvbGRlciIsImNvbnNvbGUiLCJsb2ciLCJEYXRDYW1lcmFNb2R1bGUiLCJjYW1lcmEiLCJ1cGRhdGVQcm9qZWN0aW9uTWF0cml4IiwiRGF0Q3VzdG9tTW9kdWxlIiwicHJvcHMiLCJmb3JFYWNoIiwiYmluZCIsIm9uRmluaXNoQ2hhbmdlIiwibGlzdGVuIiwiZGF0IiwiR1VJIiwicHJvdG90eXBlIiwiX19mb2xkZXJzIiwiY2xvc2UiLCJfX3VsIiwicmVtb3ZlQ2hpbGQiLCJkb21FbGVtZW50IiwicGFyZW50Tm9kZSIsIm9uUmVzaXplIiwiRGF0R1VJTW9kdWxlIiwiYXV0b1BsYWNlIiwibWFuYWdlciIsImRlZmluZSIsImRvbSIsInN0eWxlIiwidG9wIiwicmlnaHQiLCJnZXQiLCJhcHBlbmRDaGlsZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0NBQUE7Ozs7Ozs7Ozs7Ozs7O0NBY0EsSUFBSSxHQUFHLEdBQUcsY0FBYyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7OztDQUdyQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDOzs7Q0FHeEIsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQzs7O0NBRzVCLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7OztDQUd4QyxHQUFHLENBQUMsR0FB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RUEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFNUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFL0IsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUV0QyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQztDQUMzQixFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQzs7Q0FFM0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUV4QyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQztDQUMzQixFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQzs7Q0FFM0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxFQUFFOztDQUVGOztDQUVBLENBQUMsT0FBTyxFQUFFLFdBQVcsR0FBRyxFQUFFLElBQUksR0FBRzs7Q0FFakMsRUFBRSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FB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RyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7O0NBRTdCLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7O0NBRXRDLEVBQUUsT0FBTyxNQUFNLENBQUM7O0NBRWhCLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7O0NBRTVDLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUc7O0NBRTlCLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxPQUFPOztDQUUzQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXhCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFOUIsR0FBRyxTQUFTLElBQUksQ0FBQyxLQUFLOztDQUV0QixJQUFJLEtBQUssY0FBYzs7Q0FFdkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdEMsS0FBSyxNQUFNOztDQUVYLElBQUksS0FBSyxtQkFBbUI7O0NBRTVCLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzdCLEtBQUssTUFBTTs7Q0FFWCxJQUFJLEtBQUssc0JBQXNCOztDQUUvQixLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0NBRXJELE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUV0QyxNQUFNLE1BQU07O0NBRVosTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXZDLE1BQU07Q0FDTixLQUFLLE1BQU07O0NBRVgsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFOUIsR0FBRyxTQUFTLElBQUksQ0FBQyxLQUFLOztDQUV0QixJQUFJLEtBQUssY0FBYzs7Q0FFdkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdEMsS0FBSyxNQUFNOztDQUVYLElBQUksS0FBSyxtQkFBbUI7O0NBRTVCLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzdCLEtBQUssTUFBTTs7Q0FFWCxJQUFJLEtBQUssc0JBQXNCOztDQUUvQixLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0NBRXJELE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMs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LEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVE7Q0FDMUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUU7Q0FDNUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUU7Q0FDNUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHOztDQUV6RDs7Q0FFQSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLElBQUksT0FBTyxJQUFJLENBQUM7O0NBRWhCLElBQUk7O0NBRUo7O0NBRUEsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkIsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0NBQzVCLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUM1QixHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzlCLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztDQUM5QixHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0NBRTlCLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHOztDQUVyQzs7Q0FFQSxJQUFJLEtBQUssRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFeEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ1gsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDO0NBQ3JCLEtBQUssQ0FBQyxHQUFHLFdBQVcsQ0FBQzs7Q0FFckIsS0FBSyxNQUFNOztDQUVYLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNoQixLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVoQixLQUFLOztDQUVMLElBQUksTUFBTSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUc7O0NBRXpCOztDQUVBLElBQUksS0FBSyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUV4QixLQUFLLENBQUMsR0FBRyxXQUFXLENBQUM7Q0FDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ1gsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDOztDQUVyQixLQUFLLE1BQU07O0NBRVgsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QixLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWhCLEtBQUs7O0NBRUwsSUFBSSxNQUFNOztDQUVWOztDQUVBLElBQUksS0FBSyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUV4QixLQUFLLENBQUMsR0FBRyxXQUFXLENBQUM7Q0FDckIsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDO0NBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFWCxLQUFLLE1BQU07O0NBRVgsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QixLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWhCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTlCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUU7Q0FDbEQscUJBQXFCLEVBQUUsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFO0NBQ2xELHFCQUFxQixFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRXJELEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQztDQUNBOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVwRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUU5Qjs7Q0FFQSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFeEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFlBQVk7O0NBRTFCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMxQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEVBQUUsT0FBTyxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUVoRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDN0MsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU3QyxHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRWpDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7Q0FFbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUvQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFD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RyxFQUFFLENBQUM7O0NBRXhDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRWxDLElBQUk7O0NBRUosR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUV0QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDM0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztDQUMzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7O0NBRTNCO0NBQ0EsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUV0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUVaLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDeEIsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLEVB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QUcsQ0FBQyxFQUFFLENBQUM7Q0FDeEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4QixFQUFFLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFekIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpDLEdBQUcsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpDLEdBQUcsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssTUFBTSxLQUFLLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxHQUFHOztDQUU1Qzs7Q0FFQTs7Q0FFQSxFQUFFLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXZELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN2QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDdkIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVsQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFdkM7O0NBRUE7O0NBRUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUTs7Q0FFckIsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7Q0FDOUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7Q0FDOUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7O0NBRS9DLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztDQUMxQixHQUFHLENBQUMsQ0FBQzs7Q0FFTCxFQUFFLEtBQUssS0FBSyxHQUFHLENBQUMsR0FBRzs7Q0FFbkIsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUV0QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUN0QixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztDQUMvQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztDQUMvQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQzs7Q0FFL0IsR0FBRyxNQUFNLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHOztDQUV2QyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDdEIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEdBQUcsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUc7O0NBRTFCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdB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QUM1SCxHQUFHLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRXhDOztDQUVBLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNyRCxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXJELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FB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Q0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQzNELEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFLEdBQUcsWUFBWTtDQUMvRCxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxZQUFZLENBQUM7O0NBRXJELEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7Q0FDOUMsRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztDQUM5QyxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0NBQzlDLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0NBRTFCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLFVBQVUsR0FBRzs7Q0FFakMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxSSxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcs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LEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDM0QsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUMzRCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0QsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWpDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUN6QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRTdDOztDQUVBLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDckMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNyQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFdEM7O0NBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7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QUFDLFlBQVksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztDQUUzQyxFQUFFOztDQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFOUI7O0NBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXhELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDMUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sU0FBUyxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFaEQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDckMsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXJDLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRXBDLEVBQUUs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LENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUM5RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDOUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQy9ELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFL0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsUUFBUSxFQUFFLFlBQVk7O0NBRXZCLEVBQUUsSUFBSSxDQUFDLEdBQUc7O0NBRVYsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUViLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFdEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7Q0FFdEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM3RSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDakYsRUFBRSxFQUFFLEVB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SyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUUvQixHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3JCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXJCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRW5CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs7Q0FFakIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3JCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2YsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Q0FDakIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3JCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUUxQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQ2pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRW5CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUg7Q0FDQSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWY7Q0FDQSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWYsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsMEJBQTBCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTVDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzdDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN6QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFNUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztDQUM1QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXBCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztDQUM1QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFB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QUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbkUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztDQUVyQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLHNCQUFzQixFQUFFLFNBQVMsR0FBRzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV2RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUk7O0NBRUosR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEIsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRTtDQUNBOztDQUVBLEVBQUU7Q0FDRixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7O0NBRUosSUFBSTs7Q0FFSixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksR0FBRyxDQUFDOztDQUVWLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVsRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFdEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVqQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsaUJBQWlCLEdBQUc7O0NBRS9DO0NBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUTtDQUN4QixHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUTs7Q0FFbEIsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM3RCxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzdELEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDL0QsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTs7Q0FFakUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ2xILEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztDQUNsSCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Q0FDbEgsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRW5ILEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUc7O0NBRW5CLEdBQUcsSUFBSSxHQUFHLEdBQUcsbUVBQW1FLENBQUM7O0NBRWpGLEdBQUcsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEdBQUc7O0NBRXJDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxNQUFNOztDQUVWLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEIsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFdkIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUMxQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUM1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Q0FFNUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsWUFBWTs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNFLEVBQUUsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0UsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVB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QUU3QixFQUFFLE9BQU8sU0FBUyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0NBRTNELEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTlEO0NBQ0EsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU1QixHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekI7Q0FDQSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN0QixHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdEIsR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV0QixHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7Q0FFakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7O0NBRWpDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDOztDQUVsQyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNoQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ2hCLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWhCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGVBQWUsRUFBRSxXQUFXLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHOztDQUVuRSxFQUFFLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7Q0FFM0IsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0NBRTFILEdBQUc7O0NBRUgsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7Q0FDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0NBQzlDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztDQUM5QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDdEQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3RELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN2RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFekQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7Q0FFcEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUUvQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQzs7Q0FFN0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQzVELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUMvRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXZELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Q0FDeEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFF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Q0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDM0M7Q0FDQSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3hELE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEQsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDOztDQUUxRCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFakMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQzlCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVy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LENBQUM7Q0FDL0MsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDOztDQUUvQyxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQ2hFLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTs7Q0FFaEU7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXhELENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXhELENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXhELENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJFLENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJFLENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXRFLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXhDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU07Q0FDakIsRUFBRSxLQUFLLEdBQUcsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRW5DLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEMsRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTlELEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsR0FBRzs7Q0FFeEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTTtDQUNqQixFQUFFLEtBQUssR0FBRyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV2QyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbkMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUVsQyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLGdCQUFnQixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVwRSxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxrQkFBa0IsRUFBRSxJQUFJLEdBQUc7O0NBRXBDLENBQUMsU0FBUyxJQUFJOztDQUVkLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDOztDQUVsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUMvQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDL0MsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQy9DLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQzs7Q0FFL0MsRUFBRTs7Q0FFRixDQUFDOztDQUVEOztDQUVBLFNBQVMsYUFBYSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxHQUFHOztDQUUvQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ2QsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztDQUNsQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUV0RDs7Q0FFQSxDQUFDOztDQUVELFNBQVMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEdBQUc7O0NBRWxELENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ2xCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0NBQzdCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRXZEOztDQUVBLENBQUM7O0NBRUQsU0FBUyxpQkFBaUIsRUFBRSxFQUFFLEdBQUc7O0NBRWpDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRWQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRS9CLENBQUM7O0NBRUQsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLEVBQUUsRUFBRSxLQUFLLEdBQUc7O0NBRTlEO0NBQ0E7O0NBRUEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDOztDQUVwQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWxELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVsQyxFQUFFOztDQUVGLENBQUMsQ0FBQzs7Q0FFRjs7Q0FFQTs7Q0FFQSxJQUFJLFVBQVUsR0FBRywwQkFBMEIsQ0FBQzs7Q0FFNUM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxHQUFHOztDQUVoRCxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO0NBQ3JDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDOztDQUVuRCxDQUFDOztDQUVELFNBQVMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxHQUFHOztDQUVyRCxDQUFDLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJO0NBQzNCLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRTNCO0NBQ0EsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzs7Q0FFMUIsQ0FBQyxZQUFZOztDQUViLEVBQUUsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7Q0FDckMsR0FBRyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVM7O0NBRWxDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUU7Q0FDbEIsR0FBRyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUc7Q0FDakMsR0FBRyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixFQUFFLEtBQUssU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUUvQixFQUFFLEtBQUssU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssR0FBRyxJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssVUFBVSxHQUFHOztDQUVyRjs7Q0FFQSxHQUFHLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxLQUFLLFNBQVM7Q0FDakQsS0FBSyxJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtDQUM5QyxLQUFLLElBQUksZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDOztDQUVwRCxHQUFHLE1BQU07O0NBRVQsR0FBRyxNQUFNOztDQUVUOztDQUVBLEdBQUcsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUU3QyxHQUFHLEtBQUssSUFBSSxLQUFLLFNBQVMsR0FBRzs7Q0FFN0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN2QyxJQUFJLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWxDLElBQUk7O0NBRUosR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDOztDQUVwQixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGFBQWEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsR0FBRzs7Q0FFaEQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRS9CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7O0NBRS9ELENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtDQUM5QyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSTtDQUNuQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVqRCxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVuQyxFQUFFOztDQUVGLENBQUM7O0NBRUQsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRzs7Q0FFaEUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUxQixDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUUvRCxDQUFDLENBQUM7O0NBRUYsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksR0FBRzs7Q0FFcEUsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXhCLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckQsQ0FBQyxDQUFDOzs7Q0FHRjs7Q0FFQSxhQUFhLENBQUMsTUFBTSxHQUFHLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxHQUFHOztDQUU5RCxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWxELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRTtDQUNsQixHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV0QixFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsS0FBSyxLQUFLLEdBQUc7O0NBRWpDO0NBQ0EsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV2QyxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGLGFBQWEsQ0FBQyxZQUFZLEdBQUcsV0FBVyxHQUFHLEVBQUUsTUFBTSxHQUFHOztDQUV0RCxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFWixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWxELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGLENBQUMsT0FBTyxDQUFDLENBQUM7O0NBRVYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTs7Q0FFQSxJQUFJLGFBQWEsR0FBRyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVE7Q0FDbEksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUTtDQUMvSCxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUTtDQUNsSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRO0NBQ3BJLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRO0NBQzdJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVE7Q0FDbEosQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRO0NBQ25JLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3ZJLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRO0NBQ3ZJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVE7Q0FDakosQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUTtDQUN4SixDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3hKLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxRQUFRO0NBQ25KLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3JKLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVE7Q0FDM0ksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLFFBQVE7Q0FDOUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUTtDQUNuSixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0NBQy9JLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3RKLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVE7Q0FDekksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVE7Q0FDdkksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUTtDQUNuSixDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ2xKLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFakksU0FBUyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTFCLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTNDO0NBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXZCLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUU7O0NBRWhDLENBQUMsT0FBTyxFQUFFLElBQUk7O0NBRWQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWpCLENBQUMsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUV6QixFQUFFLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEIsR0FBRyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssUUFBUSxHQUFHOztDQUUxQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXhCLEdBQUcsTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBRzs7Q0FFMUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztDQUNsQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0NBQ2xCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7O0NBRWxCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFMUIsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEtBQUssR0FBRyxDQUFDO0NBQ3JDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQztDQUNwQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQzs7Q0FFL0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDYixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsWUFBWTs7Q0FFckIsRUFBRSxTQUFTLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUN2QixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3ZCLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNqRCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDN0IsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3RCxHQUFHLE9BQU8sQ0FBQyxDQUFDOztDQUVaLEdBQUc7O0NBRUgsRUFBRSxPQUFPLFNBQVMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVwQztDQUNBLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTlCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHOztDQUVsQixJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFakMsSUFBSSxNQUFNOztDQUVWLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3pELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Q0FFMUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDeEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4QyxJQUFJOztDQUVKLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFOUIsRUFBRSxTQUFTLFdBQVcsRUFBRSxNQUFNLEdBQUc7O0NBRWpDLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE9BQU87O0NBRXRDLEdBQUcsS0FBSyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUVuQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLEdBQUcsS0FBSyxHQUFHLG1CQUFtQixFQUFFLENBQUM7O0NBRXJGLElBQUk7O0NBRUosR0FBRzs7O0NBR0gsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Q0FFUixFQUFFLEtBQUssQ0FBQyxHQUFHLGlDQUFpQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRzs7Q0FFN0Q7O0NBRUEsR0FBRyxJQUFJLEtBQUssQ0FBQztDQUNiLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHLFNBQVMsSUFBSTs7Q0FFaEIsSUFBSSxLQUFLLEtBQUssQ0FBQztDQUNmLElBQUksS0FBSyxNQUFNOztDQUVmLEtBQUssS0FBSyxLQUFLLEdBQUcsK0RBQStELENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHOztDQUV2RztDQUNBLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2pFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2pFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVqRSxNQUFNLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLElBQUksQ0FBQzs7Q0FFbEIsTUFBTTs7Q0FFTixLQUFLLEtBQUssS0FBSyxHQUFHLHFFQUFxRSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRzs7Q0FFN0c7Q0FDQSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNqRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNqRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFakUsTUFBTSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWhDLE1BQU0sT0FBTyxJQUFJLENBQUM7O0NBRWxCLE1BQU07O0NBRU4sS0FBSyxNQUFNOztDQUVYLElBQUksS0FBSyxLQUFLLENBQUM7Q0FDZixJQUFJLEtBQUssTUFBTTs7Q0FFZixLQUFLLEtBQUssS0FBSyxHQUFHLCtFQUErRSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRzs7Q0FFdkg7Q0FDQSxNQUFNLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDN0MsTUFBTSxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUMvQyxNQUFNLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUUvQyxNQUFNLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHOztDQUV2RDs7Q0FFQSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNwQixHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7O0NBRXpCLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHOztDQUVyQjtDQUNBLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNyRSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDckUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVyRSxJQUFJLE9BQU8sSUFBSSxDQUFDOztDQUVoQixJQUFJLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHOztDQUU1QjtDQUNBLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNyRSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDckUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVyRSxJQUFJLE9BQU8sSUFBSSxDQUFDOztDQUVoQixJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFbkM7Q0FDQSxHQUFHLElBQUksR0FBRyxHQUFHLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFcEMsR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCO0NBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV2QixJQUFJLE1BQU07O0NBRVY7Q0FDQSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEdBQUcsS0FBSyxFQUFFLENBQUM7O0NBRTFELElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV4RCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUNuQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztDQUNuQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxLQUFLLEVBQUUsV0FBVyxHQUFHOztDQUVwRCxFQUFFLEtBQUssV0FBVyxLQUFLLFNBQVMsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDOztDQUVyRCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7Q0FFNUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxLQUFLLEVBQUUsV0FBVyxHQUFHOztDQUVwRCxFQUFFLEtBQUssV0FBVyxLQUFLLFNBQVMsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDOztDQUVyRCxFQUFFLElBQUksV0FBVyxHQUFHLEVBQUUsV0FBVyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsV0FBVyxLQUFLLEdBQUcsQ0FBQzs7Q0FFdEUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFX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LEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVuSCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRWpDLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Q0FFckMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXJDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRXhDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztDQUUvQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTNCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2QsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Q0FFZCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsVUFBVSxLQUFLLEdBQUc7O0NBRXhCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDOztDQUVwQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ2QsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Q0FFZCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0NBQ3pDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7Q0FDekMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQzs7Q0FFekMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV4QixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXhFLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQzNCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUUvQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUVyQyxFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0NBQ3hDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxZQUFZOztDQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxJQUFJLFdBQVcsR0FBRzs7Q0FFbEIsQ0FBQyxNQUFNLEVBQUU7O0NBRVQsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Q0FDM0MsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFOztDQUV6QixFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Q0FDdEIsRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O0NBRXBELEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUM5QixFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7O0NBRTNCLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUN6QixFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM1QixFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7Q0FDOUIsRUFBRSxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFOztDQUVsQyxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFOztDQUVSLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUN4QixFQUFFLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7O0NBRTlCLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUU7O0NBRVgsRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0NBQzNCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFOztDQUVqQyxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFOztDQUVkLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTs7Q0FFOUIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRTs7Q0FFVixFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Q0FDMUIsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFOztDQUV6QixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFOztDQUVaLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUM1QixFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUU7O0NBRWxCLEVBQUUsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUNsQyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtDQUNqQyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTs7Q0FFaEMsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRTs7Q0FFZixFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUU7O0NBRWYsRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFOztDQUUvQixFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFOztDQUVkLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTs7Q0FFOUIsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRTs7Q0FFTixFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7Q0FDaEMsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0NBQ3ZCLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtDQUN6QixFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTs7Q0FFNUMsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRTs7Q0FFVCxFQUFFLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTs7Q0FFbEMsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFO0NBQzlDLEdBQUcsU0FBUyxFQUFFLEVBQUU7Q0FDaEIsR0FBRyxLQUFLLEVBQUUsRUFBRTs7Q0FFWixHQUFHLE1BQU0sRUFBRSxFQUFFO0NBQ2IsR0FBRyxVQUFVLEVBQUUsRUFBRTtDQUNqQixHQUFHLFlBQVksRUFBRSxFQUFFO0NBQ25CLEdBQUcsYUFBYSxFQUFFLEVBQUU7Q0FDcEIsR0FBRyxFQUFFOztDQUVMLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0NBQ3JDLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFOztDQUV4QyxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFO0NBQ3ZDLEdBQUcsS0FBSyxFQUFFLEVBQUU7Q0FDWixHQUFHLFFBQVEsRUFBRSxFQUFFO0NBQ2YsR0FBRyxTQUFTLEVBQUUsRUFBRTtDQUNoQixHQUFHLFFBQVEsRUFBRSxFQUFFO0NBQ2YsR0FBRyxPQUFPLEVBQUUsRUFBRTtDQUNkLEdBQUcsV0FBVyxFQUFFLEVBQUU7Q0FDbEIsR0FBRyxLQUFLLEVBQUUsRUFBRTs7Q0FFWixHQUFHLE1BQU0sRUFBRSxFQUFFO0NBQ2IsR0FBRyxVQUFVLEVBQUUsRUFBRTtDQUNqQixHQUFHLFlBQVksRUFBRSxFQUFFO0NBQ25CLEdBQUcsYUFBYSxFQUFFLEVBQUU7Q0FDcEIsR0FBRyxFQUFFOztDQUVMLEVBQUUsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtDQUM5QixFQUFFLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTs7Q0FFakMsRUFBRSxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRTtDQUN4QyxHQUFHLEtBQUssRUFBRSxFQUFFO0NBQ1osR0FBRyxRQUFRLEVBQUUsRUFBRTtDQUNmLEdBQUcsS0FBSyxFQUFFLEVBQUU7Q0FDWixHQUFHLFFBQVEsRUFBRSxFQUFFOztDQUVmLEdBQUcsTUFBTSxFQUFFLEVBQUU7Q0FDYixHQUFHLFVBQVUsRUFBRSxFQUFFO0NBQ2pCLEdBQUcsWUFBWSxFQUFFLEVBQUU7Q0FDbkIsR0FBRyxhQUFhLEVBQUUsRUFBRTtDQUNwQixHQUFHLEVBQUU7O0NBRUwsRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0NBQy9CLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFOztDQUVsQyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUU7Q0FDN0MsR0FBRyxTQUFTLEVBQUUsRUFBRTtDQUNoQixHQUFHLFFBQVEsRUFBRSxFQUFFO0NBQ2YsR0FBRyxXQUFXLEVBQUUsRUFBRTtDQUNsQixHQUFHLEVBQUU7O0NBRUw7Q0FDQSxFQUFFLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFO0NBQzNDLEdBQUcsS0FBSyxFQUFFLEVBQUU7Q0FDWixHQUFHLFFBQVEsRUFBRSxFQUFFO0NBQ2YsR0FBRyxLQUFLLEVBQUUsRUFBRTtDQUNaLEdBQUcsTUFBTSxFQUFFLEVBQUU7Q0FDYixHQUFHLEVBQUU7O0NBRUwsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRTs7Q0FFVCxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtDQUMzQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7Q0FDekIsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0NBQ3RCLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtDQUN2QixFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Q0FDdEIsRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O0NBRXBELEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTs7Q0FFQSxJQUFJLGFBQWEsR0FBRzs7Q0FFcEIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxRQUFRLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUvQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXpDLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUc7O0NBRXhCLElBQUksTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyxNQUFNLENBQUM7O0NBRWhCLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxZQUFZLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDOztDQUV4QixFQUFFLE1BQU0sSUFBSSxDQUFDLElBQUksWUFBWSxHQUFHOztDQUVoQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTFCLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0NBRXRDLElBQUksSUFBSSxhQUFhLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQyxJQUFJLEtBQUssYUFBYSxNQUFNLGFBQWEsQ0FBQyxPQUFPO0NBQ2pELEtBQUssYUFBYSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUztDQUN2RCxLQUFLLGFBQWEsQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUztDQUNsRixLQUFLLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRzs7Q0FFakMsS0FBSyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVwRCxLQUFLLE1BQU0sS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHOztDQUVqRCxLQUFLLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBELEtBQUssTUFBTTs7Q0FFWCxLQUFLLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUM7O0NBRTVDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyxZQUFZLENBQUM7O0NBRXRCLEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGLElBQUksaUJBQWlCLEdBQUcsa0ZBQWtGLENBQUM7O0NBRTNHLElBQUksc0JBQXNCLEdBQUcsOERBQThELENBQUM7O0NBRTVGLElBQUksa0JBQWtCLEdBQUcsMEVBQTBFLENBQUM7O0NBRXBHLElBQUksY0FBYyxHQUFHLDRhQUE0YSxDQUFDOztDQUVsYyxJQUFJLG1CQUFtQixHQUFHLHVGQUF1RixDQUFDOztDQUVsSCxJQUFJLFlBQVksR0FBRywwQ0FBMEMsQ0FBQzs7Q0FFOUQsSUFBSSxrQkFBa0IsR0FBRyx5Q0FBeUMsQ0FBQzs7Q0FFbkUsSUFBSSxLQUFLLEdBQUcsMDdMQUEwN0wsQ0FBQzs7Q0FFdjhMLElBQUkscUJBQXFCLEdBQUcsd3pCQUF3ekIsQ0FBQzs7Q0FFcjFCLElBQUksd0JBQXdCLEdBQUcsK2dCQUErZ0IsQ0FBQzs7Q0FFL2lCLElBQUksNkJBQTZCLEdBQUcsNExBQTRMLENBQUM7O0NBRWpPLElBQUksMkJBQTJCLEdBQUcscUhBQXFILENBQUM7O0NBRXhKLElBQUksc0JBQXNCLEdBQUcsMkhBQTJILENBQUM7O0NBRXpKLElBQUksY0FBYyxHQUFHLHlEQUF5RCxDQUFDOztDQUUvRSxJQUFJLG1CQUFtQixHQUFHLG9EQUFvRCxDQUFDOztDQUUvRSxJQUFJLGlCQUFpQixHQUFHLGtEQUFrRCxDQUFDOztDQUUzRSxJQUFJLFlBQVksR0FBRyxxREFBcUQsQ0FBQzs7Q0FFekUsSUFBSSxNQUFNLEdBQUcscWdFQUFxZ0UsQ0FBQzs7Q0FFbmhFLElBQUksMkJBQTJCLEdBQUcsb2xJQUFvbEksQ0FBQzs7Q0FFdm5JLElBQUksb0JBQW9CLEdBQUcscUhBQXFILENBQUM7O0NBRWpKLElBQUksMkJBQTJCLEdBQUcsbUpBQW1KLENBQUM7O0NBRXRMLElBQUksc0JBQXNCLEdBQUcsZ0pBQWdKLENBQUM7O0NBRTlLLElBQUksb0JBQW9CLEdBQUcsOE1BQThNLENBQUM7O0NBRTFPLElBQUkseUJBQXlCLEdBQUcsb0VBQW9FLENBQUM7O0NBRXJHLElBQUksa0JBQWtCLEdBQUcseURBQXlELENBQUM7O0NBRW5GLElBQUksdUJBQXVCLEdBQUcsK3VGQUErdUYsQ0FBQzs7Q0FFOXdGLElBQUksZUFBZSxHQUFHLGduREFBZ25ELENBQUM7O0NBRXZvRCxJQUFJLG9CQUFvQixHQUFHLGtuQkFBa25CLENBQUM7O0NBRTlvQixJQUFJLGtCQUFrQixHQUFHLGdPQUFnTyxDQUFDOztDQUUxUCxJQUFJLGFBQWEsR0FBRyxzZ0JBQXNnQixDQUFDOztDQUUzaEIsSUFBSSxVQUFVLEdBQUcscURBQXFELENBQUM7O0NBRXZFLElBQUksZUFBZSxHQUFHLHFEQUFxRCxDQUFDOztDQUU1RSxJQUFJLFlBQVksR0FBRyw4U0FBOFMsQ0FBQzs7Q0FFbFUsSUFBSSxpQkFBaUIsR0FBRywyTUFBMk0sQ0FBQzs7Q0FFcE8sSUFBSSx5QkFBeUIsR0FBRyx5WUFBeVksQ0FBQzs7Q0FFMWEsSUFBSSxpQkFBaUIsR0FBRyw4SEFBOEgsQ0FBQzs7Q0FFdkosSUFBSSxzQkFBc0IsR0FBRyxnR0FBZ0csQ0FBQzs7Q0FFOUgsSUFBSSxxQkFBcUIsR0FBRyw0b0VBQTRvRSxDQUFDOztDQUV6cUUsSUFBSSxXQUFXLEdBQUcsbTlOQUFtOU4sQ0FBQzs7Q0FFdCtOLElBQUkscUJBQXFCLEdBQUcsdU1BQXVNLENBQUM7O0NBRXBPLElBQUksMEJBQTBCLEdBQUcsODJGQUE4MkYsQ0FBQzs7Q0FFaDVGLElBQUksd0JBQXdCLEdBQUcsNmlCQUE2aUIsQ0FBQzs7Q0FFN2tCLElBQUksNkJBQTZCLEdBQUcsK3BKQUErcEosQ0FBQzs7Q0FFcHNKLElBQUksZUFBZSxHQUFHLHk3R0FBeTdHLENBQUM7O0NBRWg5RyxJQUFJLG9CQUFvQixHQUFHLG1JQUFtSSxDQUFDOztDQUUvSixJQUFJLHlCQUF5QixHQUFHLHlJQUF5SSxDQUFDOztDQUUxSyxJQUFJLHVCQUF1QixHQUFHLHVJQUF1SSxDQUFDOztDQUV0SyxJQUFJLGtCQUFrQixHQUFHLG9RQUFvUSxDQUFDOztDQUU5UixJQUFJLFlBQVksR0FBRyxxSkFBcUosQ0FBQzs7Q0FFekssSUFBSSxpQkFBaUIsR0FBRyxvREFBb0QsQ0FBQzs7Q0FFN0UsSUFBSSxxQkFBcUIsR0FBRyxvTUFBb00sQ0FBQzs7Q0FFak8sSUFBSSwwQkFBMEIsR0FBRyxrRkFBa0YsQ0FBQzs7Q0FFcEgsSUFBSSxxQkFBcUIsR0FBRyx3S0FBd0ssQ0FBQzs7Q0FFck0sSUFBSSwwQkFBMEIsR0FBRyxvRUFBb0UsQ0FBQzs7Q0FFdEcsSUFBSSxrQkFBa0IsR0FBRywrVUFBK1UsQ0FBQzs7Q0FFelcsSUFBSSx1QkFBdUIsR0FBRywwS0FBMEssQ0FBQzs7Q0FFek0sSUFBSSxrQkFBa0IsR0FBRyx5cUJBQXlxQixDQUFDOztDQUVuc0IsSUFBSSxXQUFXLEdBQUcsZ0lBQWdJLENBQUM7O0NBRW5KLElBQUksZUFBZSxHQUFHLHNnQkFBc2dCLENBQUM7O0NBRTdoQixJQUFJLHVCQUF1QixHQUFHLCtsQkFBK2xCLENBQUM7O0NBRTluQixJQUFJLE9BQU8sR0FBRyxveUNBQW95QyxDQUFDOztDQUVuekMsSUFBSSw0QkFBNEIsR0FBRyw2RUFBNkUsQ0FBQzs7Q0FFakgsSUFBSSxjQUFjLEdBQUcscU1BQXFNLENBQUM7O0NBRTNOLElBQUksa0JBQWtCLEdBQUcseUZBQXlGLENBQUM7O0NBRW5ILElBQUksdUJBQXVCLEdBQUcsb1ZBQW9WLENBQUM7O0NBRW5YLElBQUkscUJBQXFCLEdBQUcsd0tBQXdLLENBQUM7O0NBRXJNLElBQUksMEJBQTBCLEdBQUcsb0VBQW9FLENBQUM7O0NBRXRHLElBQUksdUJBQXVCLEdBQUcscWdOQUFxZ04sQ0FBQzs7Q0FFcGlOLElBQUkscUJBQXFCLEdBQUcseWVBQXllLENBQUM7O0NBRXRnQixJQUFJLGdCQUFnQixHQUFHLGdoQkFBZ2hCLENBQUM7O0NBRXhpQixJQUFJLHdCQUF3QixHQUFHLDZvQ0FBNm9DLENBQUM7O0NBRTdxQyxJQUFJLGVBQWUsR0FBRyxpT0FBaU8sQ0FBQzs7Q0FFeFAsSUFBSSxvQkFBb0IsR0FBRywyZ0NBQTJnQyxDQUFDOztDQUV2aUMsSUFBSSxlQUFlLEdBQUcscVhBQXFYLENBQUM7O0NBRTVZLElBQUksaUJBQWlCLEdBQUcsNldBQTZXLENBQUM7O0NBRXRZLElBQUksb0JBQW9CLEdBQUcseUxBQXlMLENBQUM7O0NBRXJOLElBQUkseUJBQXlCLEdBQUcsa0VBQWtFLENBQUM7O0NBRW5HLElBQUksb0JBQW9CLEdBQUcsOEZBQThGLENBQUM7O0NBRTFILElBQUkseUJBQXlCLEdBQUcsbTVCQUFtNUIsQ0FBQzs7Q0FFcDdCLElBQUksZ0JBQWdCLEdBQUcsZ1FBQWdRLENBQUM7O0NBRXhSLElBQUksY0FBYyxHQUFHLGdTQUFnUyxDQUFDOztDQUV0VCxJQUFJLFNBQVMsR0FBRyw0UkFBNFIsQ0FBQzs7Q0FFN1MsSUFBSSxpQkFBaUIsR0FBRyxtRkFBbUYsQ0FBQzs7Q0FFNUcsSUFBSSxlQUFlLEdBQUcsMEdBQTBHLENBQUM7O0NBRWpJLElBQUksVUFBVSxHQUFHLDRFQUE0RSxDQUFDOztDQUU5RixJQUFJLGVBQWUsR0FBRyxnU0FBZ1MsQ0FBQzs7Q0FFdlQsSUFBSSxTQUFTLEdBQUcsMFFBQTBRLENBQUM7O0NBRTNSLElBQUksU0FBUyxHQUFHLDhMQUE4TCxDQUFDOztDQUUvTSxJQUFJLFVBQVUsR0FBRyxndkJBQWd2QixDQUFDOztDQUVsd0IsSUFBSSxVQUFVLEdBQUcsbWhCQUFtaEIsQ0FBQzs7Q0FFcmlCLElBQUksaUJBQWlCLEdBQUcsOFJBQThSLENBQUM7O0NBRXZULElBQUksaUJBQWlCLEdBQUcsNmFBQTZhLENBQUM7O0NBRXRjLElBQUksYUFBYSxHQUFHLHVYQUF1WCxDQUFDOztDQUU1WSxJQUFJLGFBQWEsR0FBRyw4TEFBOEwsQ0FBQzs7Q0FFbk4sSUFBSSxlQUFlLEdBQUcsb3lCQUFveUIsQ0FBQzs7Q0FFM3pCLElBQUksZUFBZSxHQUFHLGloQkFBaWhCLENBQUM7O0NBRXhpQixJQUFJLGNBQWMsR0FBRyxpK0NBQWkrQyxDQUFDOztDQUV2L0MsSUFBSSxjQUFjLEdBQUcsczJCQUFzMkIsQ0FBQzs7Q0FFNTNCLElBQUksZ0JBQWdCLEdBQUcsNG1FQUE0bUUsQ0FBQzs7Q0FFcG9FLElBQUksZ0JBQWdCLEdBQUcsMmpDQUEyakMsQ0FBQzs7Q0FFbmxDLElBQUksY0FBYyxHQUFHLHk1REFBeTVELENBQUM7O0NBRS82RCxJQUFJLGNBQWMsR0FBRyxzcUNBQXNxQyxDQUFDOztDQUU1ckMsSUFBSSxpQkFBaUIsR0FBRyxzcUVBQXNxRSxDQUFDOztDQUUvckUsSUFBSSxpQkFBaUIsR0FBRyxvcENBQW9wQyxDQUFDOztDQUU3cUMsSUFBSSxXQUFXLEdBQUcsaWlCQUFpaUIsQ0FBQzs7Q0FFcGpCLElBQUksV0FBVyxHQUFHLGc4QkFBZzhCLENBQUM7O0NBRW45QixJQUFJLFdBQVcsR0FBRyw2eUJBQTZ5QixDQUFDOztDQUVoMEIsSUFBSSxXQUFXLEdBQUcsMm1CQUEybUIsQ0FBQzs7Q0FFOW5CLElBQUksV0FBVyxHQUFHLG9SQUFvUixDQUFDOztDQUV2UyxJQUFJLFdBQVcsR0FBRywyS0FBMkssQ0FBQzs7Q0FFOUwsSUFBSSxXQUFXLEdBQUc7Q0FDbEIsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQyxzQkFBc0IsRUFBRSxzQkFBc0I7Q0FDL0MsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7Q0FDdkMsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLG1CQUFtQixFQUFFLG1CQUFtQjtDQUN6QyxDQUFDLFlBQVksRUFBRSxZQUFZO0NBQzNCLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMsS0FBSyxFQUFFLEtBQUs7Q0FDYixDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLHdCQUF3QixFQUFFLHdCQUF3QjtDQUNuRCxDQUFDLDZCQUE2QixFQUFFLDZCQUE2QjtDQUM3RCxDQUFDLDJCQUEyQixFQUFFLDJCQUEyQjtDQUN6RCxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQjtDQUMvQyxDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CO0NBQ3pDLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsWUFBWSxFQUFFLFlBQVk7Q0FDM0IsQ0FBQyxNQUFNLEVBQUUsTUFBTTtDQUNmLENBQUMsMkJBQTJCLEVBQUUsMkJBQTJCO0NBQ3pELENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzNDLENBQUMsMkJBQTJCLEVBQUUsMkJBQTJCO0NBQ3pELENBQUMsc0JBQXNCLEVBQUUsc0JBQXNCO0NBQy9DLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzNDLENBQUMseUJBQXlCLEVBQUUseUJBQXlCO0NBQ3JELENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2pELENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7Q0FDdkMsQ0FBQyxhQUFhLEVBQUUsYUFBYTtDQUM3QixDQUFDLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxZQUFZLEVBQUUsWUFBWTtDQUMzQixDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLHlCQUF5QixFQUFFLHlCQUF5QjtDQUNyRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQjtDQUMvQyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLFdBQVcsRUFBRSxXQUFXO0NBQ3pCLENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0NBQzdDLENBQUMsMEJBQTBCLEVBQUUsMEJBQTBCO0NBQ3ZELENBQUMsd0JBQXdCLEVBQUUsd0JBQXdCO0NBQ25ELENBQUMsNkJBQTZCLEVBQUUsNkJBQTZCO0NBQzdELENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQyx5QkFBeUIsRUFBRSx5QkFBeUI7Q0FDckQsQ0FBQyx1QkFBdUIsRUFBRSx1QkFBdUI7Q0FDakQsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7Q0FDdkMsQ0FBQyxZQUFZLEVBQUUsWUFBWTtDQUMzQixDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLDBCQUEwQixFQUFFLDBCQUEwQjtDQUN2RCxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQjtDQUM3QyxDQUFDLDBCQUEwQixFQUFFLDBCQUEwQjtDQUN2RCxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQjtDQUN2QyxDQUFDLHVCQUF1QixFQUFFLHVCQUF1QjtDQUNqRCxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQjtDQUN2QyxDQUFDLFdBQVcsRUFBRSxXQUFXO0NBQ3pCLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyx1QkFBdUIsRUFBRSx1QkFBdUI7Q0FDakQsQ0FBQyxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDLDRCQUE0QixFQUFFLDRCQUE0QjtDQUMzRCxDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCO0NBQ3ZDLENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2pELENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0NBQzdDLENBQUMsMEJBQTBCLEVBQUUsMEJBQTBCO0NBQ3ZELENBQUMsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2pELENBQUMscUJBQXFCLEVBQUUscUJBQXFCO0NBQzdDLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUMsd0JBQXdCLEVBQUUsd0JBQXdCO0NBQ25ELENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDM0MsQ0FBQyxlQUFlLEVBQUUsZUFBZTtDQUNqQyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQjtDQUNyQyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQjtDQUMzQyxDQUFDLHlCQUF5QixFQUFFLHlCQUF5QjtDQUNyRCxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQjtDQUMzQyxDQUFDLHlCQUF5QixFQUFFLHlCQUF5QjtDQUNyRCxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQjtDQUNuQyxDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsU0FBUyxFQUFFLFNBQVM7Q0FDckIsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQyxlQUFlLEVBQUUsZUFBZTtDQUNqQyxDQUFDLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMsZUFBZSxFQUFFLGVBQWU7O0NBRWpDLENBQUMsU0FBUyxFQUFFLFNBQVM7Q0FDckIsQ0FBQyxTQUFTLEVBQUUsU0FBUztDQUNyQixDQUFDLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMsVUFBVSxFQUFFLFVBQVU7Q0FDdkIsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQyxhQUFhLEVBQUUsYUFBYTtDQUM3QixDQUFDLGFBQWEsRUFBRSxhQUFhO0NBQzdCLENBQUMsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQyxlQUFlLEVBQUUsZUFBZTtDQUNqQyxDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsY0FBYyxFQUFFLGNBQWM7Q0FDL0IsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0I7Q0FDbkMsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0I7Q0FDbkMsQ0FBQyxjQUFjLEVBQUUsY0FBYztDQUMvQixDQUFDLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3JDLENBQUMsV0FBVyxFQUFFLFdBQVc7Q0FDekIsQ0FBQyxXQUFXLEVBQUUsV0FBVztDQUN6QixDQUFDLFdBQVcsRUFBRSxXQUFXO0NBQ3pCLENBQUMsV0FBVyxFQUFFLFdBQVc7Q0FDekIsQ0FBQyxXQUFXLEVBQUUsV0FBVztDQUN6QixDQUFDLFdBQVcsRUFBRSxXQUFXO0NBQ3pCLENBQUMsQ0FBQzs7Q0FFRjtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLElBQUksU0FBUyxHQUFHOztDQUVoQixDQUFDLEtBQUssRUFBRTs7Q0FFUixFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFO0NBQ2pDLEdBQUcsV0FBVyxDQUFDLE1BQU07Q0FDckIsR0FBRyxXQUFXLENBQUMsS0FBSztDQUNwQixHQUFHLFdBQVcsQ0FBQyxRQUFRO0NBQ3ZCLEdBQUcsV0FBVyxDQUFDLEdBQUc7Q0FDbEIsR0FBRyxFQUFFOztDQUVMLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxjQUFjO0NBQzFDLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxjQUFjOztDQUU1QyxFQUFFOztDQUVGLENBQUMsT0FBTyxFQUFFOztDQUVWLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Q0FDakMsR0FBRyxXQUFXLENBQUMsTUFBTTtDQUNyQixHQUFHLFdBQVcsQ0FBQyxLQUFLO0NBQ3BCLEdBQUcsV0FBVyxDQUFDLFFBQVE7Q0FDdkIsR0FBRyxXQUFXLENBQUMsV0FBVztDQUMxQixHQUFHLFdBQVcsQ0FBQyxHQUFHO0NBQ2xCLEdBQUcsV0FBVyxDQUFDLE1BQU07Q0FDckIsR0FBRztDQUNILElBQUksUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO0NBQzlDLElBQUk7Q0FDSixHQUFHLEVBQUU7O0NBRUwsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLGdCQUFnQjtDQUM1QyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsZ0JBQWdCOztDQUU5QyxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFOztDQUVSLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Q0FDakMsR0FBRyxXQUFXLENBQUMsTUFBTTtDQUNyQixHQUFHLFdBQVcsQ0FBQyxLQUFLO0NBQ3BCLEdBQUcsV0FBVyxDQUFDLFFBQVE7Q0FDdkIsR0FBRyxXQUFXLENBQUMsV0FBVztDQUMxQixHQUFHLFdBQVcsQ0FBQyxPQUFPO0NBQ3RCLEdBQUcsV0FBVyxDQUFDLFNBQVM7Q0FDeEIsR0FBRyxXQUFXLENBQUMsZUFBZTtDQUM5QixHQUFHLFdBQVcsQ0FBQyxXQUFXO0NBQzFCLEdBQUcsV0FBVyxDQUFDLEdBQUc7Q0FDbEIsR0FBRyxXQUFXLENBQUMsTUFBTTtDQUNyQixHQUFHO0NBQ0gsSUFBSSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Q0FDOUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Q0FDOUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0NBQzVCLElBQUk7Q0FDSixHQUFHLEVBQUU7O0NBRUwsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLGNBQWM7Q0FDMUMsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLGNBQWM7O0NBRTVDLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUU7O0NBRVgsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRTtDQUNqQyxHQUFHLFdBQVcsQ0FBQyxNQUFNO0NBQ3JCLEdBQUcsV0FBVyxDQUFDLEtBQUs7Q0FDcEIsR0FBRyxXQUFXLENBQUMsUUFBUTtDQUN2QixHQUFHLFdBQVcsQ0FBQyxXQUFXO0NBQzFCLEdBQUcsV0FBVyxDQUFDLE9BQU87Q0FDdEIsR0FBRyxXQUFXLENBQUMsU0FBUztDQUN4QixHQUFHLFdBQVcsQ0FBQyxlQUFlO0NBQzlCLEdBQUcsV0FBVyxDQUFDLFlBQVk7Q0FDM0IsR0FBRyxXQUFXLENBQUMsWUFBWTtDQUMzQixHQUFHLFdBQVcsQ0FBQyxHQUFHO0NBQ2xCLEdBQUcsV0FBVyxDQUFDLE1BQU07Q0FDckIsR0FBRztDQUNILElBQUksUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO0NBQzlDLElBQUksU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtDQUM3QixJQUFJLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7Q0FDN0IsSUFBSSxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0NBQ2pDLElBQUk7Q0FDSixHQUFHLEVBQUU7O0NBRUwsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLGlCQUFpQjtDQUM3QyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsaUJBQWlCOztDQUUvQyxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFOztDQUVULEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUU7Q0FDakMsR0FBRyxXQUFXLENBQUMsTUFBTTtDQUNyQixHQUFHLFdBQVcsQ0FBQyxHQUFHO0NBQ2xCLEdBQUcsRUFBRTs7Q0FFTCxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsV0FBVztDQUN2QyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsV0FBVzs7Q0FFekMsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRTs7Q0FFVCxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFO0NBQ2pDLEdBQUcsV0FBVyxDQUFDLE1BQU07Q0FDckIsR0FBRyxXQUFXLENBQUMsR0FBRztDQUNsQixHQUFHO0NBQ0gsSUFBSSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0NBQ3ZCLElBQUksUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtDQUMxQixJQUFJLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7Q0FDM0IsSUFBSTtDQUNKLEdBQUcsRUFBRTs7Q0FFTCxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsZUFBZTtDQUMzQyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsZUFBZTs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRTs7Q0FFUixFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFO0NBQ2pDLEdBQUcsV0FBVyxDQUFDLE1BQU07Q0FDckIsR0FBRyxXQUFXLENBQUMsZUFBZTtDQUM5QixHQUFHLEVBQUU7O0NBRUwsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLFVBQVU7Q0FDdEMsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLFVBQVU7O0NBRXhDLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUU7O0NBRVQsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRTtDQUNqQyxHQUFHLFdBQVcsQ0FBQyxNQUFNO0NBQ3JCLEdBQUcsV0FBVyxDQUFDLE9BQU87Q0FDdEIsR0FBRyxXQUFXLENBQUMsU0FBUztDQUN4QixHQUFHLFdBQVcsQ0FBQyxlQUFlO0NBQzlCLEdBQUc7Q0FDSCxJQUFJLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7Q0FDM0IsSUFBSTtDQUNKLEdBQUcsRUFBRTs7Q0FFTCxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsV0FBVztDQUN2QyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsV0FBVzs7Q0FFekMsRUFBRTs7Q0FFRjtDQUNBO0NBQ0E7O0NBRUEsQ0FBQyxJQUFJLEVBQUU7O0NBRVAsRUFBRSxRQUFRLEVBQUU7Q0FDWixHQUFHLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Q0FDekIsR0FBRyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUU7Q0FDeEIsR0FBRyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0NBQzFCLEdBQUc7O0NBRUgsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLFNBQVM7Q0FDckMsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLFNBQVM7O0NBRXZDLEVBQUU7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLENBQUMsUUFBUSxFQUFFOztDQUVYLEVBQUUsUUFBUSxFQUFFO0NBQ1osR0FBRyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0NBQzdCLEdBQUcsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQ3hCLEdBQUc7O0NBRUgsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLGFBQWE7Q0FDekMsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLGFBQWE7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUU7O0NBRWYsRUFBRSxRQUFRLEVBQUU7Q0FDWixHQUFHLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFO0NBQ3JDLEdBQUc7O0NBRUgsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLGlCQUFpQjtDQUM3QyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsaUJBQWlCOztDQUUvQyxFQUFFOztDQUVGLENBQUMsQ0FBQzs7Q0FFRixTQUFTLENBQUMsUUFBUSxHQUFHOztDQUVyQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFO0NBQ2hDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRO0NBQzdCLEVBQUU7Q0FDRixHQUFHLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7Q0FDMUIsR0FBRyxrQkFBa0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7Q0FDbkMsR0FBRztDQUNILEVBQUUsRUFBRTs7Q0FFSixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsaUJBQWlCO0NBQzVDLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxpQkFBaUI7O0NBRTlDLENBQUMsQ0FBQzs7Q0FFRjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFMUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUNoRixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVoRixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTs7Q0FFL0IsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUU1QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFcEMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRW5CLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdEQsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyQyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLG9CQUFvQixFQUFFLFlBQVk7O0NBRW5DLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLElBQUksR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN4RCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUMzQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRXhCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzNCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUzQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsWUFBWTs7Q0FFeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN2QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDOztDQUV2QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEI7O0NBRUEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEUsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLGNBQWMsR0FBRzs7Q0FFeEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxjQUFjLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMvQyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUU3RyxFQUFFOztDQUVGLENBQUMsT0FBTyxFQUFFLFdBQVcsY0FBYyxHQUFHOztDQUV0QyxFQUFFLElBQUksTUFBTSxHQUFHLGNBQWMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQy9DLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkYsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFbkMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV4QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVyQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFL0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVuQyxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyRCxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDOztDQUUvRCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUUvQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzNELEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXRELEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxLQUFLLEVBQUUsY0FBYyxHQUFHOztDQUVsRDtDQUNBOztDQUVBLEVBQUUsSUFBSSxNQUFNLEdBQUcsY0FBYyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRS9DLEVBQUUsT0FBTyxNQUFNLENBQUMsR0FBRztDQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtDQUN6RCxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtDQUN6RCxHQUFHLENBQUM7O0NBRUosRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFakM7O0NBRUEsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN6RCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7O0NBRW5FLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxLQUFLLEVBQUUsY0FBYyxHQUFHOztDQUVoRCxFQUFFLElBQUksTUFBTSxHQUFHLGNBQWMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQy9DLEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUQsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxZQUFZOztDQUU5QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLGVBQWUsRUFBRSxLQUFLLEdBQUc7O0NBRTNDLEdBQUcsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDbkUsR0FBRyxPQUFPLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTdDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxTQUFTLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRXpCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUUxQixFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEUsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHOztDQUU3QyxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7Q0FDM0IsQ0FBQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUU1QixDQUFDLElBQUksWUFBWSxFQUFFLGFBQWEsQ0FBQztDQUNqQyxDQUFDLElBQUksTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDOztDQUUzQyxDQUFDLElBQUksV0FBVyxFQUFFLGdCQUFnQixDQUFDOztDQUVuQyxDQUFDLFNBQVMsSUFBSSxHQUFHOztDQUVqQixFQUFFLElBQUksUUFBUSxHQUFHLElBQUksWUFBWSxFQUFFO0NBQ25DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ2hCLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ2pCLEdBQUcsRUFBRSxDQUFDOztDQUVOLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUU7Q0FDL0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNWLEdBQUcsRUFBRSxDQUFDOztDQUVOOztDQUVBLEVBQUUsWUFBWSxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztDQUN2QyxFQUFFLGFBQWEsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRXZDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ2pELEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRTdELEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLENBQUM7Q0FDMUQsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUVsRTs7Q0FFQSxFQUFFLFdBQVcsUUFBUSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7Q0FDeEMsRUFBRSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRXhDLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ2xELEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUN2RixFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztDQUN6RSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztDQUN6RSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQ3ZFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXZFLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLENBQUM7Q0FDdkQsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQ3pGLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0NBQ3pFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0NBQ3pFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFdkUsRUFBRSxNQUFNLEdBQUc7O0NBRVgsR0FBRyxZQUFZLEVBQUU7O0NBRWpCLElBQUksOEJBQThCOztDQUVsQyxJQUFJLDhCQUE4QjtDQUNsQyxJQUFJLHFCQUFxQjtDQUN6QixJQUFJLHlCQUF5Qjs7Q0FFN0IsSUFBSSxpQ0FBaUM7O0NBRXJDLElBQUksMEJBQTBCO0NBQzlCLElBQUksb0JBQW9COztDQUV4QixJQUFJLG1CQUFtQjtDQUN2QixJQUFJLDRCQUE0Qjs7Q0FFaEMsSUFBSSxlQUFlOztDQUVuQixLQUFLLFdBQVc7O0NBRWhCLEtBQUssc0JBQXNCOztDQUUzQixLQUFLLDBCQUEwQjs7Q0FFL0IsTUFBTSxnRUFBZ0U7Q0FDdEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7Q0FDbEUsTUFBTSw0REFBNEQ7O0NBRWxFLE1BQU0sMENBQTBDO0NBQ2hELE1BQU0sMENBQTBDO0NBQ2hELE1BQU0sMENBQTBDO0NBQ2hELE1BQU0sMENBQTBDOztDQUVoRCxNQUFNLHNFQUFzRTtDQUM1RSxNQUFNLHNFQUFzRTs7Q0FFNUUsS0FBSyxHQUFHOztDQUVSLEtBQUssc0ZBQXNGOztDQUUzRixJQUFJLEdBQUc7O0NBRVAsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7O0NBRWpCLEdBQUcsY0FBYyxFQUFFOztDQUVuQixJQUFJLDhCQUE4Qjs7Q0FFbEMsSUFBSSx3QkFBd0I7Q0FDNUIsSUFBSSx3QkFBd0I7Q0FDNUIsSUFBSSxxQkFBcUI7O0NBRXpCLElBQUksbUJBQW1CO0NBQ3ZCLElBQUksNEJBQTRCOztDQUVoQyxJQUFJLGVBQWU7O0NBRW5COztDQUVBLEtBQUssMEJBQTBCOztDQUUvQixNQUFNLDRDQUE0Qzs7Q0FFbEQ7O0NBRUEsS0FBSyxpQ0FBaUM7O0NBRXRDLE1BQU0sdUNBQXVDOztDQUU3Qzs7Q0FFQSxLQUFLLFVBQVU7O0NBRWYsTUFBTSx1Q0FBdUM7Q0FDN0MsTUFBTSxxQ0FBcUM7Q0FDM0MsTUFBTSx5QkFBeUI7Q0FDL0IsTUFBTSw0QkFBNEI7O0NBRWxDLEtBQUssR0FBRzs7Q0FFUixJQUFJLEdBQUc7O0NBRVAsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7O0NBRWpCLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLE9BQU8sR0FBRyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXBDLEVBQUUsVUFBVSxHQUFHO0NBQ2YsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxVQUFVLEVBQUU7Q0FDdkQsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUU7Q0FDakQsR0FBRyxDQUFDOztDQUVKLEVBQUUsUUFBUSxHQUFHO0NBQ2IsR0FBRyxVQUFVLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUU7Q0FDakUsR0FBRyxHQUFHLGFBQWEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7Q0FDMUQsR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUU7Q0FDbkUsR0FBRyxPQUFPLFNBQVMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7Q0FDOUQsR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7Q0FDNUQsR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7Q0FDNUQsR0FBRyxRQUFRLFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUU7Q0FDL0QsR0FBRyxjQUFjLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRTtDQUNyRSxHQUFHLENBQUM7O0NBRUosRUFBRTs7Q0FFRjtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxHQUFHOztDQUVwRCxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsT0FBTzs7Q0FFcEMsRUFBRSxJQUFJLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUVuQyxFQUFFLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7Q0FDekMsR0FBRyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUc7Q0FDdkMsR0FBRyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsSUFBSSxHQUFHLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRSxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtDQUM3QyxHQUFHLG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUMsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDOztDQUU3QixFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzlDLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUUxRixFQUFFLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7Q0FFL0IsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7Q0FFVixHQUFHOztDQUVILEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDekIsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUM3QyxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3pDLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7O0NBRWxDO0NBQ0E7O0NBRUEsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ2pELEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUUsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEUsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsQ0FBQzs7Q0FFMUQsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFdkMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRCxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztDQUMxQixHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkM7O0NBRUEsR0FBRyxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUU1SCxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Q0FDMUQsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUV4RDs7Q0FFQSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXZDOztDQUVBLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQztDQUMxRyxHQUFHLG9CQUFvQixDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxLQUFLLGNBQWMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7O0NBRTVHOztDQUVBLEdBQUcsS0FBSyxTQUFTLENBQUMsYUFBYSxFQUFFLG9CQUFvQixFQUFFLEtBQUssSUFBSSxHQUFHOztDQUVuRTs7Q0FFQSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ3ZDLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQzdDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDdkMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDcEQsSUFBSSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzs7Q0FHN0c7O0NBRUEsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDckQsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDOztDQUVsQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0NBRzdEOztDQUVBLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDdkMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztDQUN6RCxJQUFJLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7OztDQUc5Rzs7Q0FFQSxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDOztDQUVuQyxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ3ZDLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ3BELElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDOzs7Q0FHN0Q7O0NBRUEsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFaEQsSUFBSSxLQUFLLEtBQUssQ0FBQyxvQkFBb0IsR0FBRzs7Q0FFdEMsS0FBSyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXpDLEtBQUssTUFBTTs7Q0FFWCxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUU5QixLQUFLOztDQUVMOztDQUVBLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTdCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxFLEtBQUssSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHOztDQUUzRCxNQUFNLGNBQWMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztDQUNsQyxNQUFNLGNBQWMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztDQUNsQyxNQUFNLGNBQWMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Q0FFbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7O0NBRXJELE1BQU0sS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDO0NBQ2pDLE1BQU0sS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7O0NBRXJCLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDcEcsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDdkQsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUV6RCxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDdkQsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFckYsTUFBTSxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNuRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRS9ELE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMvQixFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QyxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxDQUFDOztDQUVILENBQUMsU0FBUyxhQUFhLEVBQUUsTUFBTSxHQUFHOztDQUVsQyxFQUFFLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztDQUM3RCxFQUFFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUV6RCxFQUFFLElBQUksTUFBTSxHQUFHLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsV0FBVyxDQUFDOztDQUVwRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDcEUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVoRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLENBQUM7Q0FDckMsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO0NBQzdDLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRTNDLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxPQUFPLE9BQU8sQ0FBQzs7Q0FFakIsRUFBRTs7Q0FFRixDQUFDOztDQUVEO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUc7O0NBRTNDLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztDQUMzQixDQUFDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0NBRTVCLENBQUMsSUFBSSxZQUFZLEVBQUUsYUFBYSxDQUFDO0NBQ2pDLENBQUMsSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQzs7Q0FFbkMsQ0FBQyxJQUFJLE9BQU8sQ0FBQzs7Q0FFYjs7Q0FFQSxDQUFDLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDcEMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0NBQ3ZDLENBQUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFakMsQ0FBQyxTQUFTLElBQUksR0FBRzs7Q0FFakIsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRTtDQUNuQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3RCLEtBQUssR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3RCLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN0QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN0QixHQUFHLEVBQUUsQ0FBQzs7Q0FFTixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFO0NBQy9CLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ1YsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLEVBQUUsQ0FBQzs7Q0FFTixFQUFFLFlBQVksSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7Q0FDcEMsRUFBRSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVwQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNqRCxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUU3RCxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFbEUsRUFBRSxPQUFPLEdBQUcsYUFBYSxFQUFFLENBQUM7O0NBRTVCLEVBQUUsVUFBVSxHQUFHO0NBQ2YsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxVQUFVLEVBQUU7Q0FDM0QsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUU7Q0FDakQsR0FBRyxDQUFDOztDQUVKLEVBQUUsUUFBUSxHQUFHO0NBQ2IsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUU7Q0FDM0QsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7O0NBRXpELEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFO0NBQzNELEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFOztDQUV0RCxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtDQUN0RCxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtDQUNsRCxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRTs7Q0FFekQsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRTtDQUN4RSxHQUFHLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUU7O0NBRXpFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFO0NBQ3pELEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFO0NBQy9ELEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFO0NBQ3pELEdBQUcsTUFBTSxLQUFLLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO0NBQ3hELEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFOztDQUUzRCxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRTtDQUM3RCxHQUFHLENBQUM7O0NBRUosRUFBRSxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLDhCQUE4QixFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3BGLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQzFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Q0FDOUIsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQyxFQUFFLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNsQyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUU3QixFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRTFDLEVBQUUsS0FBSyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxPQUFPOztDQUVyQzs7Q0FFQSxFQUFFLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7Q0FFL0IsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7Q0FFVixHQUFHOztDQUVILEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDekIsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUMvQyxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3pDLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDakQsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5RSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV4RSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxDQUFDOztDQUUxRCxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFNUYsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNyQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7Q0FDckIsRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7Q0FDdkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDOztDQUV0QixFQUFFLEtBQUssR0FBRyxHQUFHOztDQUViLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTVFLEdBQUcsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHOztDQUVwQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDL0MsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUU3QyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUN4QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7Q0FDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOztDQUVyQixJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBUyxHQUFHOztDQUUvQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXJELElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3hDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztDQUNuQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7O0NBRXJCLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3ZDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUNsQixHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUc7OztDQUdIOztDQUVBLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsR0FBRyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0NBQzVGLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV0RCxHQUFHOztDQUVILEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUVwQzs7Q0FFQSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7Q0FFakIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxHQUFHLElBQUksTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM3QixHQUFHLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRWxDLEdBQUcsS0FBSyxRQUFRLENBQUMsT0FBTyxLQUFLLEtBQUssR0FBRyxTQUFTOztDQUU5QyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDMUQsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFM0YsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUUvRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO0NBQzlCLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7O0NBRTlCLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDOztDQUVuQixHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRyxHQUFHOztDQUVwQyxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUM7O0NBRTNCLElBQUk7O0NBRUosR0FBRyxLQUFLLFVBQVUsS0FBSyxPQUFPLEdBQUc7O0NBRWpDLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzlDLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQzs7Q0FFekIsSUFBSTs7Q0FFSixHQUFHLEtBQUssUUFBUSxDQUFDLEdBQUcsS0FBSyxJQUFJLEdBQUc7O0NBRWhDLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNwRixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5GLElBQUksTUFBTTs7Q0FFVixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUMsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQyxJQUFJOztDQUVKLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUN0RCxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV4RixHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDeEQsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDeEcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3JELEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Q0FFdEQsR0FBRyxLQUFLLFFBQVEsQ0FBQyxHQUFHLEdBQUc7O0NBRXZCLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3QyxJQUFJLE1BQU07O0NBRVYsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEMsSUFBSTs7Q0FFSixHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUUvQixFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxDQUFDOztDQUVILENBQUMsU0FBUyxhQUFhLEdBQUc7O0NBRTFCLEVBQUUsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUVuQyxFQUFFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0NBQ3pELEVBQUUsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7O0NBRTdELEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUU7O0NBRWpDLEdBQUcsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxTQUFTOztDQUVyRCxHQUFHLCtCQUErQjtDQUNsQyxHQUFHLGdDQUFnQztDQUNuQyxHQUFHLHlCQUF5QjtDQUM1QixHQUFHLHFCQUFxQjtDQUN4QixHQUFHLHdCQUF3QjtDQUMzQixHQUFHLHVCQUF1Qjs7Q0FFMUIsR0FBRywwQkFBMEI7Q0FDN0IsR0FBRyxvQkFBb0I7O0NBRXZCLEdBQUcsbUJBQW1COztDQUV0QixHQUFHLGVBQWU7O0NBRWxCLElBQUksZ0NBQWdDOztDQUVwQyxJQUFJLDBDQUEwQzs7Q0FFOUMsSUFBSSx1QkFBdUI7Q0FDM0IsSUFBSSxnR0FBZ0c7Q0FDcEcsSUFBSSxnR0FBZ0c7O0NBRXBHLElBQUkscUJBQXFCOztDQUV6QixJQUFJLCtEQUErRDtDQUNuRSxJQUFJLHNDQUFzQztDQUMxQyxJQUFJLG1EQUFtRDs7Q0FFdkQsSUFBSSw4QkFBOEI7O0NBRWxDLEdBQUcsR0FBRzs7Q0FFTixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0NBRW5CLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUU7O0NBRW5DLEdBQUcsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxTQUFTOztDQUVyRCxHQUFHLHFCQUFxQjtDQUN4QixHQUFHLHdCQUF3QjtDQUMzQixHQUFHLHdCQUF3Qjs7Q0FFM0IsR0FBRyxzQkFBc0I7Q0FDekIsR0FBRyx3QkFBd0I7Q0FDM0IsR0FBRywyQkFBMkI7Q0FDOUIsR0FBRyx3QkFBd0I7Q0FDM0IsR0FBRyx1QkFBdUI7Q0FDMUIsR0FBRywwQkFBMEI7O0NBRTdCLEdBQUcsbUJBQW1COztDQUV0QixHQUFHLGVBQWU7O0NBRWxCLElBQUksdUNBQXVDOztDQUUzQyxJQUFJLHVDQUF1Qzs7Q0FFM0MsSUFBSSxrRUFBa0U7O0NBRXRFLElBQUksc0JBQXNCOztDQUUxQixLQUFLLGdEQUFnRDtDQUNyRCxLQUFLLHdCQUF3Qjs7Q0FFN0IsS0FBSyx1QkFBdUI7O0NBRTVCLE1BQU0sbURBQW1EOztDQUV6RCxLQUFLLFVBQVU7O0NBRWYsTUFBTSw4QkFBOEI7Q0FDcEMsTUFBTSx1RUFBdUU7Q0FDN0UsTUFBTSxpREFBaUQ7O0NBRXZELEtBQUssR0FBRzs7Q0FFUixLQUFLLGtGQUFrRjs7Q0FFdkYsSUFBSSxHQUFHOztDQUVQLEdBQUcsR0FBRzs7Q0FFTixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0NBRW5CLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNuQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXJDLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDM0MsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUU1QixFQUFFLE9BQU8sT0FBTyxDQUFDOztDQUVqQixFQUFFOztDQUVGLENBQUMsU0FBUyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVwQyxFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHOztDQUV6QyxHQUFHLE9BQU8sQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDOztDQUV4QyxHQUFHLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUc7O0NBRTVCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRXBCLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV0QixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7O0NBRW5CLFNBQVMsUUFBUSxHQUFHOztDQUVwQixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRS9ELENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRWxDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDaEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzs7Q0FFeEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztDQUNqQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztDQUVwQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO0NBQ2hDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7Q0FDdkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQztDQUM5QixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDOztDQUU5QixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0NBQ2xCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7Q0FDaEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLHNCQUFzQixDQUFDO0NBQ3hDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7Q0FDbEMsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztDQUMzQixDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztDQUNqQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0NBQ3ZCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7O0NBRXhCLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0NBQy9CLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7O0NBRXhCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzs7Q0FFeEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7O0NBRWpDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7O0NBRW5CLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O0NBRXJCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRXpCLENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUU7O0NBRTlELENBQUMsVUFBVSxFQUFFLElBQUk7O0NBRWpCLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVoQyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxPQUFPOztDQUVyQyxFQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxHQUFHOztDQUU1QixHQUFHLElBQUksUUFBUSxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEMsR0FBRyxLQUFLLFFBQVEsS0FBSyxTQUFTLEdBQUc7O0NBRWpDLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsMkJBQTJCLEVBQUUsQ0FBQztDQUM1RSxJQUFJLFNBQVM7O0NBRWIsSUFBSTs7Q0FFSixHQUFHLElBQUksWUFBWSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRyxLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0NBRXJDLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLHVDQUF1QyxFQUFFLENBQUM7Q0FDakcsSUFBSSxTQUFTOztDQUViLElBQUk7O0NBRUosR0FBRyxLQUFLLFlBQVksSUFBSSxZQUFZLENBQUMsT0FBTyxHQUFHOztDQUUvQyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWpDLElBQUksTUFBTSxLQUFLLEVBQUUsWUFBWSxJQUFJLFlBQVksQ0FBQyxTQUFTLFFBQVEsUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRzs7Q0FFbEcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVsQyxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssVUFBVSxHQUFHOztDQUVwQztDQUNBLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSSxNQUFNOztDQUVWLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0NBRTNCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLE1BQU0sR0FBRzs7Q0FFaEIsR0FBRyxJQUFJLEdBQUc7Q0FDVixJQUFJLFFBQVEsRUFBRSxFQUFFO0NBQ2hCLElBQUksTUFBTSxFQUFFLEVBQUU7Q0FDZCxJQUFJLENBQUM7O0NBRUwsR0FBRzs7Q0FFSCxFQUFFLElBQUksSUFBSSxHQUFHO0NBQ2IsR0FBRyxRQUFRLEVBQUU7Q0FDYixJQUFJLE9BQU8sRUFBRSxHQUFHO0NBQ2hCLElBQUksSUFBSSxFQUFFLFVBQVU7Q0FDcEIsSUFBSSxTQUFTLEVBQUUsaUJBQWlCO0NBQ2hDLElBQUk7Q0FDSixHQUFHLENBQUM7O0NBRUo7Q0FDQSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztDQUN4QixFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzs7Q0FFeEIsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzs7Q0FFaEQsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUzRSxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQ3RFLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRXRFLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUN2RixFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDdkYsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUN0RSxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQ3RFLEVBQUUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7O0NBRWpHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ2hGLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ3BHLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ3BHLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHOztDQUVoRCxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ25ELEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztDQUVuQyxHQUFHO0NBQ0gsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUc7O0NBRXBELEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7Q0FDdkQsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRWpELEdBQUc7Q0FDSCxFQUFFLEtBQUssSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsR0FBRzs7Q0FFaEUsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNuRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Q0FDbkQsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDOztDQUVqRCxHQUFHO0NBQ0gsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7Q0FDcEgsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7O0NBRXBILEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ2hILEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDOztDQUVoSCxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRzs7Q0FFOUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztDQUNqRCxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Q0FFekMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRzs7Q0FFeEQsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQzs7Q0FFM0QsR0FBRzs7Q0FFSCxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQ3ZELEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7O0NBRXhGLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDeEUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUNwRSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQ3ZELEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7O0NBRTlFLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Q0FDdEQsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkUsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDbEMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDbEMsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0NBRXBDLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDNUQsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztDQUM1RixFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQ2pFLEVBQUUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7Q0FDdkYsRUFBRSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztDQUN6RixFQUFFLEtBQUssSUFBSSxDQUFDLGlCQUFpQixLQUFLLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDOztDQUU1RixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Q0FFeEMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRWxDOztDQUVBLEVBQUUsU0FBUyxnQkFBZ0IsRUFBRSxLQUFLLEdBQUc7O0NBRXJDLEdBQUcsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVuQixHQUFHLE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxHQUFHOztDQUU1QixJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUM1QixJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXhCLElBQUk7O0NBRUosR0FBRyxPQUFPLE1BQU0sQ0FBQzs7Q0FFakIsR0FBRzs7Q0FFSCxFQUFFLEtBQUssTUFBTSxHQUFHOztDQUVoQixHQUFHLElBQUksUUFBUSxHQUFHLGdCQUFnQixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNwRCxHQUFHLElBQUksTUFBTSxHQUFHLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRyxLQUFLLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQ3ZELEdBQUcsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFakQsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7O0NBRTFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztDQUU5QixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztDQUMxQixFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzs7Q0FFMUMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXhDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0NBQ2xDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0NBQ2xDLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzs7Q0FFdEQsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Q0FDcEMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Q0FDcEMsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7O0NBRXRDLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDOztDQUV0QyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7Q0FFcEMsRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDO0NBQ3hELEVBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzs7Q0FFdEQsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7O0NBRXBDLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDOztDQUVwQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7O0NBRXRELEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVsQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztDQUN4QyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7O0NBRWxELEVBQUUsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWM7Q0FDdkMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDOztDQUVwQixFQUFFLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7Q0FFNUIsR0FBRyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0NBQzVCLEdBQUcsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5QixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDO0NBQ2pDLElBQUksU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFNUMsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDOztDQUVsQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7O0NBRTVDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGNBQWMsRUFBRSxVQUFVLEdBQUc7O0NBRXRDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDOztDQUU5QixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0NBQ25CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7O0NBRXBCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRywrRkFBK0YsQ0FBQztDQUNySCxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0VBQWdFLENBQUM7O0NBRXhGLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Q0FDeEIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDOztDQUU3QixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0NBQ2xCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Q0FDckIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztDQUN2QixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7O0NBRTNCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztDQUNuQixFQUFFLFdBQVcsRUFBRSxLQUFLO0NBQ3BCLEVBQUUsU0FBUyxFQUFFLEtBQUs7Q0FDbEIsRUFBRSxXQUFXLEVBQUUsS0FBSztDQUNwQixFQUFFLGdCQUFnQixFQUFFLEtBQUs7Q0FDekIsRUFBRSxDQUFDOztDQUVIO0NBQ0E7Q0FDQSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRztDQUMvQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQ3RCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtDQUNoQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDakIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQzs7Q0FFdEMsQ0FBQyxLQUFLLFVBQVUsS0FBSyxTQUFTLEdBQUc7O0NBRWpDLEVBQUUsS0FBSyxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVMsR0FBRzs7Q0FFN0MsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLHlGQUF5RixFQUFFLENBQUM7O0NBRTlHLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUUvQixFQUFFOztDQUVGLENBQUM7O0NBRUQsY0FBYyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMvRCxjQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7O0NBRXRELGNBQWMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDOztDQUVqRCxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXLE1BQU0sR0FBRzs7Q0FFcEQsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU5QyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztDQUM3QyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzs7Q0FFekMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUV4RCxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Q0FDbkMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDOztDQUVyRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztDQUM3QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFakMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRWpDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0NBQ3pDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDOztDQUV6QyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Q0FFckMsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxJQUFJLEdBQUc7O0NBRXBELENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFekQsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDL0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Q0FDdkMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7O0NBRTNDLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsVUFBVSxHQUFHOztDQUV6QyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQzs7Q0FFakMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLGlCQUFpQixDQUFDOztDQUV2QyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0NBQ3ZCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7O0NBRTNCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0NBRWpCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7O0NBRXRCLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Q0FDN0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzs7Q0FFM0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztDQUN4QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7O0NBRTdCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7Q0FDbEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzs7Q0FFckIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU5QixDQUFDOztDQUVELGlCQUFpQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNsRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDOztDQUU1RCxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDOztDQUV2RCxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUV2RCxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTlDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDOztDQUV6QyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztDQUNqQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzs7Q0FFekMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVqQyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztDQUMvQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7Q0FDbkQsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOztDQUVqRCxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztDQUNuQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7O0NBRXJELENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRTFCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxTQUFTLEtBQUssR0FBRyxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDNUYsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFNUYsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7O0NBRS9CLENBQUMsTUFBTSxFQUFFLElBQUk7O0NBRWIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUU1QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFbEMsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7O0NBRXhCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7Q0FDeEIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDOztDQUV4QixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFckQsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdEIsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQzFCLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUM1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRTVCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUM1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUU1QixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLHNCQUFzQixFQUFFLFdBQVcsU0FBUyxHQUFHOztDQUVoRCxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7Q0FDeEIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQzs7Q0FFeEIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQztDQUN4QixFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsUUFBUSxDQUFDO0NBQ3hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxRQUFRLENBQUM7O0NBRXhCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdEQsR0FBRyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUM1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUU1QixHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQzVCLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFNUIsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFD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QUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQzs7Q0FFL0QsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFL0IsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUMzRCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyRCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUV0RCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxFQUFFLGNBQWMsR0FBRzs7Q0FFbEQ7Q0FDQTs7Q0FFQSxFQUFFLElBQUksTUFBTSxHQUFHLGNBQWMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUvQyxFQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUc7Q0FDbkIsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Q0FDekQsR0FBRyxDQUFDOztDQUVKLEVBQUU7O0NBRUYsQ0FBQyxhQUFhLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRWpDO0NBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN6RCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7O0NBRW5FLEVBQUU7O0NBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFlBQVk7O0NBRWpDLEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLFNBQVMsZ0JBQWdCLEVBQUUsTUFBTSxHQUFHOztDQUU3QztDQUNBLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVsRDtDQUNBLEdBQUcsT0FBTyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUvRixHQUFHLENBQUM7O0NBRUosRUFBRSxJQUFJOztDQUVOLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQztDQUNBOztDQUVBLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDOztDQUVmLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUc7O0NBRTVCLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3JDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUVyQyxHQUFHLE1BQU07O0NBRVQsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDckMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFNUIsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXRDLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFH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LEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWhGLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFaEMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVoQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWxFLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNqRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxLQUFLLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXJELENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFOztDQUVqQyxDQUFDLEdBQUcsRUFBRSxXQUFXLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDN0IsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRSxjQUFjLEdBQUc7O0NBRTFELEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLGNBQWMsS0FBSyxTQUFTLEdBQUc7O0NBRXZDLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFbEMsSUFBSSxNQUFNOztDQUVWLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXBELElBQUk7O0NBRUosR0FBRyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7O0NBRXZCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5GLElBQUk7O0NBRUosR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTFDLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUUzQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNwQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFOUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsU0FBUyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRzs7Q0FFOUIsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFbkMsRUFBRSxTQUFTLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUc7O0NBRXJGLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXJDLEVBQUUsU0FBUyxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHOztDQUUzRCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXZDLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztDQUU5QyxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sU0FBUyxHQUFHLFNBQVMsRUFBRSxDQUFDOztDQUVyRixFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUVqQyxFQUFFLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDOztDQUV0QyxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRXJGLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxLQUFLLEVBQUUsY0FBYyxHQUFHOztDQUVoRCxFQUFFLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTdELEVBQUUsSUFBSSxNQUFNLEdBQUcsY0FBYyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRS9DLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRSxLQUFLLGFBQWEsS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRzs7Q0FFdkQsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUN6QyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTNELEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7Q0FFaEIsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLGNBQWMsR0FBRzs7Q0FFN0MsRUFBRSxJQUFJLEdBQUcsR0FBRyxjQUFjLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQzs7Q0FFekMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3RDLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXBDLEVBQUUsT0FBTyxHQUFHLENBQUM7O0NBRWIsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFbkMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNyQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFekQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVoQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU1QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRTdCLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWxGLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsT0FBTyxHQUFHOztDQUVuQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUc7O0NBRWpCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ1QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFVCxFQUFFLENBQUM7O0NBRUgsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsK0VBQStFLEVBQUUsQ0FBQzs7Q0FFbkcsRUFBRTs7Q0FFRixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsQ0FBQyxTQUFTLEVBQUUsSUFBSTs7Q0FFaEIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFL0QsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsUUFBUSxFQUFFLFlBQVk7O0NBRXZCLEVBQUUsSUFBSSxDQUFDLEdBQUc7O0NBRVYsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNWLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVWLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRTNELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXRCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxRCxFQUFFLE9BQU8s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QUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsRCxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWxELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUU5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Q0FFM0MsRUFBRSxPQUFP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Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTNDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRzs7Q0FFZixFQUFFLEVBQUUsRUFBRSxLQUFLLFNBQVMsS0FBSyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUU7Q0FDekMsRUFBRSxFQUFFLEVBQUUsS0FBSyxTQUFTLEtBQUssRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFO0NBQ3pDLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxLQUFLLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRTtDQUN6QyxFQUFFLEVBQUUsRUFBRSxLQUFLLFNBQVMsS0FBSyxFQUFFLEdBQUcsSUFBSSxLQUFLLEVBQUU7Q0FDekMsRUFBRSxFQUFFLEVBQUUsS0FBSyxTQUFTLEtBQUssRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFO0NBQ3pDLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxLQUFLLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRTs7Q0FFekMsRUFBRSxDQUFDOztDQUVILENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFOztDQUVsQyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUxQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRTNCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLE9BQU8sR0FBRzs7Q0FFNUIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUUzQixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWpDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTNDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUUvQixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Q0FDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0NBQ3RCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2pFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2pFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3JFLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV6RSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3pGLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDekYsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUN6RixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3pGLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDMUYsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFMUYsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsWUFBWTs7Q0FFL0IsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDOztDQUU1QixFQUFFLE9BQU8sU0FBUyxnQkFBZ0IsRUFBRSxNQUFNLEdBQUc7O0NBRTdDLEdBQUcsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFbEMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxjQUFjLEtBQUssSUFBSTtDQUN4QyxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDOztDQUVyQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtDQUN6QyxLQUFLLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRXhDLEdBQUcsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZOztDQUUvQixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7O0NBRTVCLEVBQUUsT0FBTyxTQUFTLGdCQUFnQixFQUFFLE1BQU0sR0FBRzs7Q0FFN0MsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztDQUN0QyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUU3QyxHQUFHLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUxQyxHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXZDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUMzQixFQUFFLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Q0FDN0IsRUFBRSxJQUFJLFNBQVMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0NBRWxDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFakMsR0FBRyxJQUFJLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV4RCxHQUFHLEtBQUssUUFBUSxHQUFHLFNBQVMsR0FBRzs7Q0FFL0IsSUFBSSxPQUFPLEtBQUssQ0FBQzs7Q0FFakIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxZQUFZOztDQUU1QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFO0NBQ3hCLEdBQUcsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXRCLEVBQUUsT0FBTyxTQUFTLGFBQWEsRUFBRSxHQUFHLEdBQUc7O0NBRXZDLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFNUIsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxJQUFJLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEQsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXRELElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN6QyxJQUFJLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXpDOztDQUVBLElBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRTVCLEtBQUssT0FBTyxLQUFLLENBQUM7O0NBRWxCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxhQUFhLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRW5DLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqQyxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRW5ELElBQUksT0FBTyxLQUFLLENBQUM7O0NBRWpCLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxjQUFjLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxHQUFHOztDQUV0RSxDQUFDLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPO0NBQzVCLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLO0NBQzFCLEVBQUUsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFO0NBQzFCLEVBQUUsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUU7O0NBRW5DLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPOztDQUVqQyxFQUFFLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBRTtDQUNoQyxFQUFFLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLFlBQVksQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRTs7Q0FFN0YsRUFBRSxXQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDN0IsRUFBRSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFBRTs7Q0FFckMsRUFBRSxhQUFhLEdBQUcsQ0FBQztDQUNuQixFQUFFLGFBQWEsR0FBRyxDQUFDOztDQUVuQixFQUFFLHlCQUF5QixHQUFHLEVBQUUsYUFBYSxHQUFHLGFBQWEsS0FBSyxDQUFDOztDQUVuRSxFQUFFLGVBQWUsR0FBRyxJQUFJLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtDQUMxRCxFQUFFLGtCQUFrQixHQUFHLElBQUksS0FBSyxFQUFFLHlCQUF5QixFQUFFOztDQUU3RCxFQUFFLGNBQWMsR0FBRyxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxjQUFjLEdBQUc7Q0FDdEIsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtDQUMxRSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDNUUsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7Q0FDZixFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtDQUN4RSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzFFLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksZUFBZSxHQUFHO0NBQ3ZCLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFO0NBQzdDLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFO0NBQzdDLEVBQUUsQ0FBQzs7Q0FFSDs7Q0FFQSxDQUFDLElBQUkscUJBQXFCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0NBQ3JELENBQUMscUJBQXFCLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDO0NBQ3ZELENBQUMscUJBQXFCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7Q0FFdkMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7Q0FDbEQsQ0FBQyxJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUV2RSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyx5QkFBeUIsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFMUQsRUFBRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxhQUFhLE9BQU8sQ0FBQyxDQUFDO0NBQ2hELEVBQUUsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDLEdBQUcsYUFBYSxPQUFPLENBQUMsQ0FBQzs7Q0FFaEQsRUFBRSxJQUFJLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNwRCxFQUFFLGFBQWEsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0NBQzNDLEVBQUUsYUFBYSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7O0NBRXZDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQzs7Q0FFdkMsRUFBRSxJQUFJLGdCQUFnQixHQUFHLElBQUksY0FBYyxFQUFFO0NBQzdDLEdBQUcsT0FBTyxFQUFFO0NBQ1osSUFBSSxlQUFlLEVBQUUsRUFBRTtDQUN2QixJQUFJO0NBQ0osR0FBRyxRQUFRLEVBQUUsZ0JBQWdCO0NBQzdCLEdBQUcsWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO0NBQzVDLEdBQUcsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjO0NBQ2hELEdBQUcsWUFBWSxFQUFFLFdBQVc7Q0FDNUIsR0FBRyxRQUFRLEVBQUUsV0FBVztDQUN4QixHQUFHLFFBQVEsRUFBRSxJQUFJO0NBQ2pCLEdBQUcsRUFBRSxDQUFDOztDQUVOLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7O0NBRTdDLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7O0NBRWxCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7O0NBRXRCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Q0FDeEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7Q0FFMUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQzs7Q0FFMUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQ2hDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFMUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxHQUFHLE9BQU87Q0FDeEMsRUFBRSxLQUFLLEtBQUssQ0FBQyxVQUFVLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssS0FBSyxHQUFHLE9BQU87O0NBRTFFLEVBQUUsS0FBSyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxPQUFPOztDQUUzQztDQUNBLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDOUIsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDdkMsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVqQzs7Q0FFQSxFQUFFLElBQUksU0FBUyxFQUFFLFlBQVksQ0FBQzs7Q0FFOUIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUU3RCxHQUFHLElBQUksS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxHQUFHLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0NBRTdCLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUUvQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLENBQUM7Q0FDckUsSUFBSSxTQUFTOztDQUViLElBQUk7O0NBRUosR0FBRyxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0NBQ3BDLEdBQUcsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFcEMsR0FBRyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztDQUVyRCxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQ3pDLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUUzQyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUc7O0NBRXRDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNsQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7O0NBRXhCLElBQUksSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQztDQUNuQyxJQUFJLElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7O0NBRXBDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBLElBQUksZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDekU7Q0FDQSxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDL0Q7Q0FDQSxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3pFO0NBQ0EsSUFBSSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3JFO0NBQ0EsSUFBSSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUNsRTtDQUNBLElBQUksZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFOUQsSUFBSSxjQUFjLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztDQUM1QixJQUFJLGNBQWMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDOzs7Q0FHNUI7Q0FDQTs7Q0FFQSxJQUFJLFlBQVksQ0FBQyxlQUFlLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUcsSUFBSSxNQUFNOztDQUVWLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNsQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7O0NBRXpCLElBQUksV0FBVyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ3ZDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Q0FDckMsSUFBSSxZQUFZLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFM0U7O0NBRUEsSUFBSSxZQUFZLENBQUMsR0FBRztDQUNwQixLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FDdkIsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQ3ZCLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztDQUN2QixLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FDdkIsS0FBSyxDQUFDOztDQUVOLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztDQUMzRCxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O0NBRTdELElBQUk7O0NBRUosR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxHQUFHOztDQUU5QixJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFMUYsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksaUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0NBQ25GLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDOztDQUV4RCxJQUFJLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOztDQUUxQyxJQUFJOztDQUVKLEdBQUcsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEdBQUc7O0NBRW5DLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7O0NBRTlCLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUMxQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFckI7Q0FDQTs7Q0FFQSxHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxTQUFTLEVBQUUsSUFBSSxHQUFHLEdBQUc7O0NBRW5ELElBQUksS0FBSyxZQUFZLEdBQUc7O0NBRXhCLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDL0MsS0FBSyxXQUFXLENBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0NBQy9DLEtBQUssWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7Q0FDN0MsS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ3hDLEtBQUssWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Q0FDdEMsS0FBSyxZQUFZLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFNUUsS0FBSyxJQUFJLFlBQVksR0FBRyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDaEQsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVyQyxLQUFLOztDQUVMOztDQUVBLElBQUksaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0NBQ3pHLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUVoRDs7Q0FFQSxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFOUQsSUFBSTs7Q0FFSixHQUFHOztDQUVIO0NBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7Q0FDN0MsRUFBRSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7Q0FDN0MsRUFBRSxTQUFTLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7Q0FFNUIsRUFBRSxDQUFDOztDQUVILENBQUMsU0FBUyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsR0FBRzs7Q0FFakYsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVqQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQzs7Q0FFcEIsRUFBRSxJQUFJLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztDQUN6QyxFQUFFLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQzs7Q0FFbEQsRUFBRSxLQUFLLFlBQVksR0FBRzs7Q0FFdEIsR0FBRyxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztDQUN6QyxHQUFHLGNBQWMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUM7O0NBRWxELEdBQUc7O0NBRUgsRUFBRSxLQUFLLEVBQUUsY0FBYyxHQUFHOztDQUUxQixHQUFHLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQzs7Q0FFM0IsR0FBRyxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUc7O0NBRWhDLElBQUksS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLGdCQUFnQixHQUFHOztDQUVqRCxLQUFLLFdBQVcsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRWpJLEtBQUssTUFBTSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHOztDQUVsRCxLQUFLLFdBQVcsR0FBRyxRQUFRLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFN0UsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsS0FBSyxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssS0FBSyxHQUFHOztDQUU5RCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOEVBQThFLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNHLElBQUk7O0NBRUosR0FBRyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0NBRS9ELEdBQUcsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOztDQUV4QixHQUFHLEtBQUssV0FBVyxHQUFHLFlBQVksSUFBSSxhQUFhLENBQUM7Q0FDcEQsR0FBRyxLQUFLLFdBQVcsR0FBRyxZQUFZLElBQUksYUFBYSxDQUFDOztDQUVwRCxHQUFHLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxNQUFNOztDQUVULEdBQUcsTUFBTSxHQUFHLGNBQWMsQ0FBQzs7Q0FFM0IsR0FBRzs7Q0FFSCxFQUFFLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtDQUNyQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssSUFBSTtDQUNqQyxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7Q0FFM0M7Q0FDQTs7Q0FFQSxHQUFHLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7O0NBRWhELEdBQUcsSUFBSSxtQkFBbUIsR0FBRyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXBELEdBQUcsS0FBSyxtQkFBbUIsS0FBSyxTQUFTLEdBQUc7O0NBRTVDLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0NBQzdCLElBQUksY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLG1CQUFtQixDQUFDOztDQUVqRCxJQUFJOztDQUVKLEdBQUcsSUFBSSxjQUFjLEdBQUcsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXBELEdBQUcsS0FBSyxjQUFjLEtBQUssU0FBUyxHQUFHOztDQUV2QyxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDcEMsSUFBSSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxjQUFjLENBQUM7O0NBRWpELElBQUk7O0NBRUosR0FBRyxNQUFNLEdBQUcsY0FBYyxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0NBQ3BDLEVBQUUsTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztDQUV4QyxFQUFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7O0NBRTNCLEVBQUUsS0FBSyxLQUFLLENBQUMsaUJBQWlCLElBQUksSUFBSSxJQUFJLFVBQVUsR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDOztDQUVwQixHQUFHOztDQUVILEVBQUUsS0FBSyxLQUFLLENBQUMsa0JBQWtCLEdBQUc7O0NBRWxDLEdBQUcsS0FBSyxJQUFJLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxRQUFRLENBQUM7Q0FDN0MsUUFBUSxLQUFLLElBQUksS0FBSyxRQUFRLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQzs7Q0FFbEQsR0FBRzs7Q0FFSCxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOztDQUVyQixFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztDQUM1QyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQzs7Q0FFbEQsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDO0NBQzFELEVBQUUsTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztDQUV4QyxFQUFFLEtBQUssWUFBWSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFaEUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLENBQUM7O0NBRTdELEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7Q0FFaEIsRUFBRTs7Q0FFRixDQUFDLFNBQVMsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRzs7Q0FFckUsRUFBRSxLQUFLLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxHQUFHLE9BQU87O0NBRXpDLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVwRCxFQUFFLEtBQUssT0FBTyxNQUFNLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUc7O0NBRTFFLEdBQUcsS0FBSyxNQUFNLENBQUMsVUFBVSxNQUFNLEVBQUUsTUFBTSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRzs7Q0FFakcsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRW5HLElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUM3QyxJQUFJLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRW5DLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHOztDQUVyQyxLQUFLLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRWxDLEtBQUssTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFekQsTUFBTSxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsTUFBTSxJQUFJLGFBQWEsR0FBRyxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUUxRCxNQUFNLEtBQUssYUFBYSxJQUFJLGFBQWEsQ0FBQyxPQUFPLEdBQUc7O0NBRXBELE9BQU8sSUFBSSxhQUFhLEdBQUcsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztDQUN4RyxPQUFPLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVsRyxPQUFPOztDQUVQLE1BQU07O0NBRU4sS0FBSyxNQUFNLEtBQUssUUFBUSxDQUFDLE9BQU8sR0FBRzs7Q0FFbkMsS0FBSyxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0NBQ2pHLEtBQUssU0FBUyxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRS9GLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFakMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFckUsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7Q0FDQTtDQUNBOztDQUVBLFNBQVMsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQUc7O0NBRWxDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDakUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsU0FBUyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFMUUsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUU7O0NBRTlCLENBQUMsR0FBRyxFQUFFLFdBQVcsTUFBTSxFQUFFLFNBQVMsR0FBRzs7Q0FFckMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUM3QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFeEIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRXZDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLEdBQUc7O0NBRXBDLEVBQUUsSUFBSSxNQUFNLEdBQUcsY0FBYyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRS9DLEVBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUUsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFeEIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUUxRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsWUFBWTs7Q0FFckIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxNQUFNLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXhDLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxFQUFFLGNBQWMsR0FBRzs7Q0FFekQsRUFBRSxJQUFJLE1BQU0sR0FBRyxjQUFjLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUMvQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUMxQyxFQUFFLElBQUksaUJBQWlCLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRXZELEVBQUUsS0FBSyxpQkFBaUIsR0FBRyxDQUFDLEdBQUc7O0NBRS9CLEdBQUcsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFckMsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUYsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFckMsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXRELEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZOztDQUVoQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLGlCQUFpQixFQUFFLEtBQUssR0FBRzs7Q0FFN0MsR0FBRyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUVyRjs7Q0FFQSxHQUFHLEtBQUssaUJBQWlCLEdBQUcsQ0FBQyxHQUFHOztDQUVoQyxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbEQsSUFBSTs7Q0FFSixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXBGLEdBQUcsT0FBTyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXhDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxtQkFBbUIsRUFBRSxZQUFZOztDQUVsQyxFQUFFLElBQUksU0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQzdCLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRSxPQUFPLFNBQVMsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsR0FBRzs7Q0FFNUY7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3hELEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDM0MsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRTdDLEdBQUcsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDN0MsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQzVDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDdkMsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDakMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDM0IsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7Q0FDdkMsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQzs7Q0FFL0IsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUc7O0NBRWxCOztDQUVBLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUM7O0NBRTdCLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHOztDQUVuQixLQUFLLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHOztDQUUzQixNQUFNLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRzs7Q0FFMUI7Q0FDQTs7Q0FFQSxPQUFPLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDNUIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDO0NBQ3BCLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQztDQUNwQixPQUFPLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RixPQUFPLE1BQU07O0NBRWI7O0NBRUEsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO0NBQ3RCLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQy9DLE9BQU8sT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXRELE9BQU87O0NBRVAsTUFBTSxNQUFNOztDQUVaOztDQUVBLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDO0NBQ3ZCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzlDLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXJELE1BQU07O0NBRU4sS0FBSyxNQUFNOztDQUVYLEtBQUssS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRTNCOztDQUVBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDdkQsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQzNGLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXJELE1BQU0sTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEdBQUc7O0NBRWhDOztDQUVBLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNiLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2hFLE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsTUFBTSxNQUFNOztDQUVaOztDQUVBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxHQUFHLFNBQVMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3JELE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDekYsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFckQsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVjs7Q0FFQSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsU0FBUyxDQUFDO0NBQy9DLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzVDLElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRW5ELElBQUk7O0NBRUosR0FBRyxLQUFLLGtCQUFrQixHQUFHOztDQUU3QixJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXRGLElBQUk7O0NBRUosR0FBRyxLQUFLLHNCQUFzQixHQUFHOztDQUVqQyxJQUFJLHNCQUFzQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVoRixJQUFJOztDQUVKLEdBQUcsT0FBTyxPQUFPLENBQUM7O0NBRWxCLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxlQUFlLEVBQUUsWUFBWTs7Q0FFOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsR0FBRzs7Q0FFNUQsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQy9DLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDckMsR0FBRyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxFQUFFLEdBQUcsT0FBTyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVuQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUV2QztDQUNBLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFdEI7Q0FDQSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRXRCO0NBQ0EsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFdkM7Q0FDQTtDQUNBO0NBQ0EsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFdEQ7Q0FDQSxHQUFHLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXhDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdkMsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0NBRWhFLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXJDLEVBQUUsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUV2RCxFQUFFLEtBQUssV0FBVyxLQUFLLENBQUMsR0FBRzs7Q0FFM0I7Q0FDQSxHQUFHLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHOztDQUVyRCxJQUFJLE9BQU8sQ0FBQyxDQUFDOztDQUViLElBQUk7O0NBRUo7O0NBRUEsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQzs7Q0FFL0U7O0NBRUEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQzs7Q0FFNUIsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLEtBQUssRUFBRSxjQUFjLEdBQUc7O0NBRXBELEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLEdBQUc7O0NBRXBCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXRDLEVBQUU7O0NBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXJDOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXpELEVBQUUsS0FBSyxXQUFXLEtBQUssQ0FBQyxHQUFHOztDQUUzQixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUgsRUFBRSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRXZELEVBQUUsS0FBSyxXQUFXLEdBQUcsV0FBVyxHQUFHLENBQUMsR0FBRzs7Q0FFdkMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHOztDQUVIOztDQUVBLEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLFlBQVksRUFBRSxXQUFXLEdBQUcsRUFBRSxjQUFjLEdBQUc7O0NBRWhELEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQzs7Q0FFN0MsRUFBRSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0NBQ3BDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Q0FDakMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOztDQUVsQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRTNCLEVBQUUsS0FBSyxPQUFPLElBQUksQ0FBQyxHQUFHOztDQUV0QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0NBQzdDLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7O0NBRTdDLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0NBQzdDLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7O0NBRTdDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0NBRXRCLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Q0FDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFOUMsR0FBRyxNQUFNOztDQUVULEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Q0FDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFOUMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFMUQ7Q0FDQTs7Q0FFQSxFQUFFLEtBQUssS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7O0NBRXBELEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0NBRXRCLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Q0FDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFOUMsR0FBRyxNQUFNOztDQUVULEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7Q0FDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFOUMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFMUQsRUFBRSxL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Q0FFckMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNoQixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENB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VSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxPQUFPLFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7Q0FFbkMsR0FBRyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxPQUFPLFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7Q0FFbkMsR0FBRyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxPQUFPLFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7Q0FFbkMsR0FBRyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsZUFBZSxFQUFFLFlBQVk7O0NBRTlCO0NBQ0E7O0NBRUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxlQUFlLEVBQUUsSUFBSSxFQUFFLFFBQVEsR0FBRzs7Q0FFcEQsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7O0NBRXRELEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDOztDQUV0RCxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxVQUFVLEVBQUUsWUFBWTs7Q0FFekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQyxFQUFFLE9BQU8sU0FBUyxVQUFVLEVBQUUsUUFBUSxHQUFHOztDQUV6QyxHQUFHLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxVQUFVLEVBQUUsWUFBWTs7Q0FFekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQyxFQUFFLE9BQU8sU0FBUyxVQUFVLEVBQUUsUUFBUSxHQUFHOztDQUV6QyxHQUFHLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxVQUFVLEVBQUUsWUFBWTs7Q0FFekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQyxFQUFFLE9BQU8sU0FBUyxVQUFVLEVBQUUsUUFBUSxHQUFHOztDQUV6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Q0FBQzs7Q0FFOUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRWpDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV6QyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENB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cUIsQ0FBQzs7O0NBR3BFLFNBQVMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsR0FBRzs7Q0FFakQsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFakUsQ0FBQzs7Q0FFRCxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDNUUsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQzs7O0NBR2xFLFNBQVMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLFFBQVEsR0FBRzs7Q0FFbEQsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFbEUsQ0FBQzs7Q0FFRCxxQkFBcUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDN0UscUJBQXFCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQzs7O0NBR3BFLFNBQVMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFFBQVEsR0FBRzs7Q0FFbkQsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFbkUsQ0FBQzs7Q0FFRCxzQkFBc0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDOUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQzs7O0NBR3RFLFNBQVMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFFBQVEsR0FBRzs7Q0FFbkQsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJ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QUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXBGLElBQUk7O0NBRUosR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFELElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdELElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRzs7Q0FFN0MsR0FBRyxJQUFJLGFBQWEsR0FBRyxPQUFPLEtBQUssU0FBUyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckksR0FBRyxJQUFJLFlBQVksR0FBRyxNQUFNLEtBQUssU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXRJLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7Q0FFL0UsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFHLElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdHLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFM0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUMsSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVCLElBQUksSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztDQUM1QixJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7O0NBRTVCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztDQUU5RCxLQUFLLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEMsTUFBTSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRXZGLE1BQU0sTUFBTTs7Q0FFWixNQUFNLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFdEQsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUVoQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0NBRWxELEtBQUssT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakUsS0FBSzs7Q0FFTCxJQUFJLE1BQU07O0NBRVYsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFeEQsS0FBSyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVoQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUU1QixFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRXZDLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVuRCxHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsY0FBYyxLQUFLLElBQUksR0FBRzs7Q0FFMUMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXpELEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O0NBRTVCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWpELEVBQUUsT0FBTyxNQUFNLENBQUM7O0NBRWhCLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsWUFBWTs7Q0FFeEIsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7Q0FFL0IsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztDQUMxQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDOztDQUUxQyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7O0NBRTFDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM3QixFQUFFLE1BQU0sQ0FBQyxHQUFHO0NBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztDQUMxQixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0NBQzFCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7Q0FDMUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2IsR0FBRyxDQUFDOztDQUVKLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFN0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsa0JBQWtCLEVBQUUsWUFBWTs7Q0FFakMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUxRCxHQUFHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTlCLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDcEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNwQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVwQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDM0IsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVsQixHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFbEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxZQUFZLEdBQUc7O0NBRWpELEVBQUUsS0FBSyxZQUFZLEtBQUssU0FBUyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7O0NBRXhELEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQzs7Q0FFbkMsRUFBRSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFL0MsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXpELEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRWpDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLFlBQVksR0FBRzs7Q0FFdEI7Q0FDQTs7Q0FFQSxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbEIsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU5QyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDakMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDakMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWpDLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDNUIsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM1QixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5CLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDakMsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNqQyxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVqQyxJQUFJOztDQUVKLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUU3QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDMUMsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDMUMsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTFDLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFekQsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRTdCLEdBQUc7O0NBRUgsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXRELEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLEdBQUcsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Q0FFMUMsR0FBRyxLQUFLLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHOztDQUVyQyxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2xELElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDbEQsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbEQsSUFBSSxNQUFNOztDQUVWLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDcEQsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNwRCxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVwRCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFL0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDOztDQUVqQyxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyx3QkFBd0IsRUFBRSxZQUFZOztDQUV2QyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUM7O0NBRWxCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O0NBRTVCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixHQUFHLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7O0NBRTFDLEdBQUcsS0FBSyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7Q0FFckMsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUMzQyxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzNDLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTNDLElBQUksTUFBTTs7Q0FFVixJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQzdDLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDN0MsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFN0MsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0NBRS9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7Q0FFakMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsWUFBWTs7Q0FFbEMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUM7O0NBRXpCO0NBQ0E7Q0FDQTs7Q0FFQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdEQsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixHQUFHOztDQUV0QyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVwRCxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFbEQsSUFBSTs7Q0FFSixHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQzs7Q0FFM0UsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRS9ELElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLEVBQUUsR0FBRzs7Q0FFL0MsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFekUsS0FBSyxNQUFNOztDQUVYLEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXZFLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztDQUM5QixFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFNUIsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTdEOztDQUVBLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0NBRW5DLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7Q0FDNUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7O0NBRTlDLElBQUksSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7Q0FDNUQsSUFBSSxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDOztDQUVoRSxJQUFJLElBQUksVUFBVSxFQUFFLGFBQWEsQ0FBQzs7Q0FFbEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXhELEtBQUssVUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDaEMsS0FBSyxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDOztDQUU5RSxLQUFLLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDdkMsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7O0NBRTVDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDOztDQUVBLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Q0FFckQ7O0NBRUEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUMvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztDQUVqQzs7Q0FFQSxHQUFHLElBQUksVUFBVSxFQUFFLGFBQWEsQ0FBQzs7Q0FFakMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0MsSUFBSSxhQUFhLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEQsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFbkMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDcEQsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDcEQsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXBELElBQUk7O0NBRUosR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdEQsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztDQUMzQyxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDOztDQUVyRCxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxvQkFBb0IsRUFBRSxZQUFZOztDQUVuQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNaLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFL0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFaEIsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXZELElBQUk7O0NBRUosR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFL0IsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsa0JBQWtCLEVBQUUsWUFBWTs7Q0FFakMsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxHQUFHOztDQUVuQyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakMsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLHFCQUFxQixFQUFFLFlBQVk7O0NBRXBDLEVBQUUsS0FBSyxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7O0NBRXRDLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRXJELEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxRQUFRLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixHQUFHOztDQUUzRCxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsT0FBTyxLQUFLLEdBQUc7O0NBRXZELEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxxRUFBcUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUNwRyxHQUFHLE9BQU87O0NBRVYsR0FBRzs7Q0FFSCxFQUFFLElBQUksWUFBWTtDQUNsQixHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07Q0FDdEMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDNUIsR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVE7Q0FDaEMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUs7Q0FDdEIsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUs7Q0FDMUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUU7Q0FDakMsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUU7Q0FDckMsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU07Q0FDeEIsR0FBRyxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7Q0FFN0IsRUFBRSxLQUFLLG1CQUFtQixLQUFLLFNBQVMsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7O0NBRW5FLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFMUQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXpELEdBQUcsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixHQUFHLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFbkMsR0FBRyxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFakUsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVoQyxHQUFHOztDQUVIOztDQUVBLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUV4QyxHQUFHOztDQUVIOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxELEdBQUcsSUFBSSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSztDQUNsRCxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhO0NBQzFDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Q0FFekMsR0FBRyxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQztDQUMvRixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkMsR0FBRyxLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0NBRXJDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRTdELElBQUk7O0NBRUosR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxFLElBQUksTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU1QyxJQUFJLEtBQUssWUFBWSxLQUFLLFNBQVMsR0FBRzs7Q0FFdEMsS0FBSyxNQUFNLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUVyRCxLQUFLOztDQUVMLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDLElBQUk7O0NBRUosR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXJDLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqRSxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVoRCxJQUFJOztDQUVKLEdBQUcsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLG1CQUFtQixDQUFDOztDQUVyRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTNCLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFaEQsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbkMsR0FBRyxLQUFLLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRTNCLElBQUksU0FBUzs7Q0FFYixJQUFJOztDQUVKLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkQsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVuQyxJQUFJOztDQUVKLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUU5QixFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sT0FBTyxLQUFLLEdBQUc7O0NBRTNDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxpRUFBaUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUM1RixHQUFHLE9BQU87O0NBRVYsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRS9DLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRTs7Q0FFRjtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDO0NBQ2IsRUFBRSxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7Q0FDMUIsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQztDQUNsRCxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUM7Q0FDbEIsRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyQixFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFekQsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMxQixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDOztDQUVuSCxHQUFHLEtBQUssV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLFNBQVMsR0FBRzs7Q0FFM0MsSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzNCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDdEMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRXJDLElBQUksTUFBTTs7Q0FFVjtDQUNBLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsSUFBSTs7Q0FFSixHQUFHOzs7Q0FHSDtDQUNBO0NBQ0EsRUFBRSxJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQzs7Q0FFL0IsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXRELEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzlCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzlCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFD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LEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXZDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXJELEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOztDQUUzQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV6RCxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTFDLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxJQUFJLGNB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QUUsQ0FBQzs7Q0FFeEMsS0FBSzs7Q0FFTCxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXhELEtBQUssSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3QixLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Q0FDN0IsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztDQUU3QixLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFL0QsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDaEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDaEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWhDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDcEMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNwQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVwQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzlCLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDOUIsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVyQixNQUFNLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQzVCLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ2hDLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQzVCLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ2hDLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQzVCLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ2hDLE1BQU0sT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSSxNQUFNOztDQUVWOztDQUVBLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztDQUU3RCxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3RDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV0QyxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzdCLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDN0IsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVwQixLQUFLLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ3pCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQzdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUU3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0NBRTdCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUUzQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFeEMsR0FBRzs7Q0FFSCxF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QVc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRTs7Q0FFRixDQUFDLHNCQUFzQixFQUFFLFlBQVk7O0NBRXJDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztDQUMxRCxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDMUQsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7Q0FDMUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7O0NBRTFDLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNyQixFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3BCLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkIsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxHQUFHOztDQUU1QixHQUFHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNyRSxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUN2RSxHQUFHLElBQUksTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQzdELEdBQUcsSUFBSSxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRTlELEdBQUcsSUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztDQUNsRCxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO0NBQ3ZELEdBQUcsR0FBRyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQztDQUNqRCxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDOztDQUV4RCxHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUYsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUxRCxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Q0FDN0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7O0NBRTdCLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTlFLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxlQUFlLEVBQUUsRUFBRSxHQUFHOztDQUUvQixDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsQ0FBQyxTQUFTLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztDQUVoRCxFQUFFLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7Q0FDOUIsRUFBRSxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQzs7Q0FFbkUsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRWpDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdEMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTVDLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0NBRS9CLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQzs7Q0FFdEIsRUFBRSxLQUFLLEtBQUssWUFBWSxZQUFZLEdBQUc7O0NBRXZDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7O0NBRW5CLEdBQUcsTUFBTSxLQUFLLEtBQUssWUFBWSxZQUFZLEdBQUc7O0NBRTlDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw4Q0FBOEMsRUFBRSxDQUFDOztDQUVsRSxHQUFHLE1BQU0sS0FBSyxLQUFLLFlBQVksV0FBVyxHQUFHOztDQUU3QyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDOztDQUU1QixHQUFHLE1BQU0sS0FBSyxLQUFLLFlBQVksVUFBVSxHQUFHOztDQUU1QyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDOztDQUVuQixHQUFHLE1BQU0sS0FBSyxLQUFLLFlBQVksV0FBVyxHQUFHOztDQUU3QyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDOztDQUUxQixHQUFHLE1BQU0sS0FBSyxLQUFLLFlBQVksVUFBVSxHQUFHOztDQUU1QyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDOztDQUVqQixHQUFHLE1BQU0sS0FBSyxLQUFLLFlBQVksU0FBUyxHQUFHOztDQUUzQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDOztDQUVsQixHQUFHLE1BQU0sS0FBSyxLQUFLLFlBQVksVUFBVSxHQUFHOztDQUU1QyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUUsT0FBTztDQUNULEdBQUcsTUFBTSxFQUFFLE1BQU07Q0FDakIsR0FBRyxJQUFJLEVBQUUsSUFBSTtDQUNiLEdBQUcsZUFBZSxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7Q0FDM0MsR0FBRyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87Q0FDN0IsR0FBRyxDQUFDOztDQUVKLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsR0FBRzs7Q0FFeEQsRUFBRSxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO0NBQzlCLEVBQUUsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQzs7Q0FFMUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEtBQUssS0FBSyxHQUFHOztDQUVyQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRXRELEdBQUcsTUFBTSxLQUFLLFdBQVcsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUc7O0NBRTFDOztDQUVBLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUU1QyxHQUFHLE1BQU0sS0FBSyxXQUFXLENBQUMsS0FBSyxLQUFLLENBQUMsR0FBRzs7Q0FFeEMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLHlLQUF5SyxFQUFFLENBQUM7O0NBRTlMLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQjtDQUM3RSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVuRixHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztDQUV6QixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxTQUFTLEdBQUcsRUFBRSxTQUFTLEdBQUc7O0NBRTNCLEVBQUUsS0FBSyxTQUFTLENBQUMsNEJBQTRCLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7O0NBRTNFLEVBQUUsT0FBTyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDOztDQUVuQyxFQUFFOztDQUVGLENBQUMsU0FBUyxNQUFNLEVBQUUsU0FBUyxHQUFHOztDQUU5QixFQUFFLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRXZDLEVBQUUsS0FBSyxJQUFJLEdBQUc7O0NBRWQsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRyxPQUFPLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRXBDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEdBQUc7O0NBRTFDLEVBQUUsS0FBSyxTQUFTLENBQUMsNEJBQTRCLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7O0NBRTNFLEVBQUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkMsRUFBRSxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTVCLEdBQUcsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVyRSxHQUFHLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEdBQUc7O0NBRWpELEdBQUcsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUV0RCxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQzs7Q0FFcEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsT0FBTzs7Q0FFUixFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQ1YsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLE1BQU0sRUFBRSxNQUFNOztDQUVoQixFQUFFLENBQUM7O0NBRUgsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUVuQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHOztDQUV4QyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDOztDQUV2QyxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHOztDQUVqRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7O0NBRXJDLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHOztDQUUvQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7O0NBRXZDLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Q0FFbkIsRUFBRSxNQUFNOztDQUVSLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXJCLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLHdCQUF3QixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTFDLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUc7O0NBRXhDLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7O0NBRXZDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRzs7Q0FFdEIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Q0FFbkIsRUFBRSxNQUFNOztDQUVSLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXJCLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLGVBQWUsR0FBRzs7Q0FFM0IsQ0FBQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Q0FDakIsQ0FBQyxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQzs7Q0FFM0IsQ0FBQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7Q0FDdEIsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUVoQyxDQUFDLFNBQVMsSUFBSSxHQUFHOztDQUVqQixFQUFFLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUN4QixFQUFFLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUU3QixFQUFFOztDQUVGLENBQUMsU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRzs7Q0FFdkQsRUFBRSxJQUFJLEtBQUssRUFBRSxLQUFLLENBQUM7O0NBRW5COztDQUVBLEVBQUUsS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztDQUU5QixHQUFHLEtBQUssR0FBRyxXQUFXLENBQUM7Q0FDdkIsR0FBRyxLQUFLLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQzs7Q0FFbkMsR0FBRyxNQUFNOztDQUVULEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztDQUNsQixHQUFHLEtBQUssR0FBRyxHQUFHLGVBQWUsQ0FBQzs7Q0FFOUIsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksVUFBVSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLFVBQVUsR0FBRzs7Q0FFcEIsR0FBRyxVQUFVLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7Q0FDN0IsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztDQUM5QixHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQ2xDLEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Q0FDbEMsR0FBRyxVQUFVLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7Q0FDekMsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7Q0FDL0MsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQixHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztDQUU1QixHQUFHLE1BQU07O0NBRVQsR0FBRyxVQUFVLEdBQUc7Q0FDaEIsSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Q0FDakIsSUFBSSxNQUFNLEVBQUUsTUFBTTtDQUNsQixJQUFJLFFBQVEsRUFBRSxRQUFRO0NBQ3RCLElBQUksUUFBUSxFQUFFLFFBQVE7Q0FDdEIsSUFBSSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87Q0FDN0IsSUFBSSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Q0FDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQztDQUNSLElBQUksS0FBSyxFQUFFLEtBQUs7Q0FDaEIsSUFBSSxDQUFDOztDQUVMO0NBQ0EsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUU1QixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxTQUFTLE1BQU0sR0FBRzs7Q0FFbkIsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUM7Q0FDdEMsRUFBRSxXQUFXLENBQUMsTUFBTSxHQUFHLG9CQUFvQixHQUFHLENBQUMsQ0FBQzs7Q0FFaEQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsSUFBSSxHQUFHOztDQUVqQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztDQUNuQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7Q0FFL0MsRUFBRTs7Q0FFRixDQUFDLE9BQU87Q0FDUixFQUFFLE1BQU0sRUFBRSxNQUFNO0NBQ2hCLEVBQUUsV0FBVyxFQUFFLFdBQVc7O0NBRTFCLEVBQUUsSUFBSSxFQUFFLElBQUk7Q0FDWixFQUFFLElBQUksRUFBRSxJQUFJO0NBQ1osRUFBRSxNQUFNLEVBQUUsTUFBTTs7Q0FFaEIsRUFBRSxJQUFJLEVBQUUsSUFBSTtDQUNaLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDOztDQUVELFNBQVMsZ0JBQWdCLEdBQUc7O0NBRTVCLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDOztDQUVoQixDQUFDLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRS9CLEVBQUUsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztDQUN4QyxFQUFFLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRSxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTVCOztDQUVBLEdBQUcsSUFBSSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7Q0FDaEMsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDOztDQUV4QixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsT0FBTyxHQUFHOztDQUVwQixFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7O0NBRWIsRUFBRTs7Q0FFRixDQUFDLE9BQU87Q0FDUixFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQ1YsRUFBRSxPQUFPLEVBQUUsT0FBTztDQUNsQixFQUFFLENBQUM7O0NBRUgsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUywwQkFBMEIsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRzs7Q0FFbEUsQ0FBQyxJQUFJLElBQUksQ0FBQzs7Q0FFVixDQUFDLFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVmLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7O0NBRWhCLENBQUMsU0FBUyxRQUFRLEVBQUUsS0FBSyxHQUFHOztDQUU1QixFQUFFLEtBQUssS0FBSyxDQUFDLEtBQUssWUFBWSxXQUFXLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxHQUFHOztDQUUxRixHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO0NBQzFCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFWixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxZQUFZLFdBQVcsR0FBRzs7Q0FFbkQsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztDQUM1QixHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRVosR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7Q0FDM0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVaLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUc7O0NBRWpDLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7O0NBRXJELEVBQUUsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDO0NBQ3RCLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRTdELEVBQUU7O0NBRUYsQ0FBQyxTQUFTLGVBQWUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRzs7Q0FFcEQsRUFBRSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7O0NBRTdELEVBQUUsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHOztDQUU1QixHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsdUlBQXVJLEVBQUUsQ0FBQztDQUM1SixHQUFHLE9BQU87O0NBRVYsR0FBRzs7Q0FFSCxFQUFFLFNBQVMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztDQUV0RyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztDQUN0QixFQUFFLFVBQVUsQ0FBQyxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzs7Q0FFNUQsRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLGlCQUFpQixHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRTFGLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUN4QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQzs7Q0FFeEMsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxtQkFBbUIsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRzs7Q0FFM0QsQ0FBQyxJQUFJLElBQUksQ0FBQzs7Q0FFVixDQUFDLFNBQVMsT0FBTyxFQUFFLEtBQUssR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVmLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztDQUVqQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUM7Q0FDdEIsRUFBRSxVQUFVLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQzs7Q0FFL0IsRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQzs7Q0FFN0QsRUFBRTs7Q0FFRixDQUFDLFNBQVMsZUFBZSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztDQUVwRCxFQUFFLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7Q0FFN0QsRUFBRSxLQUFLLFNBQVMsS0FBSyxJQUFJLEdBQUc7O0NBRTVCLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxnSUFBZ0ksRUFBRSxDQUFDO0NBQ3JKLEdBQUcsT0FBTzs7Q0FFVixHQUFHOztDQUVILEVBQUUsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0NBRTlDLEVBQUUsS0FBSyxRQUFRLENBQUMsNEJBQTRCLEdBQUc7O0NBRS9DLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUUvQixHQUFHLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFcEYsR0FBRyxNQUFNOztDQUVULEdBQUcsU0FBUyxDQUFDLHdCQUF3QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztDQUV4RixHQUFHOztDQUVILEVBQUUsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDO0NBQ3RCLEVBQUUsVUFBVSxDQUFDLFFBQVEsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDOztDQUU1RCxFQUFFLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQzs7Q0FFMUYsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3hCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQzs7Q0FFeEMsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUc7O0NBRXZELENBQUMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0NBQ3JCLENBQUMsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7O0NBRTlCLENBQUMsU0FBUyxpQkFBaUIsRUFBRSxLQUFLLEdBQUc7O0NBRXJDLEVBQUUsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztDQUM5QixFQUFFLElBQUksY0FBYyxHQUFHLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWpELEVBQUUsS0FBSyxjQUFjLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRzs7Q0FFdkMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSCxFQUFFLE1BQU0sSUFBSSxJQUFJLElBQUksY0FBYyxDQUFDLFVBQVUsR0FBRzs7Q0FFaEQsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQzs7Q0FFMUQsR0FBRzs7Q0FFSCxFQUFFLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFL0QsRUFBRSxPQUFPLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRW5DOztDQUVBLEVBQUUsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyRCxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUVuQixHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDbEMsR0FBRyxPQUFPLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSCxFQUFFLFNBQVMsR0FBRyxtQkFBbUIsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXZELEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRW5CLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUNsQyxHQUFHLE9BQU8sbUJBQW1CLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVuRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDOztDQUUzQixFQUFFOztDQUVGLENBQUMsU0FBUyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FBRzs7Q0FFbEMsRUFBRSxJQUFJLGNBQWMsR0FBRyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxFQUFFLEtBQUssY0FBYyxHQUFHLE9BQU8sY0FBYyxDQUFDOztDQUU5QyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFNUQsRUFBRSxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRzs7Q0FFbkMsR0FBRyxjQUFjLEdBQUcsUUFBUSxDQUFDOztDQUU3QixHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHOztDQUVwQyxHQUFHLEtBQUssUUFBUSxDQUFDLGVBQWUsS0FBSyxTQUFTLEdBQUc7O0NBRWpELElBQUksUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFNUUsSUFBSTs7Q0FFSixHQUFHLGNBQWMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztDQUU3QyxHQUFHOztDQUVILEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUM7O0NBRTdDLEVBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDOztDQUUzQixFQUFFLE9BQU8sY0FBYyxDQUFDOztDQUV4QixFQUFFOztDQUVGLENBQUMsU0FBUyxNQUFNLEVBQUUsUUFBUSxHQUFHOztDQUU3QixFQUFFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDN0IsRUFBRSxJQUFJLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7O0NBRS9DLEVBQUUsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHOztDQUV4QixHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztDQUV2RCxHQUFHOztDQUVILEVBQUUsTUFBTSxJQUFJLElBQUksSUFBSSxrQkFBa0IsR0FBRzs7Q0FFekMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFcEUsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7O0NBRWpELEVBQUUsTUFBTSxJQUFJLElBQUksSUFBSSxlQUFlLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxLQUFLLEdBQUcsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBELElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVyRCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMscUJBQXFCLEVBQUUsUUFBUSxHQUFHOztDQUU1QyxFQUFFLElBQUksU0FBUyxHQUFHLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckQsRUFBRSxLQUFLLFNBQVMsR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7O0NBRW5CLEVBQUUsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztDQUNyQyxFQUFFLElBQUksa0JBQWtCLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQzs7Q0FFL0M7O0NBRUEsRUFBRSxLQUFLLGFBQWEsS0FBSyxJQUFJLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQzs7Q0FFbkMsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0NBRXRELElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUUzQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSTs7Q0FFSixHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUVqRCxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0NBRWxFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNsQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbEIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVsQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSTs7Q0FFSixHQUFHOztDQUVIOztDQUVBLEVBQUUsU0FBUyxHQUFHLE1BQU0sUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBRyxxQkFBcUIsR0FBRyxxQkFBcUIsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhILEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O0NBRTFELEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQzs7Q0FFakQsRUFBRSxPQUFPLFNBQVMsQ0FBQzs7Q0FFbkIsRUFBRTs7Q0FFRixDQUFDLE9BQU87O0NBRVIsRUFBRSxHQUFHLEVBQUUsR0FBRztDQUNWLEVBQUUsTUFBTSxFQUFFLE1BQU07O0NBRWhCLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCOztDQUU5QyxFQUFFLENBQUM7O0NBRUgsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxXQUFXLEdBQUc7O0NBRXZCLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVqQixDQUFDLE9BQU87O0NBRVIsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEdBQUcsS0FBSyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLFNBQVMsR0FBRzs7Q0FFM0MsSUFBSSxPQUFPLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTlCLElBQUk7O0NBRUosR0FBRyxJQUFJLFFBQVEsQ0FBQzs7Q0FFaEIsR0FBRyxTQUFTLEtBQUssQ0FBQyxJQUFJOztDQUV0QixJQUFJLEtBQUssa0JBQWtCO0NBQzNCLEtBQUssUUFBUSxHQUFHO0NBQ2hCLE1BQU0sU0FBUyxFQUFFLElBQUksT0FBTyxFQUFFO0NBQzlCLE1BQU0sS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFOztDQUV4QixNQUFNLE1BQU0sRUFBRSxLQUFLO0NBQ25CLE1BQU0sVUFBVSxFQUFFLENBQUM7Q0FDbkIsTUFBTSxZQUFZLEVBQUUsQ0FBQztDQUNyQixNQUFNLGFBQWEsRUFBRSxJQUFJLE9BQU8sRUFBRTtDQUNsQyxNQUFNLENBQUM7Q0FDUCxLQUFLLE1BQU07O0NBRVgsSUFBSSxLQUFLLFdBQVc7Q0FDcEIsS0FBSyxRQUFRLEdBQUc7Q0FDaEIsTUFBTSxRQUFRLEVBQUUsSUFBSSxPQUFPLEVBQUU7Q0FDN0IsTUFBTSxTQUFTLEVBQUUsSUFBSSxPQUFPLEVBQUU7Q0FDOUIsTUFBTSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUU7Q0FDeEIsTUFBTSxRQUFRLEVBQUUsQ0FBQztDQUNqQixNQUFNLE9BQU8sRUFBRSxDQUFDO0NBQ2hCLE1BQU0sV0FBVyxFQUFFLENBQUM7Q0FDcEIsTUFBTSxLQUFLLEVBQUUsQ0FBQzs7Q0FFZCxNQUFNLE1BQU0sRUFBRSxLQUFLO0NBQ25CLE1BQU0sVUFBVSxFQUFFLENBQUM7Q0FDbkIsTUFBTSxZQUFZLEVBQUUsQ0FBQztDQUNyQixNQUFNLGFBQWEsRUFBRSxJQUFJLE9BQU8sRUFBRTtDQUNsQyxNQUFNLENBQUM7Q0FDUCxLQUFLLE1BQU07O0NBRVgsSUFBSSxLQUFLLFlBQVk7Q0FDckIsS0FBSyxRQUFRLEdBQUc7Q0FDaEIsTUFBTSxRQUFRLEVBQUUsSUFBSSxPQUFPLEVBQUU7Q0FDN0IsTUFBTSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUU7Q0FDeEIsTUFBTSxRQUFRLEVBQUUsQ0FBQztDQUNqQixNQUFNLEtBQUssRUFBRSxDQUFDOztDQUVkLE1BQU0sTUFBTSxFQUFFLEtBQUs7Q0FDbkIsTUFBTSxVQUFVLEVBQUUsQ0FBQztDQUNuQixNQUFNLFlBQVksRUFBRSxDQUFDO0NBQ3JCLE1BQU0sYUFBYSxFQUFFLElBQUksT0FBTyxFQUFFO0NBQ2xDLE1BQU0sQ0FBQztDQUNQLEtBQUssTUFBTTs7Q0FFWCxJQUFJLEtBQUssaUJBQWlCO0NBQzFCLEtBQUssUUFBUSxHQUFHO0NBQ2hCLE1BQU0sU0FBUyxFQUFFLElBQUksT0FBTyxFQUFFO0NBQzlCLE1BQU0sUUFBUSxFQUFFLElBQUksS0FBSyxFQUFFO0NBQzNCLE1BQU0sV0FBVyxFQUFFLElBQUksS0FBSyxFQUFFO0NBQzlCLE1BQU0sQ0FBQztDQUNQLEtBQUssTUFBTTs7Q0FFWCxJQUFJLEtBQUssZUFBZTtDQUN4QixLQUFLLFFBQVEsR0FBRztDQUNoQixNQUFNLEtBQUssRUFBRSxJQUFJLEtBQUssRUFBRTtDQUN4QixNQUFNLFFBQVEsRUFBRSxJQUFJLE9BQU8sRUFBRTtDQUM3QixNQUFNLFNBQVMsRUFBRSxJQUFJLE9BQU8sRUFBRTtDQUM5QixNQUFNLFVBQVUsRUFBRSxJQUFJLE9BQU8sRUFBRTtDQUMvQjtDQUNBLE1BQU0sQ0FBQztDQUNQLEtBQUssTUFBTTs7Q0FFWCxJQUFJOztDQUVKLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUM7O0NBRWpDLEdBQUcsT0FBTyxRQUFRLENBQUM7O0NBRW5CLEdBQUc7O0NBRUgsRUFBRSxDQUFDOztDQUVILENBQUM7O0NBRUQ7Q0FDQTtDQUNBOztDQUVBLFNBQVMsWUFBWSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHOztDQUVwRCxDQUFDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckIsQ0FBQyxTQUFTLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRTNCLEVBQUUsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0NBQ2pDLEVBQUUsSUFBSSxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTFEOztDQUVBLEVBQUUsS0FBSyxVQUFVLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLEtBQUssR0FBRzs7Q0FFbkQsR0FBRyxLQUFLLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRTlCLElBQUksY0FBYyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU5QyxJQUFJOztDQUVKLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFdkMsR0FBRyxVQUFVLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sY0FBYyxDQUFDOztDQUV4QixFQUFFOztDQUVGLENBQUMsU0FBUyxLQUFLLEdBQUc7O0NBRWxCLEVBQUUsVUFBVSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsRUFBRTs7Q0FFRixDQUFDLE9BQU87O0NBRVIsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLEtBQUssRUFBRSxLQUFLOztDQUVkLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDOztDQUVEO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGNBQWMsRUFBRSxNQUFNLEdBQUc7O0NBRWxDLENBQUMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbEMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFM0MsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTNCLENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRXpDLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNuQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTVCLENBQUMsS0FBSyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRXJFLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSw4Q0FBOEMsRUFBRSxDQUFDOztDQUVsRSxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHOztDQUU3QyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMENBQTBDLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQyxhQUFhLEdBQUcsUUFBUSxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7O0NBRXpLLEVBQUU7O0NBRUY7Q0FDQTs7Q0FFQSxDQUFDLE9BQU8sTUFBTSxDQUFDOztDQUVmLENBQUM7O0NBRUQ7Q0FDQTtDQUNBOztDQUVBLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQzs7Q0FFdkIsU0FBUyxxQkFBcUIsRUFBRSxRQUFRLEdBQUc7O0NBRTNDLENBQUMsU0FBUyxRQUFROztDQUVsQixFQUFFLEtBQUssY0FBYztDQUNyQixHQUFHLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxLQUFLLFlBQVk7Q0FDbkIsR0FBRyxPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0NBQ2pDLEVBQUUsS0FBSyxZQUFZO0NBQ25CLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNqQyxFQUFFLEtBQUssYUFBYTtDQUNwQixHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztDQUN0QyxFQUFFLEtBQUssY0FBYztDQUNyQixHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztDQUN2QyxFQUFFLEtBQUssWUFBWTtDQUNuQixHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUN4QyxFQUFFLEtBQUssYUFBYTtDQUNwQixHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztDQUN6RCxFQUFFO0NBQ0YsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLHdCQUF3QixHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUUxRCxFQUFFOztDQUVGLENBQUM7O0NBRUQsU0FBUyx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsUUFBUSxHQUFHOztDQUU1RCxDQUFDLElBQUksVUFBVSxHQUFHLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3BELENBQUMsT0FBTyxPQUFPLEdBQUcsWUFBWSxHQUFHLDBCQUEwQixHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQzs7Q0FFckgsQ0FBQzs7Q0FFRCxTQUFTLHdCQUF3QixFQUFFLFlBQVksRUFBRSxRQUFRLEdBQUc7O0NBRTVELENBQUMsSUFBSSxVQUFVLEdBQUcscUJBQXFCLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDcEQsQ0FBQyxPQUFPLE9BQU8sR0FBRyxZQUFZLEdBQUcsa0NBQWtDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7O0NBRWhILENBQUM7O0NBRUQsU0FBUyxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxHQUFHOztDQUU3RCxDQUFDLElBQUksZUFBZSxDQUFDOztDQUVyQixDQUFDLFNBQVMsV0FBVzs7Q0FFckIsRUFBRSxLQUFLLGlCQUFpQjtDQUN4QixHQUFHLGVBQWUsR0FBRyxRQUFRLENBQUM7Q0FDOUIsR0FBRyxNQUFNOztDQUVULEVBQUUsS0FBSyxtQkFBbUI7Q0FDMUIsR0FBRyxlQUFlLEdBQUcsVUFBVSxDQUFDO0NBQ2hDLEdBQUcsTUFBTTs7Q0FFVCxFQUFFLEtBQUsscUJBQXFCO0NBQzVCLEdBQUcsZUFBZSxHQUFHLFlBQVksQ0FBQztDQUNsQyxHQUFHLE1BQU07O0NBRVQsRUFBRSxLQUFLLGlCQUFpQjtDQUN4QixHQUFHLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztDQUN2QyxHQUFHLE1BQU07O0NBRVQsRUFBRTtDQUNGLEdBQUcsTUFBTSxJQUFJLEtBQUssRUFBRSwyQkFBMkIsR0FBRyxXQUFXLEVBQUUsQ0FBQzs7Q0FFaEUsRUFBRTs7Q0FFRixDQUFDLE9BQU8sT0FBTyxHQUFHLFlBQVksR0FBRywwQkFBMEIsR0FBRyxlQUFlLEdBQUcseUJBQXlCLENBQUM7O0NBRTFHLENBQUM7O0NBRUQsU0FBUyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixHQUFHOztDQUUxRSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDOztDQUUvQixDQUFDLElBQUksTUFBTSxHQUFHO0NBQ2QsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFdBQVcsS0FBSyxpREFBaUQsR0FBRyxFQUFFO0NBQ3hMLEVBQUUsRUFBRSxVQUFVLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxzQkFBc0IsTUFBTSxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyx1Q0FBdUMsR0FBRyxFQUFFO0NBQzVKLEVBQUUsRUFBRSxVQUFVLENBQUMsV0FBVyxNQUFNLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLDBDQUEwQyxHQUFHLEVBQUU7Q0FDaEksRUFBRSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsTUFBTSxNQUFNLGtCQUFrQixDQUFDLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLCtDQUErQyxHQUFHLEVBQUU7Q0FDbkssRUFBRSxDQUFDOztDQUVILENBQUMsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEQsQ0FBQzs7Q0FFRCxTQUFTLGVBQWUsRUFBRSxPQUFPLEdBQUc7O0NBRXBDLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVqQixDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTyxHQUFHOztDQUU3QixFQUFFLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFOUIsRUFBRSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsU0FBUzs7Q0FFbEMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDOztDQUVqRCxFQUFFOztDQUVGLENBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixDQUFDOztDQUVELFNBQVMsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEdBQUc7O0NBRTdELENBQUMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUVyQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRWpFLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QyxFQUFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7O0NBRXZCOztDQUVBLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTdELEVBQUU7O0NBRUYsQ0FBQyxPQUFPLFVBQVUsQ0FBQzs7Q0FFbkIsQ0FBQzs7Q0FFRCxTQUFTLGVBQWUsRUFBRSxNQUFNLEdBQUc7O0NBRW5DLENBQUMsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDOztDQUV0QixDQUFDOztDQUVELFNBQVMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLFVBQVUsR0FBRzs7Q0FFaEQsQ0FBQyxPQUFPLE1BQU07Q0FDZCxHQUFHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFO0NBQ3hELEdBQUcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUU7Q0FDMUQsR0FBRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFO0NBQ25FLEdBQUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxjQUFjLEVBQUU7Q0FDNUQsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUUzRCxDQUFDOztDQUVELFNBQVMsYUFBYSxFQUFFLE1BQU0sR0FBRzs7Q0FFakMsQ0FBQyxJQUFJLE9BQU8sR0FBRyxpQ0FBaUMsQ0FBQzs7Q0FFakQsQ0FBQyxTQUFTLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxHQUFHOztDQUVwQyxFQUFFLElBQUksT0FBTyxHQUFHLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFdkMsRUFBRSxLQUFLLE9BQU8sS0FBSyxTQUFTLEdBQUc7O0NBRS9CLEdBQUcsTUFBTSxJQUFJLEtBQUssRUFBRSw0QkFBNEIsR0FBRyxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRW5FLEdBQUc7O0NBRUgsRUFBRSxPQUFPLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRTs7Q0FFRixDQUFDLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTNDLENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsTUFBTSxHQUFHOztDQUUvQixDQUFDLElBQUksT0FBTyxHQUFHLHFFQUFxRSxDQUFDOztDQUVyRixDQUFDLFNBQVMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sR0FBRzs7Q0FFaEQsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWxCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFL0QsR0FBRyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUQsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sTUFBTSxDQUFDOztDQUVoQixFQUFFOztDQUVGLENBQUMsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0MsQ0FBQzs7Q0FFRCxTQUFTLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRTlELENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQzs7Q0FFM0IsQ0FBQyxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO0NBQ3RDLENBQUMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztDQUN4RCxDQUFDLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDOztDQUU1RCxDQUFDLElBQUksbUJBQW1CLEdBQUcsc0JBQXNCLENBQUM7O0NBRWxELENBQUMsS0FBSyxVQUFVLENBQUMsYUFBYSxLQUFLLFlBQVksR0FBRzs7Q0FFbEQsRUFBRSxtQkFBbUIsR0FBRyxvQkFBb0IsQ0FBQzs7Q0FFN0MsRUFBRSxNQUFNLEtBQUssVUFBVSxDQUFDLGFBQWEsS0FBSyxnQkFBZ0IsR0FBRzs7Q0FFN0QsRUFBRSxtQkFBbUIsR0FBRyx5QkFBeUIsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7Q0FDM0MsQ0FBQyxJQUFJLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDO0NBQ2pELENBQUMsSUFBSSxvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQzs7Q0FFdkQsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEdBQUc7O0NBRTFCLEVBQUUsU0FBUyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU87O0NBRWxDLEdBQUcsS0FBSyxxQkFBcUIsQ0FBQztDQUM5QixHQUFHLEtBQUsscUJBQXFCO0NBQzdCLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7Q0FDMUMsSUFBSSxNQUFNOztDQUVWLEdBQUcsS0FBSyx1QkFBdUIsQ0FBQztDQUNoQyxHQUFHLEtBQUssdUJBQXVCO0NBQy9CLElBQUksZ0JBQWdCLEdBQUcscUJBQXFCLENBQUM7Q0FDN0MsSUFBSSxNQUFNOztDQUVWLEdBQUcsS0FBSyxnQ0FBZ0MsQ0FBQztDQUN6QyxHQUFHLEtBQUssZ0NBQWdDO0NBQ3hDLElBQUksZ0JBQWdCLEdBQUcscUJBQXFCLENBQUM7Q0FDN0MsSUFBSSxNQUFNOztDQUVWLEdBQUcsS0FBSywwQkFBMEI7Q0FDbEMsSUFBSSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztDQUM1QyxJQUFJLE1BQU07O0NBRVYsR0FBRzs7Q0FFSCxFQUFFLFNBQVMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPOztDQUVsQyxHQUFHLEtBQUsscUJBQXFCLENBQUM7Q0FDOUIsR0FBRyxLQUFLLGdDQUFnQztDQUN4QyxJQUFJLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDO0NBQ2hELElBQUksTUFBTTs7Q0FFVixHQUFHOztDQUVILEVBQUUsU0FBUyxRQUFRLENBQUMsT0FBTzs7Q0FFM0IsR0FBRyxLQUFLLGlCQUFpQjtDQUN6QixJQUFJLG9CQUFvQixHQUFHLDBCQUEwQixDQUFDO0NBQ3RELElBQUksTUFBTTs7Q0FFVixHQUFHLEtBQUssWUFBWTtDQUNwQixJQUFJLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDO0NBQ2pELElBQUksTUFBTTs7Q0FFVixHQUFHLEtBQUssWUFBWTtDQUNwQixJQUFJLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDO0NBQ2pELElBQUksTUFBTTs7Q0FFVixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7O0NBRW5GOztDQUVBOztDQUVBLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Q0FFMUYsQ0FBQyxJQUFJLGFBQWEsR0FBRyxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRWhEOztDQUVBLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUVsQyxDQUFDLElBQUksWUFBWSxFQUFFLGNBQWMsQ0FBQzs7Q0FFbEMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRzs7Q0FFckMsRUFBRSxZQUFZLEdBQUc7O0NBRWpCLEdBQUcsYUFBYTs7Q0FFaEIsR0FBRyxJQUFJOztDQUVQLEdBQUcsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUzQyxFQUFFLGNBQWMsR0FBRzs7Q0FFbkIsR0FBRyxnQkFBZ0I7Q0FDbkIsR0FBRyxhQUFhOztDQUVoQixHQUFHLElBQUk7O0NBRVAsR0FBRyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTNDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFlBQVksR0FBRzs7Q0FFakIsR0FBRyxZQUFZLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTO0NBQ2xELEdBQUcsWUFBWSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsT0FBTzs7Q0FFaEQsR0FBRyxzQkFBc0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUk7O0NBRXZELEdBQUcsYUFBYTs7Q0FFaEIsR0FBRyxVQUFVLENBQUMsc0JBQXNCLEdBQUcseUJBQXlCLEdBQUcsRUFBRTs7Q0FFckUsR0FBRyx1QkFBdUIsR0FBRyxpQkFBaUI7O0NBRTlDLEdBQUcsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLFFBQVE7Q0FDN0MsR0FBRyxFQUFFLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsR0FBRyxFQUFFO0NBQ25FLEdBQUcsRUFBRSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLEdBQUcsRUFBRTs7Q0FFdkUsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLGlCQUFpQixHQUFHLEVBQUU7Q0FDMUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLG9CQUFvQixHQUFHLEVBQUU7Q0FDaEQsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFO0NBQ3pELEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsR0FBRyxFQUFFO0NBQ3BELEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsR0FBRyxFQUFFO0NBQzlDLEdBQUcsVUFBVSxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsR0FBRyxFQUFFO0NBQzFELEdBQUcsVUFBVSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsR0FBRyxFQUFFO0NBQ2xELEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyx1QkFBdUIsR0FBRyxFQUFFO0NBQ3RELEdBQUcsVUFBVSxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsc0JBQXNCLEdBQUcsNkJBQTZCLEdBQUcsRUFBRTtDQUN2RyxHQUFHLFVBQVUsQ0FBQyxXQUFXLEdBQUcseUJBQXlCLEdBQUcsRUFBRTtDQUMxRCxHQUFHLFVBQVUsQ0FBQyxZQUFZLEdBQUcsMEJBQTBCLEdBQUcsRUFBRTtDQUM1RCxHQUFHLFVBQVUsQ0FBQyxZQUFZLEdBQUcsMEJBQTBCLEdBQUcsRUFBRTtDQUM1RCxHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEdBQUcsRUFBRTtDQUNwRCxHQUFHLFVBQVUsQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLEdBQUcsRUFBRTs7Q0FFckQsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLHFCQUFxQixHQUFHLEVBQUU7O0NBRXRELEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxzQkFBc0IsR0FBRyxFQUFFO0NBQ3BELEdBQUcsVUFBVSxDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixHQUFHLEVBQUU7O0NBRTVELEdBQUcsVUFBVSxDQUFDLFlBQVksR0FBRywwQkFBMEIsR0FBRyxFQUFFO0NBQzVELEdBQUcsVUFBVSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsV0FBVyxLQUFLLEtBQUssR0FBRywwQkFBMEIsR0FBRyxFQUFFO0NBQ2hHLEdBQUcsVUFBVSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsR0FBRyxFQUFFO0NBQ3ZELEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsR0FBRyxFQUFFOztDQUVuRCxHQUFHLDhCQUE4QixHQUFHLFVBQVUsQ0FBQyxpQkFBaUI7O0NBRWhFLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixHQUFHLHVCQUF1QixHQUFHLEVBQUU7Q0FDN0QsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0NBRXRFLEdBQUcsVUFBVSxDQUFDLGVBQWUsR0FBRyw2QkFBNkIsR0FBRyxFQUFFOztDQUVsRSxHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsR0FBRyx5QkFBeUIsR0FBRyxFQUFFO0NBQ3JFLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsNkJBQTZCLEdBQUcsRUFBRTs7Q0FFeEgsR0FBRywyQkFBMkI7Q0FDOUIsR0FBRywrQkFBK0I7Q0FDbEMsR0FBRyxnQ0FBZ0M7Q0FDbkMsR0FBRywwQkFBMEI7Q0FDN0IsR0FBRyw0QkFBNEI7Q0FDL0IsR0FBRyw4QkFBOEI7O0NBRWpDLEdBQUcsMEJBQTBCO0NBQzdCLEdBQUcsd0JBQXdCO0NBQzNCLEdBQUcsb0JBQW9COztDQUV2QixHQUFHLGtCQUFrQjs7Q0FFckIsR0FBRyx3QkFBd0I7O0NBRTNCLEdBQUcsUUFBUTs7Q0FFWCxHQUFHLHlCQUF5Qjs7Q0FFNUIsR0FBRywrQkFBK0I7Q0FDbEMsR0FBRywrQkFBK0I7Q0FDbEMsR0FBRywrQkFBK0I7Q0FDbEMsR0FBRywrQkFBK0I7O0NBRWxDLEdBQUcsMEJBQTBCOztDQUU3QixHQUFHLGdDQUFnQztDQUNuQyxHQUFHLGdDQUFnQztDQUNuQyxHQUFHLGdDQUFnQztDQUNuQyxHQUFHLGdDQUFnQzs7Q0FFbkMsR0FBRyxRQUFROztDQUVYLEdBQUcsZ0NBQWdDO0NBQ25DLEdBQUcsZ0NBQWdDO0NBQ25DLEdBQUcsZ0NBQWdDO0NBQ25DLEdBQUcsZ0NBQWdDOztDQUVuQyxHQUFHLFNBQVM7O0NBRVosR0FBRyxRQUFROztDQUVYLEdBQUcscUJBQXFCOztDQUV4QixHQUFHLDRCQUE0QjtDQUMvQixHQUFHLDZCQUE2Qjs7Q0FFaEMsR0FBRyxRQUFROztDQUVYLEdBQUcsSUFBSTs7Q0FFUCxHQUFHLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRSxjQUFjLEdBQUc7O0NBRW5CLEdBQUcsZ0JBQWdCOztDQUVuQixHQUFHLFlBQVksR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVM7Q0FDbEQsR0FBRyxZQUFZLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxPQUFPOztDQUVoRCxHQUFHLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSTs7Q0FFdkQsR0FBRyxhQUFhOztDQUVoQixHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxFQUFFOztDQUUxRSxHQUFHLHVCQUF1QixHQUFHLGlCQUFpQjs7Q0FFOUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsR0FBRyxFQUFFO0NBQ25FLEdBQUcsRUFBRSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLEdBQUcsRUFBRTs7Q0FFdkUsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLGlCQUFpQixHQUFHLEVBQUU7Q0FDMUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLG9CQUFvQixHQUFHLEVBQUU7Q0FDaEQsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxFQUFFO0NBQ3pELEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsZ0JBQWdCLEdBQUcsRUFBRTtDQUN6RCxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLG9CQUFvQixHQUFHLEVBQUU7Q0FDN0QsR0FBRyxVQUFVLENBQUMsUUFBUSxHQUFHLHNCQUFzQixHQUFHLEVBQUU7Q0FDcEQsR0FBRyxVQUFVLENBQUMsS0FBSyxHQUFHLG1CQUFtQixHQUFHLEVBQUU7Q0FDOUMsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLHlCQUF5QixHQUFHLEVBQUU7Q0FDMUQsR0FBRyxVQUFVLENBQUMsT0FBTyxHQUFHLHFCQUFxQixHQUFHLEVBQUU7Q0FDbEQsR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLHVCQUF1QixHQUFHLEVBQUU7Q0FDdEQsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLHlCQUF5QixHQUFHLEVBQUU7Q0FDMUQsR0FBRyxVQUFVLENBQUMsWUFBWSxHQUFHLDBCQUEwQixHQUFHLEVBQUU7Q0FDNUQsR0FBRyxVQUFVLENBQUMsWUFBWSxHQUFHLDBCQUEwQixHQUFHLEVBQUU7Q0FDNUQsR0FBRyxVQUFVLENBQUMsUUFBUSxHQUFHLHNCQUFzQixHQUFHLEVBQUU7Q0FDcEQsR0FBRyxVQUFVLENBQUMsWUFBWSxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0NBRXJELEdBQUcsVUFBVSxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsR0FBRyxFQUFFOztDQUUxRCxHQUFHLFVBQVUsQ0FBQyxXQUFXLEdBQUcscUJBQXFCLEdBQUcsRUFBRTs7Q0FFdEQsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLHNCQUFzQixHQUFHLEVBQUU7Q0FDdkQsR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLG9CQUFvQixHQUFHLEVBQUU7O0NBRW5ELEdBQUcsOEJBQThCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQjtDQUNoRSxHQUFHLGdDQUFnQyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUM7O0NBRXJHLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixHQUFHLHVCQUF1QixHQUFHLEVBQUU7Q0FDN0QsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0NBRXRFLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixHQUFHLDZCQUE2QixHQUFHLEVBQUU7O0NBRXJFLEdBQUcsVUFBVSxDQUFDLHVCQUF1QixHQUFHLG1DQUFtQyxHQUFHLEVBQUU7O0NBRWhGLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixHQUFHLHlCQUF5QixHQUFHLEVBQUU7Q0FDckUsR0FBRyxVQUFVLENBQUMsc0JBQXNCLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyw2QkFBNkIsR0FBRyxFQUFFOztDQUV4SCxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyx5QkFBeUIsR0FBRyxFQUFFOztDQUU1RyxHQUFHLDBCQUEwQjtDQUM3QixHQUFHLDhCQUE4Qjs7Q0FFakMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEtBQUssYUFBYSxLQUFLLHNCQUFzQixHQUFHLEVBQUU7Q0FDN0UsR0FBRyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEtBQUssYUFBYSxLQUFLLFdBQVcsRUFBRSwyQkFBMkIsRUFBRSxHQUFHLEVBQUU7Q0FDakcsR0FBRyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEtBQUssYUFBYSxLQUFLLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTs7Q0FFdEgsR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLG1CQUFtQixHQUFHLEVBQUU7O0NBRWxELEdBQUcsRUFBRSxVQUFVLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLGNBQWMsSUFBSSxVQUFVLENBQUMsbUJBQW1CLEtBQUssV0FBVyxFQUFFLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtDQUN6SyxHQUFHLFVBQVUsQ0FBQyxXQUFXLEdBQUcsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7Q0FDdkcsR0FBRyxVQUFVLENBQUMsY0FBYyxHQUFHLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0NBQ2hILEdBQUcsVUFBVSxDQUFDLG1CQUFtQixHQUFHLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7Q0FDL0gsR0FBRyxVQUFVLENBQUMsY0FBYyxHQUFHLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFOztDQUVoSCxHQUFHLFVBQVUsQ0FBQyxZQUFZLEdBQUcsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxFQUFFOztDQUVsRixHQUFHLElBQUk7O0NBRVAsR0FBRyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEdBQUcsYUFBYSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUMxRCxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTdELENBQUMsY0FBYyxHQUFHLGFBQWEsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDOUQsQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVqRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0NBRXBDLEVBQUUsWUFBWSxHQUFHLFdBQVcsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUM3QyxFQUFFLGNBQWMsR0FBRyxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRWpELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLFVBQVUsR0FBRyxZQUFZLEdBQUcsWUFBWSxDQUFDO0NBQzlDLENBQUMsSUFBSSxZQUFZLEdBQUcsY0FBYyxHQUFHLGNBQWMsQ0FBQzs7Q0FFcEQ7Q0FDQTs7Q0FFQSxDQUFDLElBQUksY0FBYyxHQUFHLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUN0RSxDQUFDLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUU1RSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO0NBQzVDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFOUM7O0NBRUEsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEdBQUc7O0NBRW5ELEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0NBRXBFLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQyxZQUFZLEtBQUssSUFBSSxHQUFHOztDQUVoRDtDQUNBLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRWxELEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUUzQixDQUFDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUNsRCxDQUFDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsQ0FBQztDQUN2RCxDQUFDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDOztDQUUzRCxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztDQUNyQixDQUFDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQzs7Q0FFNUI7Q0FDQTs7Q0FFQSxDQUFDLEtBQUssRUFBRSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxHQUFHOztDQUVwRSxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRW5CLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxvQ0FBb0MsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7Q0FFaE4sRUFBRSxNQUFNLEtBQUssVUFBVSxLQUFLLEVBQUUsR0FBRzs7Q0FFakMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLDRDQUE0QyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUUzRSxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssRUFBRSxJQUFJLFdBQVcsS0FBSyxFQUFFLEdBQUc7O0NBRXRELEVBQUUsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Q0FFMUIsRUFBRTs7Q0FFRixDQUFDLEtBQUssZUFBZSxHQUFHOztDQUV4QixFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUc7O0NBRXJCLEdBQUcsUUFBUSxFQUFFLFFBQVE7Q0FDckIsR0FBRyxRQUFRLEVBQUUsUUFBUTs7Q0FFckIsR0FBRyxVQUFVLEVBQUUsVUFBVTs7Q0FFekIsR0FBRyxZQUFZLEVBQUU7O0NBRWpCLElBQUksR0FBRyxFQUFFLFNBQVM7Q0FDbEIsSUFBSSxNQUFNLEVBQUUsWUFBWTs7Q0FFeEIsSUFBSTs7Q0FFSixHQUFHLGNBQWMsRUFBRTs7Q0FFbkIsSUFBSSxHQUFHLEVBQUUsV0FBVztDQUNwQixJQUFJLE1BQU0sRUFBRSxjQUFjOztDQUUxQixJQUFJOztDQUVKLEdBQUcsQ0FBQzs7Q0FFSixFQUFFOztDQUVGOztDQUVBLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQztDQUNuQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEsQ0FBQyxJQUFJLGNBQWMsQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVc7O0NBRS9CLEVBQUUsS0FBSyxjQUFjLEtBQUssU0FBUyxHQUFHOztDQUV0QyxHQUFHLGNBQWM7Q0FDakIsSUFBSSxJQUFJLGFBQWEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUvQyxHQUFHOztDQUVILEVBQUUsT0FBTyxjQUFjLENBQUM7O0NBRXhCLEVBQUUsQ0FBQzs7Q0FFSDs7Q0FFQSxDQUFDLElBQUksZ0JBQWdCLENBQUM7O0NBRXRCLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXOztDQUVqQyxFQUFFLEtBQUssZ0JBQWdCLEtBQUssU0FBUyxHQUFHOztDQUV4QyxHQUFHLGdCQUFnQixHQUFHLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0QsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sZ0JBQWdCLENBQUM7O0NBRTFCLEVBQUUsQ0FBQzs7Q0FFSDs7Q0FFQSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVzs7Q0FFM0IsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7O0NBRTNCLEVBQUUsQ0FBQzs7Q0FFSDs7Q0FFQSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7O0NBRWhDLEVBQUUsUUFBUSxFQUFFO0NBQ1osR0FBRyxHQUFHLEVBQUUsV0FBVzs7Q0FFbkIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLHNEQUFzRCxFQUFFLENBQUM7Q0FDM0UsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFOUIsSUFBSTtDQUNKLEdBQUc7O0NBRUgsRUFBRSxVQUFVLEVBQUU7Q0FDZCxHQUFHLEdBQUcsRUFBRSxXQUFXOztDQUVuQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQztDQUMvRSxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUVoQyxJQUFJO0NBQ0osR0FBRzs7Q0FFSCxFQUFFLEVBQUUsQ0FBQzs7O0NBR0w7O0NBRUEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxDQUFDO0NBQzdCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Q0FDbEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3hCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUM7Q0FDcEMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFDOztDQUV4QyxDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUM7O0NBRUQ7Q0FDQTtDQUNBOztDQUVBLFNBQVMsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLEdBQUc7O0NBRWpELENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztDQUVuQixDQUFDLElBQUksU0FBUyxHQUFHO0NBQ2pCLEVBQUUsaUJBQWlCLEVBQUUsT0FBTztDQUM1QixFQUFFLGtCQUFrQixFQUFFLFFBQVE7Q0FDOUIsRUFBRSxpQkFBaUIsRUFBRSxPQUFPO0NBQzVCLEVBQUUsbUJBQW1CLEVBQUUsU0FBUztDQUNoQyxFQUFFLGlCQUFpQixFQUFFLE9BQU87Q0FDNUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPO0NBQzNCLEVBQUUsb0JBQW9CLEVBQUUsVUFBVTtDQUNsQyxFQUFFLG9CQUFvQixFQUFFLFVBQVU7Q0FDbEMsRUFBRSxpQkFBaUIsRUFBRSxPQUFPO0NBQzVCLEVBQUUsa0JBQWtCLEVBQUUsUUFBUTtDQUM5QixFQUFFLGNBQWMsRUFBRSxRQUFRO0NBQzFCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksY0FBYyxHQUFHO0NBQ3RCLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxnQkFBZ0I7Q0FDdkcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGFBQWE7Q0FDckgsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGFBQWE7Q0FDL0MsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVE7Q0FDbEUsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsd0JBQXdCLEVBQUUsVUFBVTtDQUN4RSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsY0FBYztDQUNoRSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQjtDQUM1RCxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLG1CQUFtQjtDQUN6RixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUseUJBQXlCO0NBQy9FLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLFdBQVc7Q0FDbEgsRUFBRSxDQUFDOzs7Q0FHSCxDQUFDLFNBQVMsYUFBYSxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0NBQ2pDLEVBQUUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFN0IsRUFBRSxLQUFLLFlBQVksQ0FBQyxtQkFBbUIsR0FBRzs7Q0FFMUMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLE1BQU07O0NBRVQ7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLEdBQUcsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0NBQ3hELEdBQUcsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLGVBQWUsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7O0NBRXBFLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU1RCxHQUFHLEtBQUssUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUc7O0NBRWxDLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxvQ0FBb0MsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLDRCQUE0QixHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztDQUN4SCxJQUFJLE9BQU8sQ0FBQyxDQUFDOztDQUViLElBQUk7O0NBRUosR0FBRyxPQUFPLFFBQVEsQ0FBQzs7Q0FFbkIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyx5QkFBeUIsRUFBRSxHQUFHLEVBQUUsbUJBQW1CLEdBQUc7O0NBRWhFLEVBQUUsSUFBSSxRQUFRLENBQUM7O0NBRWYsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHOztDQUVmLEdBQUcsUUFBUSxHQUFHLGNBQWMsQ0FBQzs7Q0FFN0IsR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsR0FBRzs7Q0FFOUIsR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0IsR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDLG1CQUFtQixHQUFHOztDQUV4QyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMkhBQTJILEVBQUUsQ0FBQztDQUMvSSxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzs7Q0FFbkMsR0FBRzs7Q0FFSDtDQUNBLEVBQUUsS0FBSyxRQUFRLEtBQUssY0FBYyxJQUFJLG1CQUFtQixHQUFHOztDQUU1RCxHQUFHLFFBQVEsR0FBRyxhQUFhLENBQUM7O0NBRTVCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLFFBQVEsQ0FBQzs7Q0FFbEIsRUFBRTs7Q0FFRixDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxHQUFHOztDQUVqRyxFQUFFLElBQUksUUFBUSxHQUFHLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTVDO0NBQ0E7O0NBRUEsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEUsRUFBRSxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRTFDLEVBQUUsS0FBSyxRQUFRLENBQUMsU0FBUyxLQUFLLElBQUksR0FBRzs7Q0FFckMsR0FBRyxTQUFTLEdBQUcsWUFBWSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRWxFLEdBQUcsS0FBSyxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7Q0FFM0MsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUUzSCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxJQUFJLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7Q0FFdkQsRUFBRSxJQUFJLFVBQVUsR0FBRzs7Q0FFbkIsR0FBRyxRQUFRLEVBQUUsUUFBUTs7Q0FFckIsR0FBRyxTQUFTLEVBQUUsU0FBUztDQUN2QixHQUFHLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxjQUFjO0NBQ3RELEdBQUcsY0FBYyxFQUFFLHlCQUF5QixFQUFFLEVBQUUsRUFBRSxtQkFBbUIsS0FBSyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUU7Q0FDcEksR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHO0NBQ3ZCLEdBQUcsV0FBVyxFQUFFLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRTtDQUM5RSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU07Q0FDN0IsR0FBRyxVQUFVLEVBQUUsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU87Q0FDekQsR0FBRyxjQUFjLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO0NBQ3BGLEdBQUcsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyx1QkFBdUIsUUFBUSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyx1QkFBdUIsRUFBRSxFQUFFO0NBQ2pLLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsUUFBUTtDQUNqQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUs7Q0FDM0IsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0NBQ3ZDLEdBQUcsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO0NBQzlGLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTztDQUMvQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVM7Q0FDbkMsR0FBRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxlQUFlO0NBQy9DLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWTtDQUN6QyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFlBQVk7Q0FDekMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0NBQ3ZDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsUUFBUTs7Q0FFakMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxXQUFXOztDQUV2QyxHQUFHLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTzs7Q0FFNUIsR0FBRyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7O0NBRXRDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHO0NBQ2QsR0FBRyxNQUFNLEVBQUUsUUFBUSxDQUFDLEdBQUc7Q0FDdkIsR0FBRyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUU7O0NBRW5DLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEtBQUssV0FBVzs7Q0FFaEQsR0FBRyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7Q0FDNUMsR0FBRyxzQkFBc0IsRUFBRSxZQUFZLENBQUMsc0JBQXNCOztDQUU5RCxHQUFHLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsR0FBRyxDQUFDO0NBQzlDLEdBQUcsUUFBUSxFQUFFLFFBQVE7Q0FDckIsR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsbUJBQW1COztDQUVyRCxHQUFHLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtDQUN0QyxHQUFHLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtDQUN0QyxHQUFHLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZTtDQUM1QyxHQUFHLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZTs7Q0FFNUMsR0FBRyxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNO0NBQzFDLEdBQUcsY0FBYyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTTtDQUN0QyxHQUFHLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU07Q0FDcEMsR0FBRyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU07Q0FDNUMsR0FBRyxhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNOztDQUVwQyxHQUFHLGlCQUFpQixFQUFFLFdBQVc7Q0FDakMsR0FBRyxtQkFBbUIsRUFBRSxpQkFBaUI7O0NBRXpDLEdBQUcsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTOztDQUVoQyxHQUFHLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztDQUNwRyxHQUFHLGFBQWEsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUk7O0NBRXpDLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO0NBQ3BDLEdBQUcsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLHVCQUF1Qjs7Q0FFNUQsR0FBRyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCOztDQUVsRCxHQUFHLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztDQUNoQyxHQUFHLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLFVBQVU7Q0FDNUMsR0FBRyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFROztDQUV4QyxHQUFHLFlBQVksRUFBRSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEtBQUssU0FBUyxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUcsS0FBSzs7Q0FFeEYsR0FBRyxDQUFDOztDQUVKLEVBQUUsT0FBTyxVQUFVLENBQUM7O0NBRXBCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxRQUFRLEVBQUUsVUFBVSxHQUFHOztDQUV6RCxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7Q0FFakIsRUFBRSxLQUFLLFVBQVUsQ0FBQyxRQUFRLEdBQUc7O0NBRTdCLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRXJDLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRXZDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLFFBQVEsQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUV4QyxHQUFHLE1BQU0sSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sR0FBRzs7Q0FFeEMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQ3ZCLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0NBRTNDLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5ELEdBQUc7O0NBRUgsRUFBRSxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxHQUFHOztDQUUvRCxFQUFFLElBQUksT0FBTyxDQUFDOztDQUVkO0NBQ0EsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxHQUFHLElBQUksV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxJQUFJLEtBQUssSUFBSSxHQUFHOztDQUVwQyxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUM7Q0FDMUIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7O0NBRXpCLElBQUksTUFBTTs7Q0FFVixJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxLQUFLLE9BQU8sS0FBSyxTQUFTLEdBQUc7O0NBRS9CLEdBQUcsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ3RFLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFNUIsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sT0FBTyxDQUFDOztDQUVqQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsT0FBTyxHQUFHOztDQUU1QyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxLQUFLLENBQUMsR0FBRzs7Q0FFcEM7Q0FDQSxHQUFHLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDdkMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDbkQsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWxCO0NBQ0EsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXJCLEdBQUc7O0NBRUgsRUFBRSxDQUFDOztDQUVIO0NBQ0EsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzs7Q0FFMUIsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxhQUFhLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxHQUFHOztDQUV2RyxDQUFDLElBQUksU0FBUyxLQUFLLE9BQU8sc0JBQXNCLEtBQUssV0FBVyxJQUFJLEdBQUcsWUFBWSxzQkFBc0IsRUFBRSxDQUFDOztDQUU1Rzs7Q0FFQSxDQUFDLFNBQVMsY0FBYyxFQUFFLEtBQUssRUFBRSxPQUFPLEdBQUc7O0NBRTNDLEVBQUUsS0FBSyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sR0FBRzs7Q0FFekQ7Q0FDQTs7Q0FFQSxHQUFHLElBQUksS0FBSyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUvRCxHQUFHLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsOEJBQThCLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDckYsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztDQUNwRCxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDOztDQUV0RCxHQUFHLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDM0MsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVsRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUseUNBQXlDLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUUvSixHQUFHLE9BQU8sTUFBTSxDQUFDOztDQUVqQixHQUFHOztDQUVILEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLFNBQVMsWUFBWSxFQUFFLEtBQUssR0FBRzs7Q0FFaEMsRUFBRSxPQUFPLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVqRixFQUFFOztDQUVGLENBQUMsU0FBUyxjQUFjLEVBQUUsS0FBSyxHQUFHOztDQUVsQyxFQUFFLEtBQUssS0FBSyxZQUFZLGdCQUFnQixJQUFJLEtBQUssWUFBWSxpQkFBaUIsR0FBRzs7Q0FFakYsR0FBRyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLDhCQUE4QixFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3JGLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ3pELEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUzRCxHQUFHLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDM0MsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVqRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0RBQWtELEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV4SyxHQUFHLE9BQU8sTUFBTSxDQUFDOztDQUVqQixHQUFHOztDQUVILEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLFNBQVMsc0JBQXNCLEVBQUUsT0FBTyxHQUFHOztDQUU1QyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxLQUFLLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssbUJBQW1CO0NBQ3pGLEtBQUssT0FBTyxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUUsQ0FBQzs7Q0FFakYsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLFNBQVMsY0FBYyxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsRUFBRSxLQUFLLENBQUMsS0FBSyxhQUFhLElBQUksQ0FBQyxLQUFLLDBCQUEwQixJQUFJLENBQUMsS0FBSyx5QkFBeUIsR0FBRzs7Q0FFcEcsR0FBRyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7O0NBRXRCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUM7O0NBRXBCLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxTQUFTLGdCQUFnQixFQUFFLEtBQUssR0FBRzs7Q0FFcEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOztDQUU3QixFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFN0QsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFL0IsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUM7OztDQUd6QixFQUFFOztDQUVGLENBQUMsU0FBUyxxQkFBcUIsRUFBRSxLQUFLLEdBQUc7O0NBRXpDLEVBQUUsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7Q0FFbEMsRUFBRSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLENBQUM7O0NBRXZFLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXpDLEVBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDOztDQUV6QixFQUFFOztDQUVGOztDQUVBLENBQUMsU0FBUyxpQkFBaUIsRUFBRSxPQUFPLEdBQUc7O0NBRXZDLEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUVwRCxFQUFFLEtBQUssT0FBTyxDQUFDLEtBQUssSUFBSSxpQkFBaUIsQ0FBQyx5QkFBeUIsR0FBRzs7Q0FFdEU7O0NBRUEsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLENBQUM7O0NBRXBFLEdBQUcsTUFBTTs7Q0FFVDs7Q0FFQSxHQUFHLEtBQUssaUJBQWlCLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxPQUFPOztDQUU3RCxHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7O0NBRXpELEdBQUc7O0NBRUg7Q0FDQSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLHNCQUFzQixFQUFFLFlBQVksR0FBRzs7Q0FFakQsRUFBRSxJQUFJLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDOUQsRUFBRSxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUVqRSxFQUFFLEtBQUssRUFBRSxZQUFZLEdBQUcsT0FBTzs7Q0FFL0IsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGNBQWMsS0FBSyxTQUFTLEdBQUc7O0NBRXhELEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7Q0FFekQsR0FBRzs7Q0FFSCxFQUFFLEtBQUssWUFBWSxDQUFDLFlBQVksR0FBRzs7Q0FFbkMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUV2QyxHQUFHOztDQUVILEVBQUUsS0FBSyxZQUFZLENBQUMsdUJBQXVCLEdBQUc7O0NBRTlDLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbEMsSUFBSSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM1RSxJQUFJLEtBQUssc0JBQXNCLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTlILElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUM7Q0FDdEUsR0FBRyxLQUFLLHNCQUFzQixDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUV4SCxHQUFHOztDQUVILEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGOzs7O0NBSUEsQ0FBQyxTQUFTLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHOztDQUV4QyxFQUFFLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsT0FBTyxHQUFHOztDQUVoRixHQUFHLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7O0NBRTdCLEdBQUcsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUU5QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUVBQXVFLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXJHLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxRQUFRLEtBQUssS0FBSyxHQUFHOztDQUUxQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0VBQXdFLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXRHLElBQUksTUFBTTs7Q0FFVixJQUFJLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDdEQsSUFBSSxPQUFPOztDQUVYLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUM3QyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7Q0FFeEUsRUFBRTs7Q0FFRixDQUFDLFNBQVMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUc7O0NBRTFDLEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUVwRCxFQUFFLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHOztDQUVwQyxHQUFHLEtBQUssT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksaUJBQWlCLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEdBQUc7O0NBRWpGLElBQUksS0FBSyxFQUFFLGlCQUFpQixDQUFDLHlCQUF5QixHQUFHOztDQUV6RCxLQUFLLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFN0QsS0FBSyxpQkFBaUIsQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRXZFLEtBQUssVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDOztDQUU1QixLQUFLOztDQUVMLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDO0NBQy9DLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMseUJBQXlCLEVBQUUsQ0FBQzs7Q0FFM0YsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTlELElBQUksSUFBSSxZQUFZLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0NBQ2xFLElBQUksSUFBSSxhQUFhLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUVuRixJQUFJLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkIsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuQyxLQUFLLEtBQUssRUFBRSxZQUFZLElBQUksRUFBRSxhQUFhLEdBQUc7O0NBRTlDLE1BQU0sU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7Q0FFekYsTUFBTSxNQUFNOztDQUVaLE1BQU0sU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyRixNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSSxJQUFJLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFO0NBQzlCLElBQUksaUJBQWlCLEdBQUcsWUFBWSxFQUFFLEtBQUssRUFBRTtDQUM3QyxJQUFJLFFBQVEsR0FBRyxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRTtDQUMvQyxJQUFJLE1BQU0sR0FBRyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDOztDQUU1QyxJQUFJLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFN0UsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuQyxLQUFLLEtBQUssRUFBRSxZQUFZLEdBQUc7O0NBRTNCLE1BQU0sS0FBSyxhQUFhLEdBQUc7O0NBRTNCLE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkssT0FBTyxNQUFNOztDQUViLE9BQU8sS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFOUcsT0FBTzs7Q0FFUCxNQUFNLE1BQU07O0NBRVosTUFBTSxJQUFJLE1BQU0sRUFBRSxPQUFPLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQzs7Q0FFbkQsTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUzRCxPQUFPLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLE9BQU8sS0FBSyxPQUFPLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFNUUsUUFBUSxLQUFLLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRzs7Q0FFN0UsU0FBUyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLDJCQUEyQixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUVySSxTQUFTLE1BQU07O0NBRWYsU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFLGlHQUFpRyxFQUFFLENBQUM7O0NBRTNILFNBQVM7O0NBRVQsUUFBUSxNQUFNOztDQUVkLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUksUUFBUTs7Q0FFUixPQUFPOztDQUVQLE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJLEtBQUssT0FBTyxDQUFDLGVBQWUsSUFBSSxpQkFBaUIsR0FBRzs7Q0FFeEQsS0FBSyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUVoRCxLQUFLOztDQUVMLElBQUksaUJBQWlCLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7O0NBRWxELElBQUksS0FBSyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXhELElBQUksTUFBTTs7Q0FFVixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUMvQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLENBQUM7O0NBRTNGLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHOztDQUVqRCxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUM3QyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7O0NBRXRGLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEdBQUc7O0NBRTFFLEVBQUUsSUFBSSxTQUFTLENBQUM7O0NBRWhCLEVBQUUsS0FBSyxpQkFBaUIsR0FBRzs7Q0FFM0IsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztDQUN6RixHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUV6RixHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Q0FDakcsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDOztDQUVqRyxHQUFHLE1BQU07O0NBRVQsR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztDQUMzRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUUzRSxHQUFHLEtBQUssT0FBTyxDQUFDLEtBQUssS0FBSyxtQkFBbUIsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLG1CQUFtQixHQUFHOztDQUV6RixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsK0hBQStILEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTdKLElBQUk7O0NBRUosR0FBRyxHQUFHLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO0NBQ2pHLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakcsR0FBRyxLQUFLLE9BQU8sQ0FBQyxTQUFTLEtBQUssYUFBYSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssWUFBWSxHQUFHOztDQUVwRixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUlBQWlJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRS9KLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxFQUFFLENBQUM7O0NBRWpFLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRW5CLEdBQUcsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLEtBQUssSUFBSSxHQUFHLE9BQU87Q0FDckcsR0FBRyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLEVBQUUsS0FBSyxJQUFJLEdBQUcsT0FBTzs7Q0FFOUcsR0FBRyxLQUFLLE9BQU8sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsbUJBQW1CLEdBQUc7O0NBRWxGLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDNUksSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7O0NBRXZFLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRzs7Q0FFNUQsRUFBRSxLQUFLLGlCQUFpQixDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUc7O0NBRXJELEdBQUcsaUJBQWlCLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFeEMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0NBRTNELEdBQUcsaUJBQWlCLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFMUQsR0FBRyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxFQUFFLENBQUM7Q0FDN0MsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7O0NBRXhFLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQzVELEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsOEJBQThCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDbEYsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7O0NBRW5FLEVBQUUsSUFBSSxLQUFLLEdBQUcsY0FBYyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDOztDQUUzRSxFQUFFLEtBQUssc0JBQXNCLEVBQUUsT0FBTyxFQUFFLElBQUksWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEtBQUssR0FBRzs7Q0FFOUUsR0FBRyxLQUFLLEdBQUcsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVuQyxHQUFHOztDQUVILEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxZQUFZLEVBQUUsS0FBSyxFQUFFO0NBQy9DLEVBQUUsUUFBUSxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO0NBQzdDLEVBQUUsTUFBTSxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTFDLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFckUsRUFBRSxJQUFJLE1BQU0sRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQzs7Q0FFeEMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxjQUFjLEdBQUc7O0NBRWhDOztDQUVBLEdBQUcsSUFBSSxjQUFjLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQzs7Q0FFNUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHOztDQUVyQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0NBQ3hGLElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzs7Q0FFNUMsSUFBSSxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUUzQjtDQUNBLElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQzs7Q0FFM0MsSUFBSTs7Q0FFSixHQUFHLEtBQUssT0FBTyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksY0FBYyxLQUFLLEdBQUcsQ0FBQyxlQUFlLEdBQUc7O0NBRW5GO0NBQ0E7Q0FDQTtDQUNBLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssZUFBZSxHQUFHOztDQUVsRixZQUFZLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNkZBQTZGLEVBQUUsQ0FBQzs7Q0FFMUgsS0FBSyxPQUFPLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0NBQ3RDLEtBQUssTUFBTSxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTdDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSjtDQUNBO0NBQ0EsR0FBRyxLQUFLLE9BQU8sQ0FBQyxNQUFNLEtBQUssa0JBQWtCLEdBQUc7O0NBRWhELElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7O0NBRXZDO0NBQ0E7Q0FDQTtDQUNBLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLLGtCQUFrQixHQUFHOztDQUUvQyxZQUFZLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0ZBQWtGLEVBQUUsQ0FBQzs7Q0FFL0csS0FBSyxPQUFPLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0NBQ3ZDLEtBQUssTUFBTSxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTdDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFL0csR0FBRyxNQUFNLEtBQUssT0FBTyxDQUFDLGFBQWEsR0FBRzs7Q0FFdEM7Q0FDQTtDQUNBOztDQUVBLEdBQUcsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxpQkFBaUIsR0FBRzs7Q0FFbEQsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV6RCxLQUFLLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsS0FBSyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUVwSCxLQUFLOztDQUVMLElBQUksT0FBTyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7O0NBRXBDLElBQUksTUFBTTs7Q0FFVixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRWhILElBQUk7O0NBRUosR0FBRyxNQUFNLEtBQUssT0FBTyxDQUFDLG1CQUFtQixHQUFHOztDQUU1QyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXhELElBQUksTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUIsSUFBSSxLQUFLLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUV6RSxLQUFLLEtBQUssS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHOztDQUUxRSxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTdHLE1BQU0sTUFBTTs7Q0FFWixNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsZ0dBQWdHLEVBQUUsQ0FBQzs7Q0FFdkgsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUVwSCxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVUOztDQUVBO0NBQ0E7Q0FDQTs7Q0FFQSxHQUFHLEtBQUssT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksaUJBQWlCLEdBQUc7O0NBRWxELElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFekQsS0FBSyxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEtBQUssS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFL0UsS0FBSzs7Q0FFTCxJQUFJLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOztDQUVwQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUU3RSxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxLQUFLLE9BQU8sQ0FBQyxlQUFlLElBQUksaUJBQWlCLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7O0NBRTNGLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7O0NBRWhELEVBQUUsS0FBSyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXRELEVBQUU7O0NBRUY7O0NBRUE7Q0FDQSxDQUFDLFNBQVMsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxHQUFHOztDQUUxRixFQUFFLElBQUksUUFBUSxHQUFHLGNBQWMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQy9ELEVBQUUsSUFBSSxNQUFNLEdBQUcsY0FBYyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDM0QsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUNySCxFQUFFLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUN0RCxFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25JLEVBQUUsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUvQyxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxTQUFTLHdCQUF3QixFQUFFLFlBQVksRUFBRSxZQUFZLEdBQUc7O0NBRWpFLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXpELEVBQUUsS0FBSyxZQUFZLENBQUMsV0FBVyxJQUFJLEVBQUUsWUFBWSxDQUFDLGFBQWEsR0FBRzs7Q0FFbEUsR0FBRyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDL0csR0FBRyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFeEcsR0FBRyxNQUFNLEtBQUssWUFBWSxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQUMsYUFBYSxHQUFHOztDQUV2RSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDM0csR0FBRyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFaEgsR0FBRyxNQUFNOztDQUVUO0NBQ0EsR0FBRyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVuRyxHQUFHOztDQUVILEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWpELEVBQUU7O0NBRUY7Q0FDQSxDQUFDLFNBQVMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFlBQVksR0FBRzs7Q0FFekQsRUFBRSxJQUFJLE1BQU0sS0FBSyxZQUFZLElBQUksWUFBWSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Q0FDeEUsRUFBRSxLQUFLLE1BQU0sR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7O0NBRTVGLEVBQUUsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUV0RCxFQUFFLEtBQUssR0FBRyxZQUFZLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEdBQUc7O0NBRXBGLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDOztDQUUxRixHQUFHOztDQUVIO0NBQ0EsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsY0FBYztDQUNsRSxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztDQUNoRSxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsTUFBTSxHQUFHO0NBQ3JFLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7Q0FDOUQsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztDQUNoRSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztDQUNoRCxHQUFHOztDQUVILEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRS9DLEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUM7O0NBRXJGLEVBQUUsS0FBSyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxXQUFXLEdBQUc7O0NBRTFELEdBQUcsR0FBRyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNHLEdBQUcsTUFBTSxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLGtCQUFrQixHQUFHOztDQUV4RSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVuSCxHQUFHLE1BQU07O0NBRVQsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDOztDQUVqRCxHQUFHOztDQUVILEVBQUU7O0NBRUY7Q0FDQSxDQUFDLFNBQVMsc0JBQXNCLEVBQUUsWUFBWSxHQUFHOztDQUVqRCxFQUFFLElBQUksc0JBQXNCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFOUQsRUFBRSxJQUFJLE1BQU0sS0FBSyxZQUFZLENBQUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFLENBQUM7O0NBRWpFLEVBQUUsS0FBSyxZQUFZLENBQUMsWUFBWSxHQUFHOztDQUVuQyxHQUFHLEtBQUssTUFBTSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQzs7Q0FFN0YsR0FBRyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFaEYsR0FBRyxNQUFNOztDQUVULEdBQUcsS0FBSyxNQUFNLEdBQUc7O0NBRWpCLElBQUksc0JBQXNCLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDOztDQUVuRCxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRW5DLEtBQUssR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDNUYsS0FBSyxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUMvRSxLQUFLLHdCQUF3QixFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUU5RixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVixJQUFJLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0NBQ3RGLElBQUksc0JBQXNCLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Q0FDekUsSUFBSSx3QkFBd0IsRUFBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFeEYsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsR0FBRyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUvQyxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxTQUFTLGlCQUFpQixFQUFFLFlBQVksR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDOUQsRUFBRSxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUVqRSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsQ0FBQzs7Q0FFcEUsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUV6RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQzs7Q0FFekIsRUFBRSxJQUFJLE1BQU0sS0FBSyxZQUFZLENBQUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFLENBQUM7Q0FDakUsRUFBRSxJQUFJLGtCQUFrQixHQUFHLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFeEQ7O0NBRUEsRUFBRSxLQUFLLE1BQU0sR0FBRzs7Q0FFaEIsR0FBRyxzQkFBc0IsQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7O0NBRWxELEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbEMsSUFBSSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFN0UsSUFBSTs7Q0FFSixHQUFHLE1BQU07O0NBRVQsR0FBRyxzQkFBc0IsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFdkUsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLEtBQUssTUFBTSxHQUFHOztDQUVoQixHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxDQUFDO0NBQy9FLEdBQUcsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFMUYsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxJQUFJLHVCQUF1QixFQUFFLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLDJCQUEyQixHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4SixJQUFJOztDQUVKLEdBQUcsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0NBQ2hILEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRW5ELEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztDQUN6RSxHQUFHLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0NBQ3BGLEdBQUcsdUJBQXVCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7O0NBRTdILEdBQUcsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUMxRyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLEtBQUssWUFBWSxDQUFDLFdBQVcsR0FBRzs7Q0FFbEMsR0FBRyxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFMUMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyx3QkFBd0IsRUFBRSxZQUFZLEdBQUc7O0NBRW5ELEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQzs7Q0FFckMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxlQUFlLElBQUksWUFBWSxFQUFFLFlBQVksRUFBRTtDQUM5RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssYUFBYTtDQUN2QyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssWUFBWSxHQUFHOztDQUV6QyxHQUFHLElBQUksTUFBTSxHQUFHLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztDQUMvRyxHQUFHLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDOztDQUUvRCxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQzdDLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoQyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVyQyxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztDQUNsQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0NBQ3RDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0NBQ3BELENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0NBQzVDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDOztDQUUxRCxDQUFDOztDQUVEO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGVBQWUsR0FBRzs7Q0FFM0IsQ0FBQyxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7O0NBRXJCLENBQUMsU0FBUyxHQUFHLEVBQUUsTUFBTSxHQUFHOztDQUV4QixFQUFFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Q0FDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxHQUFHLEtBQUssU0FBUyxHQUFHOztDQUUzQixHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7Q0FDWixHQUFHLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRTVCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLEdBQUcsQ0FBQzs7Q0FFYixFQUFFOztDQUVGLENBQUMsU0FBUyxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUUzQixFQUFFLE9BQU8sVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRTs7Q0FFRixDQUFDLFNBQVMsS0FBSyxHQUFHOztDQUVsQixFQUFFLFVBQVUsR0FBRyxFQUFFLENBQUM7O0NBRWxCLEVBQUU7O0NBRUYsQ0FBQyxPQUFPO0NBQ1IsRUFBRSxHQUFHLEVBQUUsR0FBRztDQUNWLEVBQUUsTUFBTSxFQUFFLE1BQU07Q0FDaEIsRUFBRSxLQUFLLEVBQUUsS0FBSztDQUNkLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDOztDQUVEO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLGNBQWMsR0FBRzs7Q0FFdEQsQ0FBQyxTQUFTLFdBQVcsR0FBRzs7Q0FFeEIsRUFBRSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXJCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM1QixFQUFFLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0NBQzlCLEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV4QyxFQUFFLE9BQU87O0NBRVQsR0FBRyxPQUFPLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0NBRW5DLElBQUksS0FBSyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRXRELEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUNoRSxLQUFLLGdCQUFnQixHQUFHLFNBQVMsQ0FBQzs7Q0FFbEMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsU0FBUyxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUVoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0NBRWxCLElBQUk7O0NBRUosR0FBRyxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLEdBQUc7O0NBRXpELElBQUksS0FBSyxrQkFBa0IsS0FBSyxJQUFJLEdBQUc7O0NBRXZDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUU1QixLQUFLOztDQUVMLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUIsSUFBSSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRXZELEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxLQUFLLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFckMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsS0FBSyxFQUFFLFlBQVk7O0NBRXRCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7Q0FFbkIsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Q0FDNUIsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXhDLElBQUk7O0NBRUosR0FBRyxDQUFDOztDQUVKLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLFdBQVcsR0FBRzs7Q0FFeEIsRUFBRSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXJCLEVBQUUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Q0FDOUIsRUFBRSxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQztDQUM5QixFQUFFLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDOztDQUUvQixFQUFFLE9BQU87O0NBRVQsR0FBRyxPQUFPLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0NBRW5DLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRXJCLEtBQUssTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Q0FFN0IsS0FBSyxNQUFNOztDQUVYLEtBQUssT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Q0FFOUIsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsT0FBTyxFQUFFLFdBQVcsU0FBUyxHQUFHOztDQUVuQyxJQUFJLEtBQUssZ0JBQWdCLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxHQUFHOztDQUV0RCxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDL0IsS0FBSyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7O0NBRWxDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLE9BQU8sRUFBRSxXQUFXLFNBQVMsR0FBRzs7Q0FFbkMsSUFBSSxLQUFLLGdCQUFnQixLQUFLLFNBQVMsR0FBRzs7Q0FFMUMsS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFdEIsTUFBTSxTQUFTLFNBQVM7O0NBRXhCLE9BQU8sS0FBSyxVQUFVOztDQUV0QixRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ2pDLFFBQVEsTUFBTTs7Q0FFZCxPQUFPLEtBQUssV0FBVzs7Q0FFdkIsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNsQyxRQUFRLE1BQU07O0NBRWQsT0FBTyxLQUFLLFNBQVM7O0NBRXJCLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDaEMsUUFBUSxNQUFNOztDQUVkLE9BQU8sS0FBSyxjQUFjOztDQUUxQixRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ2xDLFFBQVEsTUFBTTs7Q0FFZCxPQUFPLEtBQUssVUFBVTs7Q0FFdEIsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNqQyxRQUFRLE1BQU07O0NBRWQsT0FBTyxLQUFLLGlCQUFpQjs7Q0FFN0IsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNsQyxRQUFRLE1BQU07O0NBRWQsT0FBTyxLQUFLLFlBQVk7O0NBRXhCLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDbkMsUUFBUSxNQUFNOztDQUVkLE9BQU8sS0FBSyxhQUFhOztDQUV6QixRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ3BDLFFBQVEsTUFBTTs7Q0FFZCxPQUFPOztDQUVQLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWxDLE9BQU87O0NBRVAsTUFBTSxNQUFNOztDQUVaLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWhDLE1BQU07O0NBRU4sS0FBSyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7O0NBRWxDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLFNBQVMsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOztDQUVsQixJQUFJOztDQUVKLEdBQUcsUUFBUSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVoQyxJQUFJLEtBQUssaUJBQWlCLEtBQUssS0FBSyxHQUFHOztDQUV2QyxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7Q0FDNUIsS0FBSyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7O0NBRS9CLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLEtBQUssRUFBRSxZQUFZOztDQUV0QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRW5CLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0NBQzVCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0NBQzVCLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDOztDQUU3QixJQUFJOztDQUVKLEdBQUcsQ0FBQzs7Q0FFSixFQUFFOztDQUVGLENBQUMsU0FBUyxhQUFhLEdBQUc7O0NBRTFCLEVBQUUsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUVyQixFQUFFLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7Q0FDaEMsRUFBRSxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQztDQUMvQixFQUFFLElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0NBQ3BDLEVBQUUsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7Q0FDaEMsRUFBRSxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztDQUNqQyxFQUFFLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0NBQ2pDLEVBQUUsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7O0NBRWpDLEVBQUUsT0FBTzs7Q0FFVCxHQUFHLE9BQU8sRUFBRSxXQUFXLFdBQVcsR0FBRzs7Q0FFckMsSUFBSSxLQUFLLFdBQVcsR0FBRzs7Q0FFdkIsS0FBSyxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUUvQixLQUFLLE1BQU07O0NBRVgsS0FBSyxPQUFPLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVoQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxPQUFPLEVBQUUsV0FBVyxXQUFXLEdBQUc7O0NBRXJDLElBQUksS0FBSyxrQkFBa0IsS0FBSyxXQUFXLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRTFELEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUNuQyxLQUFLLGtCQUFrQixHQUFHLFdBQVcsQ0FBQzs7Q0FFdEMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsT0FBTyxFQUFFLFdBQVcsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEdBQUc7O0NBRTlELElBQUksS0FBSyxrQkFBa0IsS0FBSyxXQUFXO0NBQzNDLFNBQVMsaUJBQWlCLE1BQU0sVUFBVTtDQUMxQyxTQUFTLHNCQUFzQixLQUFLLFdBQVcsR0FBRzs7Q0FFbEQsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTVELEtBQUssa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0NBQ3RDLEtBQUssaUJBQWlCLEdBQUcsVUFBVSxDQUFDO0NBQ3BDLEtBQUssc0JBQXNCLEdBQUcsV0FBVyxDQUFDOztDQUUxQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxLQUFLLEVBQUUsV0FBVyxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksR0FBRzs7Q0FFL0QsSUFBSSxLQUFLLGtCQUFrQixNQUFNLFdBQVc7Q0FDNUMsU0FBUyxtQkFBbUIsS0FBSyxZQUFZO0NBQzdDLFNBQVMsbUJBQW1CLEtBQUssWUFBWSxHQUFHOztDQUVoRCxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFN0QsS0FBSyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7Q0FDdEMsS0FBSyxtQkFBbUIsR0FBRyxZQUFZLENBQUM7Q0FDeEMsS0FBSyxtQkFBbUIsR0FBRyxZQUFZLENBQUM7O0NBRXhDLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLFNBQVMsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFaEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOztDQUVsQixJQUFJOztDQUVKLEdBQUcsUUFBUSxFQUFFLFdBQVcsT0FBTyxHQUFHOztDQUVsQyxJQUFJLEtBQUssbUJBQW1CLEtBQUssT0FBTyxHQUFHOztDQUUzQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDaEMsS0FBSyxtQkFBbUIsR0FBRyxPQUFPLENBQUM7O0NBRW5DLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLEtBQUssRUFBRSxZQUFZOztDQUV0QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRW5CLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQzlCLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQzlCLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0NBQzdCLElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0NBQ2xDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQzlCLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0NBQy9CLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0NBQy9CLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDOztDQUUvQixJQUFJOztDQUVKLEdBQUcsQ0FBQzs7Q0FFSixFQUFFOztDQUVGOztDQUVBLENBQUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztDQUNyQyxDQUFDLElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7Q0FDckMsQ0FBQyxJQUFJLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDOztDQUV6QyxDQUFDLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUNwRSxDQUFDLElBQUksYUFBYSxHQUFHLElBQUksVUFBVSxFQUFFLG1CQUFtQixFQUFFLENBQUM7Q0FDM0QsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLElBQUksVUFBVSxFQUFFLG1CQUFtQixFQUFFLENBQUM7Q0FDL0QsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLElBQUksVUFBVSxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0NBRS9ELENBQUMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksd0JBQXdCLEdBQUcsSUFBSSxDQUFDOztDQUVyQyxDQUFDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQztDQUM1QixDQUFDLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0NBQ2pDLENBQUMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0NBQzVCLENBQUMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0NBQzVCLENBQUMsSUFBSSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7Q0FDdEMsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQztDQUNqQyxDQUFDLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0NBQ2pDLENBQUMsSUFBSSx3QkFBd0IsR0FBRyxLQUFLLENBQUM7O0NBRXRDLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Q0FDN0IsQ0FBQyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUM7O0NBRTVCLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7O0NBRTdCLENBQUMsSUFBSSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7Q0FDdkMsQ0FBQyxJQUFJLHlCQUF5QixHQUFHLElBQUksQ0FBQzs7Q0FFdEMsQ0FBQyxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDOztDQUVqRSxDQUFDLElBQUksT0FBTyxHQUFHLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzFGLENBQUMsSUFBSSxrQkFBa0IsR0FBRyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDOztDQUV2RCxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQy9CLENBQUMsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7O0NBRS9CLENBQUMsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNwQyxDQUFDLElBQUksZUFBZSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXJDLENBQUMsU0FBUyxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0NBRS9DLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRW5DLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDbEMsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQzlELEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFOUQsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXJGLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE9BQU8sQ0FBQzs7Q0FFakIsRUFBRTs7Q0FFRixDQUFDLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztDQUN4QixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsYUFBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuRixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxhQUFhLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEg7O0NBRUEsQ0FBQyxTQUFTLElBQUksR0FBRzs7Q0FFakIsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM1QixFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTlCLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUMxQixFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7O0NBRXhDLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3hCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQzlCLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ3JCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDOztDQUVoQyxFQUFFOztDQUVGLENBQUMsU0FBUyxjQUFjLEdBQUc7O0NBRTNCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFM0QsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxTQUFTLGVBQWUsRUFBRSxTQUFTLEdBQUc7O0NBRXZDLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFakMsRUFBRSxLQUFLLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRzs7Q0FFOUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDM0MsR0FBRyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXRDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRzs7Q0FFOUMsR0FBRyxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixFQUFFLENBQUM7O0NBRTlELEdBQUcsU0FBUyxDQUFDLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUN0RCxHQUFHLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFdEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyx5QkFBeUIsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEdBQUc7O0NBRW5FLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFakMsRUFBRSxLQUFLLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRzs7Q0FFOUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDM0MsR0FBRyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXRDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLGdCQUFnQixHQUFHOztDQUU3RCxHQUFHLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7Q0FFOUQsR0FBRyxTQUFTLENBQUMsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUM7Q0FDckUsR0FBRyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyx1QkFBdUIsR0FBRzs7Q0FFcEMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWpFLEdBQUcsS0FBSyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsS0FBSyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0NBRXhELElBQUksRUFBRSxDQUFDLHdCQUF3QixFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLElBQUksaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUUvQixJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsTUFBTSxFQUFFLEVBQUUsR0FBRzs7Q0FFdkIsRUFBRSxLQUFLLFlBQVksRUFBRSxFQUFFLEVBQUUsS0FBSyxJQUFJLEdBQUc7O0NBRXJDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNuQixHQUFHLFlBQVksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7O0NBRTdCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsT0FBTyxFQUFFLEVBQUUsR0FBRzs7Q0FFeEIsRUFBRSxLQUFLLFlBQVksRUFBRSxFQUFFLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRXRDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNwQixHQUFHLFlBQVksRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUM7O0NBRTlCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsMkJBQTJCLEdBQUc7O0NBRXhDLEVBQUUsS0FBSyx3QkFBd0IsS0FBSyxJQUFJLEdBQUc7O0NBRTNDLEdBQUcsd0JBQXdCLEdBQUcsRUFBRSxDQUFDOztDQUVqQyxHQUFHLEtBQUssVUFBVSxDQUFDLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRTtDQUMxRCxRQUFRLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLEVBQUU7Q0FDekQsUUFBUSxVQUFVLENBQUMsR0FBRyxFQUFFLCtCQUErQixFQUFFLEdBQUc7O0NBRTVELElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsMEJBQTBCLEVBQUUsQ0FBQzs7Q0FFbkUsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFaEQsS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRW5ELEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyx3QkFBd0IsQ0FBQzs7Q0FFbEMsRUFBRTs7Q0FFRixDQUFDLFNBQVMsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixHQUFHOztDQUUzSSxFQUFFLEtBQUssUUFBUSxLQUFLLFVBQVUsR0FBRzs7Q0FFakMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUV0QixHQUFHLE1BQU07O0NBRVQsR0FBRyxPQUFPLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUV2QixHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLEtBQUssZUFBZSxJQUFJLGtCQUFrQixLQUFLLHdCQUF3QixHQUFHOztDQUV6RixHQUFHLEtBQUssUUFBUSxLQUFLLGdCQUFnQixHQUFHOztDQUV4QyxJQUFJLEtBQUssa0JBQWtCLEdBQUc7O0NBRTlCLEtBQUssRUFBRSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQzFELEtBQUssRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFNUQsS0FBSyxNQUFNOztDQUVYLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDckMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxQyxLQUFLOztDQUVMLElBQUksTUFBTSxLQUFLLFFBQVEsS0FBSyxtQkFBbUIsR0FBRzs7Q0FFbEQsSUFBSSxLQUFLLGtCQUFrQixHQUFHOztDQUU5QixLQUFLLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUMxRCxLQUFLLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDOztDQUU5RixLQUFLLE1BQU07O0NBRVgsS0FBSyxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNyQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzs7Q0FFckQsS0FBSzs7Q0FFTCxJQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUssZ0JBQWdCLEdBQUc7O0NBRS9DLElBQUksS0FBSyxrQkFBa0IsR0FBRzs7Q0FFOUIsS0FBSyxFQUFFLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDMUQsS0FBSyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUUxRSxLQUFLLE1BQU07O0NBRVgsS0FBSyxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNyQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRTNDLEtBQUs7O0NBRUwsSUFBSSxNQUFNOztDQUVWLElBQUksS0FBSyxrQkFBa0IsR0FBRzs7Q0FFOUIsS0FBSyxFQUFFLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDMUQsS0FBSyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzs7Q0FFNUYsS0FBSyxNQUFNOztDQUVYLEtBQUssRUFBRSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQzFELEtBQUssRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0NBRWxHLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLGVBQWUsR0FBRyxRQUFRLENBQUM7Q0FDOUIsR0FBRyx3QkFBd0IsR0FBRyxrQkFBa0IsQ0FBQzs7Q0FFakQsR0FBRzs7Q0FFSCxFQUFFLEtBQUssUUFBUSxLQUFLLGNBQWMsR0FBRzs7Q0FFckMsR0FBRyxrQkFBa0IsR0FBRyxrQkFBa0IsSUFBSSxhQUFhLENBQUM7Q0FDNUQsR0FBRyxhQUFhLEdBQUcsYUFBYSxJQUFJLFFBQVEsQ0FBQztDQUM3QyxHQUFHLGFBQWEsR0FBRyxhQUFhLElBQUksUUFBUSxDQUFDOztDQUU3QyxHQUFHLEtBQUssYUFBYSxLQUFLLG9CQUFvQixJQUFJLGtCQUFrQixLQUFLLHlCQUF5QixHQUFHOztDQUVyRyxJQUFJLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQzs7Q0FFdEcsSUFBSSxvQkFBb0IsR0FBRyxhQUFhLENBQUM7Q0FDekMsSUFBSSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQzs7Q0FFbkQsSUFBSTs7Q0FFSixHQUFHLEtBQUssUUFBUSxLQUFLLGVBQWUsSUFBSSxRQUFRLEtBQUssZUFBZSxJQUFJLGFBQWEsS0FBSyxvQkFBb0IsSUFBSSxhQUFhLEtBQUssb0JBQW9CLEdBQUc7O0NBRTNKLElBQUksRUFBRSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDOztDQUVySixJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUM7Q0FDL0IsSUFBSSxlQUFlLEdBQUcsUUFBUSxDQUFDO0NBQy9CLElBQUksb0JBQW9CLEdBQUcsYUFBYSxDQUFDO0NBQ3pDLElBQUksb0JBQW9CLEdBQUcsYUFBYSxDQUFDOztDQUV6QyxJQUFJOztDQUVKLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLG9CQUFvQixHQUFHLElBQUksQ0FBQztDQUMvQixHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUM7Q0FDMUIsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDO0NBQzFCLEdBQUcseUJBQXlCLEdBQUcsSUFBSSxDQUFDO0NBQ3BDLEdBQUcsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0NBQy9CLEdBQUcsb0JBQW9CLEdBQUcsSUFBSSxDQUFDOztDQUUvQixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxTQUFTLFdBQVcsRUFBRSxRQUFRLEdBQUc7O0NBRWxDLEVBQUUsUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVO0NBQzlCLEtBQUssT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUU7Q0FDNUIsS0FBSyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUU1QixFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDOztDQUU3QyxFQUFFLFFBQVEsQ0FBQyxXQUFXLEtBQUssSUFBSTtDQUMvQixLQUFLLFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0NBQzdNLEtBQUssV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUUvQixFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzVDLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUM3QyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDOztDQUU3QyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUV4RyxFQUFFOztDQUVGOztDQUVBLENBQUMsU0FBUyxZQUFZLEVBQUUsU0FBUyxHQUFHOztDQUVwQyxFQUFFLEtBQUssZ0JBQWdCLEtBQUssU0FBUyxHQUFHOztDQUV4QyxHQUFHLEtBQUssU0FBUyxHQUFHOztDQUVwQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxQixJQUFJLE1BQU07O0NBRVYsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHLGdCQUFnQixHQUFHLFNBQVMsQ0FBQzs7Q0FFaEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxXQUFXLEVBQUUsUUFBUSxHQUFHOztDQUVsQyxFQUFFLEtBQUssUUFBUSxLQUFLLFlBQVksR0FBRzs7Q0FFbkMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUUxQixHQUFHLEtBQUssUUFBUSxLQUFLLGVBQWUsR0FBRzs7Q0FFdkMsSUFBSSxLQUFLLFFBQVEsS0FBSyxZQUFZLEdBQUc7O0NBRXJDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRTVCLEtBQUssTUFBTSxLQUFLLFFBQVEsS0FBSyxhQUFhLEdBQUc7O0NBRTdDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTdCLEtBQUssTUFBTTs7Q0FFWCxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDOztDQUV0QyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFM0IsR0FBRzs7Q0FFSCxFQUFFLGVBQWUsR0FBRyxRQUFRLENBQUM7O0NBRTdCLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLFlBQVksRUFBRSxLQUFLLEdBQUc7O0NBRWhDLEVBQUUsS0FBSyxLQUFLLEtBQUssZ0JBQWdCLEdBQUc7O0NBRXBDLEdBQUcsS0FBSyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVuRCxHQUFHLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFNUIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRzs7Q0FFM0QsRUFBRSxLQUFLLGFBQWEsR0FBRzs7Q0FFdkIsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0NBRXBDLEdBQUcsS0FBSywwQkFBMEIsS0FBSyxNQUFNLElBQUkseUJBQXlCLEtBQUssS0FBSyxHQUFHOztDQUV2RixJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV0QyxJQUFJLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztDQUN4QyxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQzs7Q0FFdEMsSUFBSTs7Q0FFSixHQUFHLE1BQU07O0NBRVQsR0FBRyxPQUFPLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsY0FBYyxHQUFHOztDQUUzQixFQUFFLE9BQU8sa0JBQWtCLENBQUM7O0NBRTVCLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLGNBQWMsRUFBRSxXQUFXLEdBQUc7O0NBRXhDLEVBQUUsa0JBQWtCLEdBQUcsV0FBVyxDQUFDOztDQUVuQyxFQUFFLEtBQUssV0FBVyxHQUFHOztDQUVyQixHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRTdCLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLE9BQU8sRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRTlCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLFNBQVMsYUFBYSxFQUFFLFNBQVMsR0FBRzs7Q0FFckMsRUFBRSxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUcsU0FBUyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQzs7Q0FFM0UsRUFBRSxLQUFLLGtCQUFrQixLQUFLLFNBQVMsR0FBRzs7Q0FFMUMsR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2pDLEdBQUcsa0JBQWtCLEdBQUcsU0FBUyxDQUFDOztDQUVsQyxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxTQUFTLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxHQUFHOztDQUVqRCxFQUFFLEtBQUssa0JBQWtCLEtBQUssSUFBSSxHQUFHOztDQUVyQyxHQUFHLGFBQWEsRUFBRSxDQUFDOztDQUVuQixHQUFHOztDQUVILEVBQUUsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFaEUsRUFBRSxLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0NBRXBDLEdBQUcsWUFBWSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDMUQsR0FBRyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFlBQVksQ0FBQzs7Q0FFN0QsR0FBRzs7Q0FFSCxFQUFFLEtBQUssWUFBWSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxZQUFZLEdBQUc7O0NBRWxGLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxJQUFJLGFBQWEsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDOztDQUUzRSxHQUFHLFlBQVksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0NBQ2pDLEdBQUcsWUFBWSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7O0NBRXZDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLFNBQVMsb0JBQW9CLEdBQUc7O0NBRWpDLEVBQUUsSUFBSTs7Q0FFTixHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVsRCxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUc7O0NBRXBCLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxVQUFVLEdBQUc7O0NBRXZCLEVBQUUsSUFBSTs7Q0FFTixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHOztDQUVwQixHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLFNBQVMsT0FBTyxFQUFFLE9BQU8sR0FBRzs7Q0FFN0IsRUFBRSxLQUFLLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssS0FBSyxHQUFHOztDQUVwRCxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzVELEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUUvQixFQUFFLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRXRELEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDakUsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVwQyxHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxTQUFTLEtBQUssR0FBRzs7Q0FFbEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxHQUFHLEtBQUssaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHOztDQUV2QyxJQUFJLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQyxJQUFJLGlCQUFpQixFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFL0IsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsWUFBWSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEIsRUFBRSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7O0NBRWxDLEVBQUUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQzVCLEVBQUUsb0JBQW9CLEdBQUcsRUFBRSxDQUFDOztDQUU1QixFQUFFLGVBQWUsR0FBRyxJQUFJLENBQUM7O0NBRXpCLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0NBQzFCLEVBQUUsZUFBZSxHQUFHLElBQUksQ0FBQzs7Q0FFekIsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDdEIsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Q0FDdEIsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXhCLEVBQUU7O0NBRUYsQ0FBQyxPQUFPOztDQUVSLEVBQUUsT0FBTyxFQUFFO0NBQ1gsR0FBRyxLQUFLLEVBQUUsV0FBVztDQUNyQixHQUFHLEtBQUssRUFBRSxXQUFXO0NBQ3JCLEdBQUcsT0FBTyxFQUFFLGFBQWE7Q0FDekIsR0FBRzs7Q0FFSCxFQUFFLElBQUksRUFBRSxJQUFJO0NBQ1osRUFBRSxjQUFjLEVBQUUsY0FBYztDQUNoQyxFQUFFLGVBQWUsRUFBRSxlQUFlO0NBQ2xDLEVBQUUseUJBQXlCLEVBQUUseUJBQXlCO0NBQ3RELEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCO0NBQ2xELEVBQUUsTUFBTSxFQUFFLE1BQU07Q0FDaEIsRUFBRSxPQUFPLEVBQUUsT0FBTztDQUNsQixFQUFFLDJCQUEyQixFQUFFLDJCQUEyQjs7Q0FFMUQsRUFBRSxXQUFXLEVBQUUsV0FBVztDQUMxQixFQUFFLFdBQVcsRUFBRSxXQUFXOztDQUUxQixFQUFFLFlBQVksRUFBRSxZQUFZO0NBQzVCLEVBQUUsV0FBVyxFQUFFLFdBQVc7O0NBRTFCLEVBQUUsWUFBWSxFQUFFLFlBQVk7Q0FDNUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0I7O0NBRXBDLEVBQUUsY0FBYyxFQUFFLGNBQWM7Q0FDaEMsRUFBRSxjQUFjLEVBQUUsY0FBYzs7Q0FFaEMsRUFBRSxhQUFhLEVBQUUsYUFBYTtDQUM5QixFQUFFLFdBQVcsRUFBRSxXQUFXO0NBQzFCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CO0NBQzVDLEVBQUUsVUFBVSxFQUFFLFVBQVU7O0NBRXhCLEVBQUUsT0FBTyxFQUFFLE9BQU87Q0FDbEIsRUFBRSxRQUFRLEVBQUUsUUFBUTs7Q0FFcEIsRUFBRSxLQUFLLEVBQUUsS0FBSzs7Q0FFZCxFQUFFLENBQUM7O0NBRUgsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRzs7Q0FFekQsQ0FBQyxJQUFJLGFBQWEsQ0FBQzs7Q0FFbkIsQ0FBQyxTQUFTLGdCQUFnQixHQUFHOztDQUU3QixFQUFFLEtBQUssYUFBYSxLQUFLLFNBQVMsR0FBRyxPQUFPLGFBQWEsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxFQUFFLENBQUM7O0NBRXJFLEVBQUUsS0FBSyxTQUFTLEtBQUssSUFBSSxHQUFHOztDQUU1QixHQUFHLGFBQWEsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDOztDQUUvRSxHQUFHLE1BQU07O0NBRVQsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDOztDQUVyQixHQUFHOztDQUVILEVBQUUsT0FBTyxhQUFhLENBQUM7O0NBRXZCLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLGVBQWUsRUFBRSxTQUFTLEdBQUc7O0NBRXZDLEVBQUUsS0FBSyxTQUFTLEtBQUssT0FBTyxHQUFHOztDQUUvQixHQUFHLEtBQUssRUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDO0NBQ3BGLFFBQVEsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUc7O0NBRXpGLElBQUksT0FBTyxPQUFPLENBQUM7O0NBRW5CLElBQUk7O0NBRUosR0FBRyxTQUFTLEdBQUcsU0FBUyxDQUFDOztDQUV6QixHQUFHOztDQUVILEVBQUUsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHOztDQUVqQyxHQUFHLEtBQUssRUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDO0NBQ3RGLFFBQVEsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUc7O0NBRTNGLElBQUksT0FBTyxTQUFTLENBQUM7O0NBRXJCLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLE9BQU8sTUFBTSxDQUFDOztDQUVoQixFQUFFOztDQUVGLENBQUMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Q0FDckYsQ0FBQyxJQUFJLFlBQVksR0FBRyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWpELENBQUMsS0FBSyxZQUFZLEtBQUssU0FBUyxHQUFHOztDQUVuQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUN0RyxFQUFFLFNBQVMsR0FBRyxZQUFZLENBQUM7O0NBRTNCLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFbEgsQ0FBQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0NBQ2pFLENBQUMsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO0NBQzlFLENBQUMsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztDQUM3RCxDQUFDLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLHlCQUF5QixFQUFFLENBQUM7O0NBRXRFLENBQUMsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUM5RCxDQUFDLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztDQUMxRSxDQUFDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Q0FDN0QsQ0FBQyxJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixFQUFFLENBQUM7O0NBRTlFLENBQUMsSUFBSSxjQUFjLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0NBQzVDLENBQUMsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0NBQ3RFLENBQUMsSUFBSSxtQkFBbUIsR0FBRyxjQUFjLElBQUkscUJBQXFCLENBQUM7O0NBRW5FLENBQUMsT0FBTzs7Q0FFUixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtDQUNwQyxFQUFFLGVBQWUsRUFBRSxlQUFlOztDQUVsQyxFQUFFLFNBQVMsRUFBRSxTQUFTO0NBQ3RCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCOztDQUVoRCxFQUFFLFdBQVcsRUFBRSxXQUFXO0NBQzFCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQ3RDLEVBQUUsY0FBYyxFQUFFLGNBQWM7Q0FDaEMsRUFBRSxjQUFjLEVBQUUsY0FBYzs7Q0FFaEMsRUFBRSxhQUFhLEVBQUUsYUFBYTtDQUM5QixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQjtDQUN0QyxFQUFFLFdBQVcsRUFBRSxXQUFXO0NBQzFCLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1COztDQUUxQyxFQUFFLGNBQWMsRUFBRSxjQUFjO0NBQ2hDLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCO0NBQzlDLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1COztDQUUxQyxFQUFFLENBQUM7O0NBRUgsQ0FBQzs7Q0FFRDtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxlQUFlLEVBQUUsRUFBRSxHQUFHOztDQUUvQixDQUFDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckIsQ0FBQyxPQUFPOztDQUVSLEVBQUUsR0FBRyxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUV6QixHQUFHLEtBQUssVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLFNBQVMsR0FBRzs7Q0FFM0MsSUFBSSxPQUFPLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFOUIsSUFBSTs7Q0FFSixHQUFHLElBQUksU0FBUyxDQUFDOztDQUVqQixHQUFHLFNBQVMsSUFBSTs7Q0FFaEIsSUFBSSxLQUFLLHFCQUFxQjtDQUM5QixLQUFLLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQztDQUM3SixLQUFLLE1BQU07O0NBRVgsSUFBSSxLQUFLLGdDQUFnQztDQUN6QyxLQUFLLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLGdDQUFnQyxFQUFFLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxvQ0FBb0MsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsdUNBQXVDLEVBQUUsQ0FBQztDQUM5TCxLQUFLLE1BQU07O0NBRVgsSUFBSSxLQUFLLCtCQUErQjtDQUN4QyxLQUFLLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLCtCQUErQixFQUFFLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxtQ0FBbUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQztDQUMzTCxLQUFLLE1BQU07O0NBRVgsSUFBSSxLQUFLLGdDQUFnQztDQUN6QyxLQUFLLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLGdDQUFnQyxFQUFFLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSx1Q0FBdUMsRUFBRSxDQUFDO0NBQ25JLEtBQUssTUFBTTs7Q0FFWCxJQUFJLEtBQUssK0JBQStCO0NBQ3hDLEtBQUssU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsK0JBQStCLEVBQUUsQ0FBQztDQUNwRSxLQUFLLE1BQU07O0NBRVgsSUFBSTtDQUNKLEtBQUssU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXpDLElBQUk7O0NBRUosR0FBRyxLQUFLLFNBQVMsS0FBSyxJQUFJLEdBQUc7O0NBRTdCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsMkJBQTJCLEVBQUUsQ0FBQzs7Q0FFakYsSUFBSTs7Q0FFSixHQUFHLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUM7O0NBRWxDLEdBQUcsT0FBTyxTQUFTLENBQUM7O0NBRXBCLEdBQUc7O0NBRUgsRUFBRSxDQUFDOztDQUVILENBQUM7O0NBRUQ7Q0FDQTtDQUNBOztDQUVBLFNBQVMsYUFBYSxHQUFHOztDQUV6QixDQUFDLElBQUksS0FBSyxHQUFHLElBQUk7O0NBRWpCLEVBQUUsV0FBVyxHQUFHLElBQUk7Q0FDcEIsRUFBRSxlQUFlLEdBQUcsQ0FBQztDQUNyQixFQUFFLG9CQUFvQixHQUFHLEtBQUs7Q0FDOUIsRUFBRSxnQkFBZ0IsR0FBRyxLQUFLOztDQUUxQixFQUFFLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRTtDQUNyQixFQUFFLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFOztDQUVsQyxFQUFFLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVoRCxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQ3hCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQzs7Q0FFMUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sR0FBRzs7Q0FFN0QsRUFBRSxJQUFJLE9BQU87Q0FDYixHQUFHLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztDQUN0QixHQUFHLG1CQUFtQjtDQUN0QjtDQUNBO0NBQ0EsR0FBRyxlQUFlLEtBQUssQ0FBQztDQUN4QixHQUFHLG9CQUFvQixDQUFDOztDQUV4QixFQUFFLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDOztDQUU3QyxFQUFFLFdBQVcsR0FBRyxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuRCxFQUFFLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztDQUVsQyxFQUFFLE9BQU8sT0FBTyxDQUFDOztDQUVqQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVc7O0NBRWhDLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0NBQzFCLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV4QixFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVc7O0NBRTlCLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0NBQzNCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFckIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEdBQUc7O0NBRTdGLEVBQUUsS0FBSyxFQUFFLG9CQUFvQjtDQUM3QixJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO0NBQzFDLElBQUksZ0JBQWdCLElBQUksRUFBRSxXQUFXLEdBQUc7Q0FDeEM7O0NBRUEsR0FBRyxLQUFLLGdCQUFnQixHQUFHO0NBQzNCOztDQUVBLElBQUksYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUxQixJQUFJLE1BQU07O0NBRVYsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0NBQ3ZCLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGVBQWU7Q0FDdkQsSUFBSSxPQUFPLEdBQUcsT0FBTyxHQUFHLENBQUM7O0NBRXpCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDOztDQUUzQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDOztDQUU1QixHQUFHLFFBQVEsR0FBRyxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWxFLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFMUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQyxJQUFJOztDQUVKLEdBQUcsS0FBSyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7Q0FDbEMsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ2hFLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUM7O0NBRTdCLEdBQUc7OztDQUdILEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLFNBQVMsZ0JBQWdCLEdBQUc7O0NBRTdCLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxLQUFLLFdBQVcsR0FBRzs7Q0FFdkMsR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztDQUMvQixHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsZUFBZSxHQUFHLENBQUMsQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSCxFQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0NBQ3BDLEVBQUUsS0FBSyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7O0NBRTVCLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEdBQUc7O0NBRXBFLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxLQUFLLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7Q0FDbkQsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDOztDQUVuQixFQUFFLEtBQUssT0FBTyxLQUFLLENBQUMsR0FBRzs7Q0FFdkIsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLGFBQWEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLElBQUksR0FBRzs7Q0FFdEQsSUFBSSxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsT0FBTyxHQUFHLENBQUM7Q0FDMUMsS0FBSyxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDOztDQUU1QyxJQUFJLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFbkQsSUFBSSxLQUFLLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUc7O0NBRTNELEtBQUssUUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUU3QyxLQUFLOztDQUVMLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVM7Q0FDbkMsU0FBUyxDQUFDLEtBQUssT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUc7O0NBRXhDLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDOUIsT0FBTyxZQUFZLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLENBQUM7O0NBRXBELEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzFDLEtBQUssUUFBUSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDOztDQUV6QyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztDQUM1QixHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUU5QixHQUFHOztDQUVILEVBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7Q0FDNUI7Q0FDQSxFQUFFLE9BQU8sUUFBUSxDQUFDOztDQUVsQixFQUFFOztDQUVGLENBQUM7O0NBRUQ7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGFBQWEsRUFBRSxVQUFVLEdBQUc7O0NBRXJDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFaEQsQ0FBQyxVQUFVLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsOEJBQThCLEVBQUUsUUFBUSxFQUFFO0NBQ3pJLEVBQUUsUUFBUSxHQUFHLFVBQVUsQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSTs7Q0FFekUsRUFBRSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLO0NBQ3BFLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSTtDQUNuRSxFQUFFLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUk7Q0FDekUsRUFBRSxVQUFVLEdBQUcsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxLQUFLO0NBQ2hGLEVBQUUsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEdBQUcsSUFBSTtDQUMxRyxFQUFFLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQzs7Q0FFckgsQ0FBQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWpCLENBQUMsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7O0NBRTlCLENBQUMsSUFBSSxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0NBQ2xCLENBQUMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUVyQjs7Q0FFQSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O0NBRXJCOztDQUVBLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Q0FDdkIsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztDQUM1QixDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0NBQzVCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzs7Q0FFOUI7O0NBRUEsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekI7O0NBRUEsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztDQUMxQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7O0NBRW5DOztDQUVBLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7Q0FDeEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztDQUN6QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztDQUUxQjs7Q0FFQSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7O0NBRXRDOztDQUVBLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztDQUN0QyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7Q0FDaEMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDOztDQUVsQzs7Q0FFQSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7O0NBRTFCOztDQUVBLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSTs7Q0FFakI7O0NBRUEsRUFBRSxlQUFlLEdBQUcsSUFBSTtDQUN4QixFQUFFLG9CQUFvQixHQUFHLElBQUk7Q0FDN0IsRUFBRSxtQkFBbUIsR0FBRyxJQUFJO0NBQzVCLEVBQUUsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0NBQzFCLEVBQUUsdUJBQXVCLEdBQUcsRUFBRTtDQUM5QixFQUFFLGNBQWMsR0FBRyxJQUFJOztDQUV2QixFQUFFLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBRTtDQUNqQyxFQUFFLG1CQUFtQixHQUFHLElBQUk7O0NBRTVCLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUU7O0NBRWxDOztDQUVBLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQzs7Q0FFdkI7O0NBRUEsRUFBRSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFO0NBQ3JDLEVBQUUsV0FBVyxHQUFHLENBQUM7O0NBRWpCLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLO0NBQ3hCLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNOztDQUUxQixFQUFFLFdBQVcsR0FBRyxDQUFDOztDQUVqQixFQUFFLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7Q0FDakQsRUFBRSxZQUFZLEdBQUcsS0FBSzs7Q0FFdEIsRUFBRSxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFOztDQUVsRDs7Q0FFQSxFQUFFLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRTs7Q0FFMUI7O0NBRUEsRUFBRSxTQUFTLEdBQUcsSUFBSSxhQUFhLEVBQUU7Q0FDakMsRUFBRSxnQkFBZ0IsR0FBRyxLQUFLO0NBQzFCLEVBQUUscUJBQXFCLEdBQUcsS0FBSzs7Q0FFL0I7O0NBRUEsRUFBRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRTs7Q0FFbkMsRUFBRSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDMUIsRUFBRSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDMUIsRUFBRSxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUU7O0NBRTNCOztDQUVBLEVBQUUsT0FBTyxHQUFHOztDQUVaLEdBQUcsSUFBSSxFQUFFLEVBQUU7O0NBRVgsR0FBRyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtDQUN2QixHQUFHLFdBQVcsRUFBRSxFQUFFO0NBQ2xCLEdBQUcsb0JBQW9CLEVBQUUsRUFBRTtDQUMzQixHQUFHLHVCQUF1QixFQUFFLEVBQUU7Q0FDOUIsR0FBRyxJQUFJLEVBQUUsRUFBRTtDQUNYLEdBQUcsYUFBYSxFQUFFLEVBQUU7Q0FDcEIsR0FBRyxnQkFBZ0IsRUFBRSxFQUFFO0NBQ3ZCLEdBQUcsUUFBUSxFQUFFLEVBQUU7Q0FDZixHQUFHLEtBQUssRUFBRSxFQUFFO0NBQ1osR0FBRyxjQUFjLEVBQUUsRUFBRTtDQUNyQixHQUFHLGlCQUFpQixFQUFFLEVBQUU7Q0FDeEIsR0FBRyxJQUFJLEVBQUUsRUFBRTs7Q0FFWCxHQUFHLE9BQU8sRUFBRSxFQUFFOztDQUVkLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxXQUFXLEdBQUc7Q0FDaEIsR0FBRyxVQUFVLEVBQUUsQ0FBQztDQUNoQixHQUFHLFFBQVEsRUFBRSxDQUFDO0NBQ2QsR0FBRzs7Q0FFSCxFQUFFLFdBQVcsR0FBRzs7Q0FFaEIsR0FBRyxLQUFLLEVBQUUsQ0FBQztDQUNYLEdBQUcsS0FBSyxFQUFFLENBQUM7Q0FDWCxHQUFHLFFBQVEsRUFBRSxDQUFDO0NBQ2QsR0FBRyxLQUFLLEVBQUUsQ0FBQztDQUNYLEdBQUcsTUFBTSxFQUFFLENBQUM7O0NBRVosR0FBRyxDQUFDOztDQUVKLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRzs7Q0FFYixFQUFFLE1BQU0sRUFBRSxXQUFXO0NBQ3JCLEVBQUUsTUFBTSxFQUFFLFdBQVc7Q0FDckIsRUFBRSxRQUFRLEVBQUUsSUFBSTs7Q0FFaEIsRUFBRSxDQUFDOzs7Q0FHSDs7Q0FFQSxDQUFDLElBQUksR0FBRyxDQUFDOztDQUVULENBQUMsSUFBSTs7Q0FFTCxFQUFFLElBQUksaUJBQWlCLEdBQUc7Q0FDMUIsR0FBRyxLQUFLLEVBQUUsTUFBTTtDQUNoQixHQUFHLEtBQUssRUFBRSxNQUFNO0NBQ2hCLEdBQUcsT0FBTyxFQUFFLFFBQVE7Q0FDcEIsR0FBRyxTQUFTLEVBQUUsVUFBVTtDQUN4QixHQUFHLGtCQUFrQixFQUFFLG1CQUFtQjtDQUMxQyxHQUFHLHFCQUFxQixFQUFFLHNCQUFzQjtDQUNoRCxHQUFHLENBQUM7O0NBRUosRUFBRSxHQUFHLEdBQUcsUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUV0SSxFQUFFLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSxHQUFHOztDQUVqRCxJQUFJLE1BQU0sNkRBQTZELENBQUM7O0NBRXhFLElBQUksTUFBTTs7Q0FFVixJQUFJLE1BQU0sK0JBQStCLENBQUM7O0NBRTFDLElBQUk7O0NBRUosR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLEtBQUssR0FBRyxDQUFDLHdCQUF3QixLQUFLLFNBQVMsR0FBRzs7Q0FFcEQsR0FBRyxHQUFHLENBQUMsd0JBQXdCLEdBQUcsWUFBWTs7Q0FFOUMsSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUQsSUFBSSxDQUFDOztDQUVMLEdBQUc7O0NBRUgsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV2RSxFQUFFLENBQUMsUUFBUSxLQUFLLEdBQUc7O0NBRW5CLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSx1QkFBdUIsR0FBRyxLQUFLLEVBQUUsQ0FBQzs7Q0FFbkQsRUFBRTs7Q0FFRixDQUFDLElBQUksVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUU3QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztDQUN6QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztDQUN2QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQztDQUM5QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztDQUM1QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLEVBQUUsQ0FBQztDQUNuRCxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQztDQUM5QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsR0FBRzs7Q0FFbkQsRUFBRSxjQUFjLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQzs7Q0FFdkMsRUFBRTs7Q0FFRixDQUFDLElBQUksWUFBWSxHQUFHLElBQUksaUJBQWlCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFekUsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDOztDQUUvRCxDQUFDLElBQUksVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7Q0FDeEMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGFBQWEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUNuSCxDQUFDLElBQUksVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQzdDLENBQUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUN0RSxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDaEUsQ0FBQyxJQUFJLFlBQVksR0FBRyxJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDNUQsQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0NBQ3BDLENBQUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDOztDQUUxQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7O0NBRTVDLENBQUMsSUFBSSxjQUFjLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQzlFLENBQUMsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLDBCQUEwQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTVGOztDQUVBLENBQUMsSUFBSSxxQkFBcUIsRUFBRSxtQkFBbUIsQ0FBQztDQUNoRCxDQUFDLElBQUksbUJBQW1CLEVBQUUsaUJBQWlCLENBQUM7O0NBRTVDOztDQUVBLENBQUMsU0FBUyxtQkFBbUIsR0FBRzs7Q0FFaEMsRUFBRSxPQUFPLG9CQUFvQixLQUFLLElBQUksR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDOztDQUV6RCxFQUFFOztDQUVGLENBQUMsU0FBUyxpQkFBaUIsR0FBRzs7Q0FFOUIsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRWYsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7Q0FDbEYsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckYsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0NBRWhILEVBQUU7O0NBRUYsQ0FBQyxTQUFTLFlBQVksR0FBRzs7Q0FFekIsRUFBRSxlQUFlLEdBQUcsSUFBSSxDQUFDO0NBQ3pCLEVBQUUsY0FBYyxHQUFHLElBQUksQ0FBQzs7Q0FFeEIsRUFBRSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQzs7Q0FFM0IsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRWhCLEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztDQUVyQixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0NBQ3BCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7Q0FDbEMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztDQUM5QixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0NBQzlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXBCOztDQUVBLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxjQUFjLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRTVFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7OztDQUc1Qjs7Q0FFQSxDQUFDLElBQUksWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUN0RCxDQUFDLElBQUksZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFL0Q7O0NBRUEsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVk7O0NBRS9CLEVBQUUsT0FBTyxHQUFHLENBQUM7O0NBRWIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFlBQVk7O0NBRXpDLEVBQUUsT0FBTyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7Q0FFcEMsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVk7O0NBRXJDLEVBQUUsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDO0NBQ3pELEVBQUUsS0FBSyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUUzQyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWTs7Q0FFckMsRUFBRSxPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUV6QyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVk7O0NBRWpDLEVBQUUsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDOztDQUVoQyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVk7O0NBRWxDLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRXJCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxLQUFLLEdBQUc7O0NBRXpDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLE9BQU87O0NBRXBDLEVBQUUsV0FBVyxHQUFHLEtBQUssQ0FBQzs7Q0FFdEIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZOztDQUU1QixFQUFFLE9BQU87Q0FDVCxHQUFHLEtBQUssRUFBRSxNQUFNO0NBQ2hCLEdBQUcsTUFBTSxFQUFFLE9BQU87Q0FDbEIsR0FBRyxDQUFDOztDQUVKLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsR0FBRzs7Q0FFeEQsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO0NBQ2pCLEVBQUUsT0FBTyxHQUFHLE1BQU0sQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUM7Q0FDdEMsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUM7O0NBRXhDLEVBQUUsS0FBSyxXQUFXLEtBQUssS0FBSyxHQUFHOztDQUUvQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7Q0FDdEMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDOztDQUV4QyxHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFMUMsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFckQsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekQsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7Q0FFdkQsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLE9BQU8sR0FBRzs7Q0FFNUMsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLFlBQVksR0FBRyxPQUFPLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRSxDQUFDOztDQUVIOztDQUVBLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZOztDQUVsQyxFQUFFLE9BQU8sV0FBVyxDQUFDOztDQUVyQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsS0FBSyxFQUFFLEtBQUssR0FBRzs7Q0FFaEQsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUUzQixFQUFFLFdBQVcsR0FBRyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRWhELEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztDQUVoSCxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVk7O0NBRWxDLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRXJCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxLQUFLLEdBQUc7O0NBRXpDLEVBQUUsV0FBVyxHQUFHLEtBQUssQ0FBQzs7Q0FFdEIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O0NBRWhILEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sR0FBRzs7Q0FFakQsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRWYsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUM7Q0FDbkUsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUM7Q0FDbkUsRUFBRSxLQUFLLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQUM7O0NBRXpFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFcEIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZOztDQUUvQixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZOztDQUUvQixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZOztDQUVqQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sR0FBRzs7Q0FFckUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3ZDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUV0QyxFQUFFLENBQUM7O0NBRUg7O0NBRUEsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzs7Q0FFbEMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVk7O0NBRTVCLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFMUUsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRXhCLEVBQUUsQ0FBQzs7Q0FFSDs7Q0FFQSxDQUFDLFNBQVMsYUFBYSxFQUFFLEtBQUssR0FBRzs7Q0FFakMsRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDakIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUV0QixFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNyQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFbEIsRUFBRTs7Q0FFRixDQUFDLFNBQVMsaUJBQWlCLEVBQUUsS0FBSyxHQUFHOztDQUVyQyxFQUFFLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0NBRTlCLEVBQUUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUUvRCxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVqQyxFQUFFOztDQUVGOztDQUVBLENBQUMsU0FBUyxrQkFBa0IsRUFBRSxRQUFRLEdBQUc7O0NBRXpDLEVBQUUsK0JBQStCLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRTs7O0NBR0YsQ0FBQyxTQUFTLCtCQUErQixFQUFFLFFBQVEsR0FBRzs7Q0FFdEQsRUFBRSxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQzs7Q0FFdkQsRUFBRSxRQUFRLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQzs7Q0FFL0IsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUc7O0NBRW5DLEdBQUcsWUFBWSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsU0FBUyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsR0FBRzs7Q0FFN0QsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVyQyxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUU1RCxHQUFHLEVBQUUsQ0FBQzs7Q0FFTixFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFdBQVcsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUc7O0NBRXJFLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDOztDQUV6QixFQUFFLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztDQUN6RixFQUFFLEtBQUssTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7Q0FDbkYsRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0NBQ3ZFLEVBQUUsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFaEYsRUFBRSxJQUFJLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxLQUFLLE1BQU0sQ0FBQyxZQUFZLEdBQUc7O0NBRTdCLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUN4RCxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFOUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ3ZELEdBQUcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVwRixHQUFHOztDQUVILEVBQUUsS0FBSyxNQUFNLENBQUMsVUFBVSxHQUFHOztDQUUzQixHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRXRELEdBQUcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxtQkFBbUI7Q0FDdEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxzQkFBc0I7Q0FDckMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7Q0FDbkMsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLFdBQVcsR0FBRzs7Q0FFdkMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztDQUUzRCxLQUFLLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXBDLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDdkUsS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztDQUN2RSxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDOztDQUV2RSxL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QUV4QixHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDekMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDOztDQUUzRCxHQUFHOztDQUVIO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLEVBQUUsSUFBSSxVQUFVLENBQUM7O0NBRWpCLEVBQUUsS0FBSyxRQUFRLENBQUMsR0FBRyxHQUFHOztDQUV0QixHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDOztDQUU3QixHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztDQUVyQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztDQUVyQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztDQUV6QyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztDQUV6QyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHOztDQUVuQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztDQUVuQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztDQUVqQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztDQUVqQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHOztDQUV0QyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDOztDQUV0QyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHOztDQUV0QyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDOztDQUV0QyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsUUFBUSxHQUFHOztDQUVsQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDOztDQUVsQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztDQUVyQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztDQUVyQyxHQUFHOztDQUVILEVBQUUsS0FBSyxVQUFVLEtBQUssU0FBUyxHQUFHOztDQUVsQztDQUNBLEdBQUcsS0FBSyxVQUFVLENBQUMsbUJBQW1CLEdBQUc7O0NBRXpDLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7O0NBRXBDLElBQUk7O0NBRUosR0FBRyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO0NBQ2xDLEdBQUcsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7Q0FFbEMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU3RSxHQUFHOztDQUVILEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7Q0FFMUM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUVuRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7Q0FDdEQsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztDQUU1RCxFQUFFOztDQUVGLENBQUMsU0FBUyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUVwRCxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDMUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztDQUU1QyxFQUFFOztDQUVGLENBQUMsU0FBUyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUVwRCxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7Q0FDOUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7Q0FDbEUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUV4QyxFQUFFOztDQUVGLENBQUMsU0FBUyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUV0RCxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDMUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0NBQzVDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7Q0FDcEQsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDOztDQUV2QyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7O0NBRXBDLEVBQUUsS0FBSyxRQUFRLENBQUMsR0FBRyxLQUFLLElBQUksR0FBRzs7Q0FFL0IsR0FBRyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztDQUNwQyxHQUFHLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDOztDQUVwQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcs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LENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVsRDtDQUNBOztDQUVBLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxRQUFRLENBQUM7O0NBRWxELElBQUksY0FBYyxHQUFHLENBQUM7O0NBRXRCLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxZQUFZLEdBQUc7O0NBRXBDLElBQUksSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFM0MsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNqRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVqRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3pFLElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0NBQ3ZDLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztDQUVsRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7Q0FFdkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxVQUFVLEdBQUc7O0NBRTVCLEtBQUssTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0NBRTNCLEtBQUssUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0NBQ3ZDLEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0NBQzNDLEtBQUssUUFBUSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztDQUU3QyxLQUFL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QUVBLENBQUMsZ0JBQWdCLEVBQUUsWUFBWTs7Q0FFL0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Q0FDckMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNaLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDekMsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUIsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0NBQzNELEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0QsR0FBRyxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDbkQsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQzs7Q0FFdEUsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGNBQWMsRUFBRSxVQUFVLEdBQUc7O0NBRXRDLENBQUMsUUFBUSxDQUFDLElB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RTs7Q0FFcEUsQ0FBQyxXQUFXLEVBQUUsR0FBRzs7Q0FFakIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRTNCLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXRELEVBQUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFN0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRCxHQUFHLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUV6RCxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLE1BQU0sRUFBRSxRQUFRLEdBQUc7O0NBRXpDLEVBQUUsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7O0NBRTdDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFN0MsR0FBRyxLQUFLLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHOztDQUUxQyxJQUFJLE1BQU07O0NBRVYsSUFBSTs7Q0FFSixHQUFHOztDQUVI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TUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTFELEdBQUcsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFL0IsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0NBRTFCLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUV0RCxJQUFJOztDQUVKLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxZQUFZOztDQUVuQixFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWxCOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixHQUFHLEtBQUssSUFBSSxHQUFHOztDQUVmLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxRCxJQUFJOztDQUVKLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXRELEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLEdBQUcsS0FBSyxJQUFJLEdBQUc7O0NB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QUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWhFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQzs7Q0FFQSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0NBQ3RCLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkI7O0NBRUEsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7Q0FDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Q0FDNUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFckUsSUFBSTs7Q0FFSjs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWhFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQyxJQUFJLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLE1BQU0sS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxTQUFTLEVBQUUsR0FBRzs7Q0FFNUc7O0NBRUEsS0FBSyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFB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Q25DLENBQUMsSUFBSSxNQUFNLENBQUM7O0NBRVo7O0NBRUEsQ0FBQyxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHOztDQUV4Qzs7Q0FFQSxFQUFFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0NBRTdCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRS9DLEdBQUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV6QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUU5QixJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDOUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMxQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUN6QyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFekMsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXRDLElBQUksS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV0QyxLQUFLLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFD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O0NBRTNDLE1BQU0sR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV4QyxNQUFNLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLFNBQVMsR0FBRzs7Q0FFeEMsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0QsT0FBTzs7Q0FFUCxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSjs7Q0FFQSxHQUFHLE1BQU0sR0FBRyxJQUFJLEtBQUssR0FBRzs7Q0FFeEIsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3JELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVsRCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3JELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVsRCxJQUFJOztDQUVKLEdBQUcsTUFBTTs7Q0FFVDs7Q0FFQSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0MsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFB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RSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVoRixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ25ELEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkQsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxRCxHQUFHLElBQUksR0FBRyxHQUFHLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFakMsR0FBRyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ25DLEdBQUcsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztD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Q0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztDQUMxRCxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzFELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7Q0FDZixHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNwRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztDQUNwRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFD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QUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDOUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7Q0FFNUI7Q0FDQSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM5QixFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0NBQzVCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksT0FBTyxHQUFHO0NBQ2YsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDNUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Q0FDNUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDNUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Q0FDNUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDNUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDNUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Q0FDNUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDNUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDNUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDNUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Q0FDNUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDNUMsRUFBRSxDQUFDOztDQUVILENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFMUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLDRCQUE0QixDQUFDOztDQUUxQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7Q0FDbkIsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLE1BQU0sRUFBRSxNQUFNO0NBQ2hCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDOztDQUVELDBCQUEwQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzNGLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsMEJBQTBCLENBQUM7O0NBRTlFO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTs7Q0FFQSxTQUFTLFlBQVksRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRzs7Q0FFdEYsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDOztDQUU1QixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7Q0FDbkIsRUFBRSxJQUFJLEVBQUUsSUFBSTtDQUNaLEVBQUUsZUFBZSxFQUFFLGVBQWU7Q0FDbEMsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLGNBQWMsRUFBRSxjQUFjO0NBQ2hDLEVBQUUsTUFBTSxFQUFFLE1BQU07Q0FDaEIsRUFBRSxDQUFDOztDQUVILENBQUMsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNkNBQTZDLEVBQUUsQ0FBQzs7Q0FFMUYsQ0FBQyxJQUFJLGNBQWMsR0FBRyxJQUFJLGtCQUFrQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEc7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7Q0FDekMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7Q0FDdkMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7O0NBRTNDOztDQUVBLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxDQUFDO0NBQzNDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUV0QixDQUFDOztDQUVELFlBQVksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDN0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDOztDQUVsRDs7Q0FFQSxTQUFTLGtCQUFrQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEdBQUc7O0NBRXJGLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDOztDQUVsQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7Q0FDbkIsRUFBRSxJQUFJLEVBQUUsSUFBSTtDQUNaLEVBQUUsZUFBZSxFQUFFLGVBQWU7Q0FDbEMsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLGNBQWMsRUFBRSxjQUFjO0NBQ2hDLEVBQUUsTUFBTSxFQUFFLE1BQU07Q0FDaEIsRUFBRSxDQUFDOztDQUVILENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxFQUFFLENBQUM7Q0FDekMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztDQUN0QixDQUFDLGNBQWMsR0FBRyxjQUFjLElBQUksQ0FBQyxDQUFDO0NBQ3RDLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUM7O0NBRTFCLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFbEU7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7Q0FDakMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7Q0FDL0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7O0NBRW5DOztDQUVBLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM1QixDQUFDLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV4QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Q0FFVjs7Q0FFQSxDQUFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztDQUNuQixDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztDQUNkLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDOztDQUVsQjs7Q0FFQSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O0NBRXRCOztDQUVBLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUMxQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDNUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3pFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakU7O0NBRUEsQ0FBQyxTQUFTLGtCQUFrQixHQUFHOztDQUUvQixFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUzQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsR0FBRzs7Q0FFSDtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxFQUFFLGVBQWUsRUFBRSxFQUFFLE1BQU0sS0FBSyxLQUFLLEtBQUssZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVoRTtDQUNBOztDQUVBLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRWhCOztDQUVBLEVBQUUsZUFBZSxFQUFFLENBQUM7O0NBRXBCLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLGVBQWUsRUFBRSxDQUFDLEdBQUc7O0NBRS9COztDQUVBLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7O0NBRWpEOztDQUVBLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFNUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdCLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3Qjs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN4QyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN4QyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN4QyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFdEIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhEOztDQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQ3RDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQ3RDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDOztDQUV0QyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsU0FBUyxlQUFlLEdBQUc7O0NBRTVCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTVDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTVDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDM0QsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNuRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsS0FBSyxD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QyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFakM7Q0FDQTs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzdDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWpEOztDQUVBLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRS9DLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoRDs7Q0FFQSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDO0NBQ25DLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUM7O0NBRWxD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Q0FBQzs7Q0FFNUM7O0NBRUEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVuQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUVuRCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEQ7O0NBRUEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztDQUNuQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDOztDQUVsQyxHQUFHOztDQUVI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LENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLFFBQVEsU0FBUyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUc7O0NBRS9FLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsU0FBUyxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEdBQUc7O0NBRXRHLEdBQUcsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7Q0FDaEYsR0FBRyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7Q0FFaEYsR0FBRyxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7Q0FDOUMsR0FBRyxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7O0NBRTlDLEdBQUcsSUFBSSxLQUFLLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ2xELEdBQUcsSUFBSSxRQUFRLEdBQUcsTUFBTSxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDOztDQUU1RCxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHOztDQUU3Qzs7Q0FFQSxJQUFJLElBQUksUUFBUSxDQUFDO0NBQ2pCLElBQUksS0FBSyxLQUFLLEdBQUcsQ0FBQyxHQUFHOztDQUVyQixLQUFLLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxRQUFRLFFBQVEsR0FBRyxLQUFLLEVBQUUsS0FB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LFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0NBQ3BELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztDQUVwRCxNQUFNOztDQUVOLEtBQUssTUFBTTs7Q0FFWDtDQUNBLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUc7O0NBRXRDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0NBQ3BELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztDQUVwRCxNQUFNLE1BQU07O0NBRVosTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7Q0FDcEQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7O0NBRXBELE1BQU07Q0FDTixLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHOztDQUV0QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztDQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7Q0FFcEQsTUFBTSxNQUFNOztDQUVaLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0NBQ3BELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztDQUVwRCxNQUFNOztDQUVOLEtBQUs7Q0FDTCxJQUFJLEtBQUssVUFBVSxJQUFJLFVBQVUsR0FBRzs7Q0FFcEMsS0FB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LElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOzs7Q0FHNUI7OztDQUdBLENBQUMsU0FBUyxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRTlDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxFQUFFLElBQUksU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDOztDQUUxQztDQUNBOztDQUVBLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztDQUNsQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7Q0FDaEMsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0NBQ2xDLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsRUFBRSxJQUFJLFlBQVksS0FBSyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLEVBQUUsQ0FBQzs7Q0FFbkU7Q0FDQSxFQUFFLElBQUksVUFBVSxLQUFLLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUVqRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHOztDQUVqRDs7Q0FFQTs7Q0FFQSxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDOUMsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUUzRTs7Q0FFQSxHQUFHLElBQUksYUFBYSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLFVBQVUsRUFBRSxD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LEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUUzQjs7Q0FFQSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDbEMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEM7O0NBRUEsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFdEM7O0NBRUEsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDcEQsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDcEQsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0NBRXBELEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDOztDQUVELG1CQUFtQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMxRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDOztDQUVoRTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTs7Q0FFQSxTQUFTLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxHQUFHOztDQUVoRCxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7O0NBRTdCLENBQUMsS0FBSyxPQUFPLGFBQWEsS0FBSyxRQUFRLEdBQUc7O0NBRTFDLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDOztDQUU3RSxFQUFFLGFBQWEsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDOztDQUU5QyxFQUFFOztDQUVGLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztDQUNuQixFQUFFLE1BQU0sRUFBRSxNQUFNO0NBQ2hCLEVBQUUsYUFBYSxFQUFFLGFBQWE7Q0FDOUIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksbUJBQW1CLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUM7Q0FDN0UsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRXRCLENBQUM7O0NBRUQsYUFBYSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM5RCxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7O0NBRXBEOztDQUVBLFNBQVMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRzs7Q0FFdEQsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7O0NBRW5DLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztDQUNuQixFQUFFLE1BQU0sRUFBRSxNQUFNO0NBQ2hCLEVBQUUsYUFBYSxFQUFFLGFBQWE7Q0FDOUIsRUFBRSxDQUFDOztDQUVILENBQUMsYUFBYSxHQUFHLGFBQWEsSUFBSSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0NBQ2xCLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0NBQ25CLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0NBQ2xCLENBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUVkOztDQUVBLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDOztDQUVwQjs7Q0FFQSxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRTFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUVyQixFQUFFLE1BQU07O0NBRVIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFN0MsR0FBRyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTNCLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5QyxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUM7Q0FDNUIsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDOztDQUVsQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM1RSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksc0JBQXNCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDekUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzs7Q0FHakU7O0NBRUEsQ0FBQyxTQUFTLFFBQVEsRUFBRSxLQUFLLEdBQUc7O0NBRTVCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQzs7Q0FFdEIsRUFBRSxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztDQUN4QyxFQUFFLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7O0NBRXBELEVBQUUsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztDQUNuQyxFQUFFLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7O0NBRWhDOztDQUVBLEVBQUUsS0FBSyxVQUFVLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxLQUFLLEtBQUssR0FBRzs7Q0FFM0QsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUUzQzs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxJQUFJLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLElBQUksS0FBSyxVQUFVLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLElBQUksR0FBRzs7Q0FFeEQsS0FBSyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUUzQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRXZFOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBELEdBQUcsU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVyRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEdBQUcsSUFBSSxNQUFNLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVuQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUvQyxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDO0NBQ25DLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQztDQUNuQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUM7O0NBRW5DLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUM7O0NBRUQsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzFFLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7O0NBRWhFO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsYUFBYSxFQUFFLFFBQVEsRUFBRSxjQUFjLEdBQUc7O0NBRW5ELENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO0NBQ25CLEVBQUUsY0FBYyxFQUFFLGNBQWM7Q0FDaEMsRUFBRSxDQUFDOztDQUVILENBQUMsY0FBYyxHQUFHLEVBQUUsY0FBYyxLQUFLLFNBQVMsS0FBSyxjQUFjLEdBQUcsQ0FBQyxDQUFDOztDQUV4RTs7Q0FFQSxDQUFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbkI7O0NBRUEsQ0FBQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxFQUFFLENBQUM7Q0FDL0QsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7Q0FDL0MsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVuQzs7Q0FFQSxDQUFDLElBQUksU0FBUyxDQUFDOztDQUVmLENBQUMsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0NBRWxDLEVBQUUsU0FBUyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7Q0FDN0IsRUFBRSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTNDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7Q0FDM0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0NBQ3pDLENBQUMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQzs7Q0FFN0I7O0NBRUEsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRCxFQUFFLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqQyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUN4QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXJDLEdBQUcsS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUVyQyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFeEYsSUFBSSxNQUFNOztDQUVWLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRTNCLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHOztDQUV0QixFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkI7O0NBRUEsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLFlBQVksR0FBRzs7Q0FFekcsR0FBRyxJQUFJLE1BQU0sR0FBRyxjQUFjLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzNDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FB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TSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0NBRWhFLEtBQUssTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFeEMsTUFBTSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRXJDLE1BQU0sTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXhELE9BQU8sTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3BGLE9BQU8sTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0NBQzVDLE9BQU8sTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0NBQzFDLE9BQU8sTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDOztDQUU1QyxPQUFPOztDQUVQLE1BQU07O0NBRU4sS0FBSyxNQUFNOztDQUVYLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztDQUMxQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Q0FDNUMsS0FBSyxPQUFPLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7O0NBRXhDLEtBQUs7O0NBRUwsSUFBSSxLQUFLLFFBQVEsQ0FBQyxXQUFXLEtBQUssQ0FBQyxHQUFHOztDQUV0QyxLQUFLLE9BQU8sQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDOztDQUV0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QUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQzFFLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQ2pFLEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0NBQ2pFLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUxRSxFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFN0UsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsR0FBRzs7Q0FFN0QsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXpDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDMUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRXJCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FB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QUFDLFFBQVEsR0FBRyxFQUFFLFFBQVEsS0FBSyxTQUFTLEtBQUssUUFBUSxHQUFHLENBQUMsQ0FBQztDQUMzRCxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxLQUFLLEtBQUssU0FBUyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRWxELENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDOztDQUVyQyxDQUFDOztDQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFdkUsQ0FBQyxXQUFXLEVBQUUsU0FBUzs7Q0FFdkIsQ0FBQyxXQUFXLEVBQUUsSUFBSTs7Q0FFbEIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRTNCLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFNUMsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7Q0FDbEMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDNUIsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7Q0FDbEMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7O0NBRTVCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUV0QyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7O0NBR0EsU0FBUyxVQUFVLEVBQUUsS0FBSyxF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R0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Q0FDeEQsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUNwRSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3ZFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDM0QsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUNwRSxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0NBQ2hGLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUMxRSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0NBQzdFLEVBQUUsS0FBSyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Q0FDN0UsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMs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U0FBUyxDQUFDLENBQUMsQ0FBQztDQUM1QyxJQUFJLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7Q0FFNUMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRzs7Q0FFL0M7Q0FDQSxLQUFLLEtBQUssTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFdkIsTUFBTSxTQUFTLElBQUksU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDO0NBQ3JELE1BQU0sVUFBVSxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sQ0FBQzs7Q0FFckQsTUFBTTtDQUNOLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxTQUFTOztDQUU3RSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxHQUFHOztDQUVuQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDO0NBQ2pEOztDQUVBLE1BQU0sTUFBTTs7Q0FFWixNQUFNLElBQUksUUFBUSxHQUFHLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDM0YsTUFBTSxLQUFLLFFBQVEsS0FBSyxDQUFDLE1BQU0sT0FBTyxJQUFJLENBQUM7Q0FDM0MsTUFBTSxLQUFLLFFBQVEsR0FBRyxDQUFDLE9BQU8sU0FBUztDQUN2QyxNQUFNLE1BQU0sR0FBRyxFQUFFLE1BQU0sQ0FBQzs7Q0FFeEIsTUFB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LE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUM5RSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUM5RSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUM5RSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNoRixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNoRixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNoRixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNsRSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUNsRSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFbEUsSUFBSSxNQUFNOztDQUVWLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQy9ELElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU3RixJQUFJOztDQUVKLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLElBQUk7O0NBRU4sQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxLQUFLLEVBQUUsUUFBUSxHQUFHOztDQUUzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7O0NBRXJCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztDQUVqQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztDQUN2QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDOztDQUUxQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0NBQ3BCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Q0FDbkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Q0FDeEIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQ2hDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7O0NBRTNCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7O0NBRW5CLENBQUM7O0NBRUQsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUV0RSxDQUFDLFdBQVcsRUFBRSxLQUFLOztDQUVuQixDQUFDLFNBQVMsRUFBRSxZQUFZOztDQUV4QixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQzs7Q0FFbkIsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLFNBQVMsR0FBRzs7Q0FFdkMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0NBQ2xDLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztDQUMxQixFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFakIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsV0FBVyxHQUFHOztDQUVyQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO0NBQzVCLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7O0NBRTdCLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFlBQVk7O0NBRW5CLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksR0FBRzs7Q0FFakMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHdDQUF3QyxFQUFFLENBQUM7Q0FDNUQsR0FBRyxPQUFPOztDQUVWLEdBQUc7O0NBRUgsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEdBQUc7O0NBRTNDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxrREFBa0QsRUFBRSxDQUFDO0NBQ3RFLEdBQUcsT0FBTzs7Q0FFVixHQUFHOztDQUVILEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUVqRCxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUM5QixFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztDQUMxQixFQUFFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDN0MsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMxRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFcEMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs7Q0FFeEIsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixLQUFLLEtBQUssR0FBRzs7Q0FFM0MsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGtEQUFrRCxFQUFFLENBQUM7Q0FDdEUsR0FBRyxPQUFPOztDQUVWLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0NBQ3JCLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztDQUV6QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7Q0FFbkIsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEdBQUc7O0NBRTNDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxrREFBa0QsRUFBRSxDQUFDO0NBQ3RFLEdBQUcsT0FBTzs7Q0FFVixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztDQUNyQixFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ3JCLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxZQUFZOztDQUV0QixFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUVqQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFNUMsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFM0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV2RCxJQUFJOztDQUVKLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7O0NBRXZFLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDOztDQUUzQyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFVBQVUsRUFBRSxZQUFZOztDQUV6QixFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUVqQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFM0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxRCxJQUFJOztDQUVKLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7O0NBRTFFLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDOztDQUU5QyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFVBQVUsRUFBRSxZQUFZOztDQUV6QixFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQzs7Q0FFdEIsRUFBRTs7Q0FFRixDQUFDLFVBQVUsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFaEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7O0NBRTVCLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksR0FBRzs7Q0FFakMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Q0FDckIsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztDQUN4QixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFbEIsR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7O0NBRXhCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVyQyxFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixLQUFLLEtBQUssR0FBRzs7Q0FFM0MsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGtEQUFrRCxFQUFFLENBQUM7Q0FDdEUsR0FBRyxPQUFPOztDQUVWLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQzs7Q0FFNUIsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxHQUFHOztDQUVqQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRTFGLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFlBQVk7O0NBRTlCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDOztDQUUzQixFQUFFOztDQUVGLENBQUMsT0FBTyxFQUFFLFlBQVk7O0NBRXRCLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7O0NBRXpCLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEIsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEdBQUc7O0NBRTNDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxrREFBa0QsRUFBRSxDQUFDO0NBQ3RFLEdBQUcsT0FBTyxLQUFLLENBQUM7O0NBRWhCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7O0NBRW5CLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTdCLEVBQUUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxHQUFHOztDQUUzQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsa0RBQWtELEVBQUUsQ0FBQztDQUN0RSxHQUFHLE9BQU87O0NBRVYsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVwQixFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEdBQUc7O0NBRWpDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzs7Q0FFaEMsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsWUFBWTs7Q0FFeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFOUIsRUFBRTtDQUNGO0NBQ0EsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxRQUFRLEdBQUc7O0NBRXJDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTlCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0NBQzNDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUVsQyxDQUFDOztDQUVELGVBQWUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFN0UsQ0FBQyxXQUFXLEVBQUUsZUFBZTs7Q0FFN0IsQ0FBQyxTQUFTLEVBQUUsWUFBWTs7Q0FFeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRXJCLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsWUFBWTs7Q0FFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDOztDQUVqQyxFQUFFOztDQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVwQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7Q0FFbEMsRUFBRTs7Q0FFRixDQUFDLGdCQUFnQixFQUFFLFlBQVk7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Q0FFbkMsRUFBRTs7Q0FFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUV0QyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEMsRUFBRTs7Q0FFRixDQUFDLGdCQUFnQixFQUFFLFlBQVk7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQzs7Q0FFbkMsRUFBRTs7Q0FFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUV0QyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEMsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxZQUFZOztDQUU3QixFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRWpDLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRXBDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztDQUVsQyxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxZQUFZOztDQUVsQyxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxTQUFTLGlCQUFpQixFQUFFLEtBQUssR0FBRzs7Q0FFN0MsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTVELEdBQUcsUUFBUSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFdEQsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRSxHQUFHLENBQUM7O0NBRUosRUFBRSxJQUFJOzs7Q0FHTixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sR0FBRzs7Q0FFekMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDaEQsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLEtBQUssU0FBUyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUM7O0NBRWhFLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRS9ELENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRTVDLENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFOztDQUV4QyxDQUFDLGdCQUFnQixFQUFFLFlBQVk7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRWxELEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDOztDQUVuQixFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsWUFBWTs7Q0FFbEMsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztDQUVoRCxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUzQyxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXRCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUU3QixFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGFBQWEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsR0FBRzs7Q0FFdkQsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUN4QixDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOztDQUU1QixDQUFDLElBQUksVUFBVSxHQUFHLFlBQVk7Q0FDOUIsRUFBRSxXQUFXLENBQUM7O0NBRWQsQ0FBQyxTQUFTLFFBQVE7O0NBRWxCLEVBQUUsS0FBSyxZQUFZO0NBQ25CLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Q0FDN0IsR0FBRyxNQUFNOztDQUVULEVBQUUsS0FBSyxRQUFRLENBQUM7Q0FDaEIsRUFBRSxLQUFLLE1BQU07Q0FDYixHQUFHLFVBQVUsR0FBRyxLQUFLLENBQUM7Q0FDdEIsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUM5QixHQUFHLE1BQU07O0NBRVQsRUFBRTtDQUNGLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7O0NBRTVCLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUMvQztDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7O0NBRXJDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzs7Q0FFM0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztDQUNuQixDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDOztDQUV6QixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRTs7Q0FFeEM7Q0FDQSxDQUFDLFVBQVUsRUFBRSxXQUFXLFNBQVMsRUFBRSxNQUFNLEdBQUc7O0NBRTVDO0NBQ0E7O0NBRUEsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtDQUMxQixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztDQUMxQixHQUFHLE1BQU0sR0FBRyxTQUFTLEdBQUcsTUFBTSxHQUFHLE1BQU07O0NBRXZDLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFekMsRUFBRSxLQUFLLGFBQWEsS0FBSyxDQUFDLEdBQUc7O0NBRTdCOztDQUVBLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFekMsSUFBSSxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSTs7Q0FFSixHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUM7O0NBRTFCLEdBQUcsTUFBTTs7Q0FFVDs7Q0FFQSxHQUFHLGFBQWEsSUFBSSxNQUFNLENBQUM7Q0FDM0IsR0FBRyxJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUcsYUFBYSxDQUFDO0NBQ3BDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0QsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7O0NBRXhDLEVBQUU7O0NBRUY7Q0FDQSxDQUFDLEtBQUssRUFBRSxXQUFXLFNBQVMsR0FBRzs7Q0FFL0IsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztDQUM3QixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtDQUN2QixHQUFHLE1BQU0sR0FBRyxTQUFTLEdBQUcsTUFBTSxHQUFHLE1BQU07O0NBRXZDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7O0NBRWpDLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7O0NBRTFCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzs7Q0FFNUIsRUFBRSxLQUFLLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0NBRXBCOztDQUVBLEdBQUcsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV4QyxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7Q0FDeEIsSUFBSSxNQUFNLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTlELEdBQUc7O0NBRUgsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUU3RCxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUc7O0NBRS9DOztDQUVBLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsSUFBSSxNQUFNOztDQUVWLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZOztDQUVoQyxFQUFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7O0NBRTdCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07Q0FDMUIsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVM7O0NBRTFCLEdBQUcsbUJBQW1CLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEMsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztDQUVsRDtDQUNBLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWpFLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxtQkFBbUIsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEUsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7O0NBRTVCLEVBQUU7O0NBRUY7Q0FDQSxDQUFDLG9CQUFvQixFQUFFLFlBQVk7O0NBRW5DLEVBQUUsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztDQUMvQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQzs7Q0FFNUQsRUFBRTs7O0NBR0Y7O0NBRUEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHOztDQUUvRCxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRzs7Q0FFbEIsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV6QyxJQUFJLE1BQU0sRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEQsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUc7O0NBRXRELEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckYsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUc7O0NBRTdELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV4QyxHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRS9ELEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxrQkFBa0IsR0FBRzs7Q0FFNUQsQ0FBQyxJQUFJLFVBQVUsR0FBRyxrQkFBa0IsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUvRSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0NBQ2pDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFN0QsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUU7O0NBRXBDLENBQUMsUUFBUSxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRWQsRUFBRSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWU7Q0FDekQsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsQ0FBQzs7Q0FFL0M7Q0FDQSxFQUFFLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFakUsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXRDLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Q0FFaEMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTtDQUNqRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRTNDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxZQUFZOztDQUVuQixFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRWhDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWU7Q0FDakQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUUzQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Q0FFaEMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZTtDQUNqRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRTNDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7OztDQUdKLFNBQVMsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxHQUFHOztDQUV2RCxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ2xCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksUUFBUSxDQUFDOztDQUV4RixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOztDQUUxQixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFOztDQUVoQyxDQUFDLFNBQVMsRUFBRSxTQUFTOztDQUVyQixDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxHQUFHOztDQUU3QyxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUc7O0NBRW5ELEdBQUcsT0FBTyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUV4RCxHQUFHLE1BQU07O0NBRVQsR0FBRyxPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVsRSxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsWUFBWTs7Q0FFN0I7Q0FDQTtDQUNBLEVBQUUsSUFBSSxXQUFXLEdBQUcsb0JBQW9CLENBQUM7O0NBRXpDO0NBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUM7O0NBRTdCO0NBQ0E7Q0FDQSxFQUFFLElBQUksUUFBUSxHQUFHLDhCQUE4QixDQUFDOztDQUVoRDtDQUNBO0NBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQzs7Q0FFN0MsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFO0NBQzdCLEtBQUssR0FBRztDQUNSLEtBQUssV0FBVyxDQUFDLE1BQU07Q0FDdkIsS0FBSyxNQUFNLENBQUMsTUFBTTtDQUNsQixLQUFLLFFBQVEsQ0FBQyxNQUFNO0NBQ3BCLEtBQUssVUFBVSxDQUFDLE1BQU07Q0FDdEIsS0FBSyxHQUFHO0NBQ1IsR0FBRyxDQUFDOztDQUVKLEVBQUUsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRWxFLEVBQUUsT0FBTyxXQUFXLFNBQVMsR0FBRzs7Q0FFaEMsSUFBSSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUU1QyxJQUFJLEtBQUssRUFBRSxPQUFPLEdBQUc7O0NBRXJCLEtBQUssTUFBTSxJQUFJLEtBQUssRUFBRSwyQ0FBMkMsR0FBRyxTQUFTLEVBQUUsQ0FBQzs7Q0FFaEYsS0FBSzs7Q0FFTCxJQUFJLElBQUksT0FBTyxHQUFHO0NBQ2xCO0NBQ0EsS0FBSyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtDQUMzQixLQUFLLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0NBQzdCLEtBQUssV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7Q0FDOUIsS0FBSyxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtDQUMvQixLQUFLLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0NBQ2hDLEtBQUssQ0FBQzs7Q0FFTixJQUFJLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTFFLElBQUksS0FBSyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxDQUFDLENBQUMsR0FBRzs7Q0FFbkQsS0FBSyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRWhFO0NBQ0E7Q0FDQTtDQUNBO0NBQ0EsS0FBSyxLQUFLLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRzs7Q0FFOUQsTUFBTSxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUNsRSxNQUFNLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDOztDQUV0QyxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSSxLQUFLLE9BQU8sQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7Q0FFOUUsS0FBSyxNQUFNLElBQUksS0FBSyxFQUFFLDhEQUE4RCxHQUFHLFNBQVMsRUFBRSxDQUFDOztDQUVuRyxLQUFLOztDQUVMLElBQUksT0FBTyxPQUFPLENBQUM7O0NBRW5CLElBQUksQ0FBQzs7Q0FFTCxFQUFFLEVBQUU7O0NBRUosQ0FBQyxRQUFRLEVBQUUsV0FBVyxJQUFJLEVBQUUsUUFBUSxHQUFHOztDQUV2QyxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxRQUFRLEtBQUssTUFBTSxJQUFJLFFBQVEsS0FBSyxHQUFHLElBQUksUUFBUSxLQUFLLEVBQUUsQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHOztDQUUxSixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUg7Q0FDQSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsR0FBRzs7Q0FFdkIsR0FBRyxJQUFJLGNBQWMsR0FBRyxXQUFXLFFBQVEsR0FBRzs7Q0FFOUMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEtBQUssSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxHQUFHOztDQUVuQyxNQUFNLE9BQU8sSUFBSSxDQUFDOztDQUVsQixNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSSxPQUFPLElBQUksQ0FBQzs7Q0FFaEIsSUFBSSxDQUFDOztDQUVMLEdBQUcsSUFBSSxJQUFJLEdBQUcsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxLQUFLLElBQUksR0FBRzs7Q0FFZixJQUFJLE9BQU8sSUFBSSxDQUFDOztDQUVoQixJQUFJOztDQUVKLEdBQUc7O0NBRUg7Q0FDQSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsR0FBRzs7Q0FFdkIsR0FBRyxJQUFJLGlCQUFpQixHQUFHLFdBQVcsUUFBUSxHQUFHOztDQUVqRCxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqRCxLQUFLLElBQUksU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUSxHQUFHOztDQUV2RSxNQUFNLE9BQU8sU0FBUyxDQUFDOztDQUV2QixNQUFNOztDQUVOLEtBQUssSUFBSSxNQUFNLEdBQUcsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUUxRCxLQUFLLEtBQUssTUFBTSxHQUFHLE9BQU8sTUFBTSxDQUFDOztDQUVqQyxLQUFLOztDQUVMLElBQUksT0FBTyxJQUFJLENBQUM7O0NBRWhCLElBQUksQ0FBQzs7Q0FFTCxHQUFHLElBQUksV0FBVyxHQUFHLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Q0FFeEQsR0FBRyxLQUFLLFdBQVcsR0FBRzs7Q0FFdEIsSUFBSSxPQUFPLFdBQVcsQ0FBQzs7Q0FFdkIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUU7O0NBRTFDO0NBQ0EsQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLEVBQUU7Q0FDdEMsQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLEVBQUU7O0NBRXRDLENBQUMsV0FBVyxFQUFFO0NBQ2QsRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNYLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDaEIsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNqQixFQUFFLGNBQWMsRUFBRSxDQUFDO0NBQ25CLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUU7Q0FDYixFQUFFLElBQUksRUFBRSxDQUFDO0NBQ1QsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUNoQixFQUFFLHNCQUFzQixFQUFFLENBQUM7Q0FDM0IsRUFBRTs7Q0FFRixDQUFDLG1CQUFtQixFQUFFOztDQUV0QixFQUFFLFNBQVMsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRTdDLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVyRCxHQUFHOztDQUVILEVBQUUsU0FBUyxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFNUMsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7O0NBRXRDLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFdkQsSUFBSSxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXRDLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFNBQVMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFbkQsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFbEUsR0FBRzs7Q0FFSCxFQUFFLFNBQVMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFOUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFbkQsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsZ0NBQWdDLEVBQUU7O0NBRW5DLEVBQUU7Q0FDRjs7Q0FFQSxHQUFHLFNBQVMsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRTlDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV0RCxJQUFJOztDQUVKLEdBQUcsU0FBUyw4QkFBOEIsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUU3RCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUN0RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekMsSUFBSTs7Q0FFSixHQUFHLFNBQVMseUNBQXlDLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFeEUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzs7Q0FFcEQsSUFBSTs7Q0FFSixHQUFHLEVBQUU7O0NBRUw7O0NBRUEsR0FBRyxTQUFTLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUU3QyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFckMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV0RCxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsU0FBUyw2QkFBNkIsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUU1RCxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFckMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV0RCxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckMsS0FBSzs7Q0FFTCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekMsSUFBSTs7Q0FFSixHQUFHLFNBQVMsd0NBQXdDLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7Q0FFdkUsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7O0NBRXJDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFdEQsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRXJDLEtBQUs7O0NBRUwsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzs7Q0FFcEQsSUFBSTs7Q0FFSixHQUFHLEVBQUU7O0NBRUw7O0NBRUEsR0FBRyxTQUFTLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRXBELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRW5FLElBQUk7O0NBRUosR0FBRyxTQUFTLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRW5FLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDbkUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRXpDLElBQUk7O0NBRUosR0FBRyxTQUFTLCtDQUErQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRTlFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDbkUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzs7Q0FFcEQsSUFBSTs7Q0FFSixHQUFHLEVBQUU7O0NBRUw7O0NBRUEsR0FBRyxTQUFTLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWpELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXRELElBQUk7O0NBRUosR0FBRyxTQUFTLGlDQUFpQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWhFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRXpDLElBQUk7O0NBRUosR0FBRyxTQUFTLDRDQUE0QyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRTNFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzs7Q0FFcEQsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUUsU0FBUyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxHQUFHOztDQUU1RCxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztDQUNkLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXZDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxTQUFTLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUc7O0NBRTVELEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0NBQ2QsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFdkMsRUFBRTs7Q0FFRjtDQUNBLENBQUMsSUFBSSxFQUFFLFlBQVk7O0NBRW5CLEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUk7Q0FDOUIsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVU7O0NBRS9CLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVO0NBQ3JDLEdBQUcsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZO0NBQ3pDLEdBQUcsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7O0NBRTVDLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRzs7Q0FFeEIsR0FBRyxZQUFZLEdBQUcsZUFBZSxDQUFDLFFBQVE7Q0FDMUMsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzRCxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDOztDQUU1QixHQUFHOztDQUVIO0NBQ0EsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztDQUM3QyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDOztDQUU3QztDQUNBLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRzs7Q0FFeEIsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLHFDQUFxQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztDQUNoRyxHQUFHLE9BQU87O0NBRVYsR0FBRzs7Q0FFSCxFQUFFLEtBQUssVUFBVSxHQUFHOztDQUVwQixHQUFHLElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7O0NBRTVDO0NBQ0EsR0FBRyxTQUFTLFVBQVU7O0NBRXRCLElBQUksS0FBSyxXQUFXOztDQUVwQixLQUFLLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxHQUFHOztDQUVwQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNkRBQTZELEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDM0YsTUFBTSxPQUFPOztDQUViLE1BQU07O0NBRU4sS0FBSyxLQUFLLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUc7O0NBRTlDLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSx1RkFBdUYsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUNySCxNQUFNLE9BQU87O0NBRWIsTUFBTTs7Q0FFTixLQUFLLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQzs7Q0FFcEQsS0FBSyxNQUFNOztDQUVYLElBQUksS0FBSyxPQUFPOztDQUVoQixLQUFLLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxHQUFHOztDQUVwQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsMERBQTBELEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDeEYsTUFBTSxPQUFPOztDQUViLE1BQU07O0NBRU47Q0FDQTs7Q0FFQSxLQUFLLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFaEQ7Q0FDQSxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxNQUFNLEtBQUssWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxXQUFXLEdBQUc7O0NBRXBELE9BQU8sV0FBVyxHQUFHLENBQUMsQ0FBQztDQUN2QixPQUFPLE1BQU07O0NBRWIsT0FBTzs7Q0FFUCxNQUFNOztDQUVOLEtBQUssTUFBTTs7Q0FFWCxJQUFJOztDQUVKLEtBQUssS0FBSyxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUVyRCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsaURBQWlELEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDL0UsTUFBTSxPQUFPOztDQUViLE1BQU07O0NBRU4sS0FBSyxZQUFZLEdBQUcsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUUvQyxJQUFJOzs7Q0FHSixHQUFHLEtBQUssV0FBVyxLQUFLLFNBQVMsR0FBRzs7Q0FFcEMsSUFBSSxLQUFLLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRXJELEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSxrRUFBa0UsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDN0csS0FBSyxPQUFPOztDQUVaLEtBQUs7O0NBRUwsSUFBSSxZQUFZLEdBQUcsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUUvQyxJQUFJOztDQUVKLEdBQUc7O0NBRUg7Q0FDQSxFQUFFLElBQUksWUFBWSxHQUFHLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxLQUFLLFlBQVksS0FBSyxTQUFTLEdBQUc7O0NBRXBDLEdBQUcsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQzs7Q0FFdEMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLHlDQUF5QyxHQUFHLFFBQVE7Q0FDdEUsSUFBSSxHQUFHLEdBQUcsWUFBWSxHQUFHLHVCQUF1QixFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ2pFLEdBQUcsT0FBTzs7Q0FFVixHQUFHOztDQUVIO0NBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQzs7Q0FFeEMsRUFBRSxLQUFLLFlBQVksQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHOztDQUVoRCxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztDQUM1QyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDOztDQUVwQyxHQUFHLE1BQU0sS0FBSyxZQUFZLENBQUMsc0JBQXNCLEtBQUssU0FBUyxHQUFHOztDQUVsRSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDO0NBQ3ZELEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7O0NBRXBDLEdBQUc7O0NBRUg7Q0FDQSxFQUFFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDOztDQUU1QyxFQUFFLEtBQUssYUFBYSxLQUFLLFNBQVMsR0FBRzs7Q0FFckM7O0NBRUEsR0FBRyxLQUFLLFlBQVksS0FBSyx1QkFBdUIsR0FBRzs7Q0FFbkQ7O0NBRUE7Q0FDQSxJQUFJLEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxHQUFHOztDQUVuQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0ZBQWdGLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDN0csS0FBSyxPQUFPOztDQUVaLEtBQUs7O0NBRUwsSUFBSSxLQUFLLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUc7O0NBRWhELEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRSw2RkFBNkYsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUMxSCxLQUFLLE9BQU87O0NBRVosS0FBSzs7Q0FFTCxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RSxLQUFLLEtBQUssWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLGFBQWEsR0FBRzs7Q0FFM0UsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0NBQ3hCLE1BQU0sTUFBTTs7Q0FFWixNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQzs7Q0FFL0MsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0NBQ3hDLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7O0NBRXRDLEdBQUcsTUFBTSxLQUFLLFlBQVksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUUzRjs7Q0FFQSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQzs7Q0FFakQsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDOztDQUV4QyxHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxHQUFHOztDQUU5QyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7Q0FFOUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDOztDQUV4QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzs7Q0FFcEMsR0FBRzs7Q0FFSDtDQUNBLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDMUQsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxXQUFXLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFckYsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxZQUFZOztDQUVyQixFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOztDQUVuQjtDQUNBO0NBQ0EsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztDQUN6QyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDOztDQUV6QyxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0EsTUFBTSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFOztDQUUxQztDQUNBLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRO0NBQ3RELENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFROztDQUV0RCxDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxvQkFBb0IsRUFBRSxRQUFRLEdBQUc7O0NBRTFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7O0NBRWxDO0NBQ0EsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFekQsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztDQUMxQjs7Q0FFQSxDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDOztDQUUvQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXhELEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXJDLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0NBQ3hCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Q0FDckIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDOztDQUVsQyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7Q0FFbEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHOztDQUVkLEVBQUUsT0FBTyxFQUFFO0NBQ1gsR0FBRyxJQUFJLEtBQUssR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtDQUNoRCxHQUFHLElBQUksS0FBSyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtDQUM3RCxHQUFHOztDQUVILEVBQUUsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTs7Q0FFNUQsRUFBRSxDQUFDOztDQUVILENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUU7O0NBRS9DLENBQUMsc0JBQXNCLEVBQUUsSUFBSTs7Q0FFN0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxRQUFRLEdBQUc7O0NBRTNCLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU07Q0FDNUIsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWU7Q0FDeEMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWM7Q0FDdEMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU07Q0FDdEIsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVk7Q0FDbEMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVM7Q0FDNUIsR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7Q0FFL0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV6RCxHQUFHLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUU7Q0FDOUIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUk7Q0FDdEIsSUFBSSxLQUFLLEdBQUcsYUFBYSxFQUFFLElBQUksRUFBRTtDQUNqQyxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUM7O0NBRTVCLEdBQUcsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUU5Qjs7Q0FFQSxJQUFJLEtBQUssR0FBRyxRQUFRLEdBQUcsQ0FBQztDQUN4QixJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7Q0FDbEMsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUzQjs7Q0FFQSxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFcEQsS0FBSyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSTtDQUN2QixPQUFPLElBQUksZUFBZTtDQUMxQixRQUFRLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsS0FBSzs7Q0FFTCxJQUFJLE1BQU0sS0FBSyxLQUFLLEdBQUcsY0FBYyxHQUFHOztDQUV4QyxJQUFJLFdBQVcsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRW5DOztDQUVBLElBQUksSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLGNBQWM7Q0FDNUMsS0FBSyxnQkFBZ0IsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFcEQsSUFBSSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO0NBQ25ELElBQUksT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLGdCQUFnQixDQUFDOztDQUV4QyxJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztDQUM3QyxJQUFJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sQ0FBQzs7Q0FFekM7O0NBRUEsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXBELEtBQUssSUFBSSxlQUFlLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRTtDQUN4QyxNQUFNLFVBQVUsR0FBRyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUU7Q0FDdEQsTUFBTSxPQUFPLEdBQUcsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxLQUFLLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUM7O0NBRTNDLEtBQUssS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUVsQztDQUNBO0NBQ0E7O0NBRUEsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlO0NBQ25DLFFBQVEsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0MsTUFBTTs7Q0FFTixLQUFLLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sQ0FBQzs7Q0FFbkQsS0FBSzs7Q0FFTCxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssV0FBVyxHQUFHOztDQUVsRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsdUNBQXVDO0NBQzFELE1BQU0sOENBQThDO0NBQ3BELE1BQU0seUNBQXlDLEVBQUUsQ0FBQzs7Q0FFbEQsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7O0NBRXhDLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsVUFBVSxRQUFRLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWU7Q0FDeEMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWM7Q0FDdEMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVM7Q0FDNUIsR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7Q0FFL0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV6RCxHQUFHLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUU7Q0FDOUIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUk7Q0FDdEIsSUFBSSxLQUFLLEdBQUcsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVsQyxHQUFHLEtBQUssS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLElBQUksY0FBYyxHQUFHOztDQUV6RDs7Q0FFQSxJQUFJLElBQUksZUFBZSxHQUFHLGNBQWMsR0FBRztDQUMzQyxLQUFLLGlCQUFpQixHQUFHLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQzs7Q0FFcEQsSUFBSSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO0NBQ3BELElBQUksT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLGlCQUFpQixDQUFDOztDQUV6QyxJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUM7Q0FDNUMsSUFBSSxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUV4Qzs7Q0FFQSxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFcEQsS0FBSyxJQUFJLGVBQWUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFO0NBQ3hDLE1BQU0sV0FBVyxHQUFHLGVBQWUsRUFBRSxlQUFlLEVBQUU7Q0FDdEQsTUFBTSxPQUFPLEdBQUcsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxLQUFLLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxXQUFXLENBQUM7Q0FDNUMsS0FBSyxlQUFlLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDOztDQUVsRCxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDOztDQUV4QyxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxPQUFPLEVBQUUsVUFBVSxRQUFRLEdBQUc7O0NBRS9CLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU07Q0FDNUIsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWU7Q0FDeEMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWM7Q0FDdEMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVM7Q0FDNUIsR0FBRyxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7Q0FFL0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV6RCxHQUFHLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUU7Q0FDOUIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUk7Q0FDdEIsSUFBSSxLQUFLLEdBQUcsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVsQyxHQUFHLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFOUIsSUFBSSxPQUFPLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakMsSUFBSSxLQUFLLEtBQUssR0FBRyxjQUFjLEdBQUc7O0NBRWxDOztDQUVBLEtBQUssSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLGNBQWM7Q0FDN0MsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7Q0FDcEQsTUFBTSxTQUFTLEdBQUcsR0FBRyxRQUFRO0NBQzdCLE1BQU0sVUFBVSxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFeEM7Q0FDQSxLQUFLLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7Q0FDcEQsS0FBSyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7O0NBRXpDO0NBQ0EsS0FBSyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLGdCQUFnQixDQUFDO0NBQ3pELEtBQUssT0FBTyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsVUFBVSxDQUFDO0NBQzlDLEtBQUssT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUVuQjs7Q0FFQSxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFckQsTUFBTSxJQUFJLGVBQWUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFO0NBQ3pDLE9BQU8sVUFBVSxHQUFHLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRTtDQUN2RCxPQUFPLElBQUksR0FBRyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRTNDLE1BQU0sZUFBZSxFQUFFLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQztDQUM1QyxNQUFNLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQztDQUNqRCxNQUFNLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFNUIsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVg7O0NBRUEsS0FBSyxJQUFJLFNBQVMsR0FBRyxHQUFHLFFBQVE7Q0FDaEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUV4QyxLQUFLLGFBQWEsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO0NBQzlDLEtBQUssT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQztDQUNuQyxLQUFLLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbkI7O0NBRUEsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXJELE1BQU0sSUFBSSxlQUFlLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQyxNQUFNLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDOUQsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRTVCLE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQzs7Q0FFeEMsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLFVBQVUsRUFBRSxXQUFXLElBQUksRUFBRSxVQUFVLEdBQUc7O0NBRTNDO0NBQ0E7O0NBRUEsRUFBRSxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsc0JBQXNCO0NBQ2pELEdBQUcsS0FBSyxHQUFHLGFBQWEsRUFBRSxJQUFJLEVBQUU7Q0FDaEMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Q0FFN0IsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUcsT0FBTyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXRELEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU07Q0FDekIsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVk7Q0FDbEMsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDMUIsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU07Q0FDNUIsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWU7Q0FDeEMsR0FBRyxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTNDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRTFCLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQzs7Q0FFaEMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQ3JCLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7O0NBRW5DLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFcEUsR0FBRyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0IsR0FBRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFMUUsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sZUFBZSxDQUFDOztDQUV6QixFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUVqQztDQUNBOztDQUVBLEVBQUUsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQjtDQUNqRCxHQUFHLEtBQUssR0FBRyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWpDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUU3QixHQUFHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNO0NBQzFCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZO0NBQ25DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTO0NBQzdCLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO0NBQzNDLElBQUksWUFBWSxHQUFHLFFBQVEsRUFBRSxpQkFBaUIsRUFBRTtDQUNoRCxJQUFJLGdCQUFnQixHQUFHLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUVqRCxHQUFHLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEtBQUssQ0FBQzs7Q0FFN0MsR0FBRyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxDQUFDO0NBQ3BDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUVsQixHQUFHLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztDQUMzRCxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFckIsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUM7Q0FDL0MsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWYsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsZUFBZSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxHQUFHOztDQUVuRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0NBQ3JCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Q0FDbkIsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUM7O0NBRXJDLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07Q0FDekIsRUFBRSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU07Q0FDekIsRUFBRSxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXRDLENBQUMsSUFBSSxtQkFBbUIsR0FBRztDQUMzQixHQUFHLFdBQVcsR0FBRyxtQkFBbUI7Q0FDcEMsR0FBRyxTQUFTLEdBQUcsbUJBQW1CO0NBQ2xDLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXhDLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDO0NBQzFELEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQztDQUNsQyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEdBQUcsbUJBQW1CLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUM7O0NBRWpELENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7O0NBRW5DO0NBQ0EsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Q0FDekIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDOztDQUUvQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7Q0FDbkMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOztDQUVoQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0NBQ3hCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Q0FFdEI7Q0FDQTtDQUNBLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7O0NBRXhCO0NBQ0E7Q0FDQSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVmLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDOztDQUU5QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0NBQ2pCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzs7Q0FFM0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztDQUNyQixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOztDQUVyQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUM7O0NBRWpDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQztDQUMvQixDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDOztDQUU3QixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRTs7Q0FFMUM7O0NBRUEsQ0FBQyxJQUFJLEVBQUUsV0FBVzs7Q0FFbEIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVc7O0NBRWxCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEIsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXOztDQUVuQixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0NBQ3RCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O0NBRXRCLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDaEIsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRXpDLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVzs7Q0FFdkIsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQztDQUM5RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVwRSxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxXQUFXLEVBQUUsV0FBVzs7Q0FFekIsRUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxHQUFHOztDQUUzQixFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDOztDQUV6QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsV0FBVyxHQUFHOztDQUV4QyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ25CLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7O0NBRWpDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRjs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsTUFBTSxHQUFHOztDQUV4QyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztDQUV2QjtDQUNBLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEQsRUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRTs7Q0FFRjtDQUNBLENBQUMsa0JBQWtCLEVBQUUsV0FBVzs7Q0FFaEMsRUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFL0IsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxVQUFVLFFBQVEsR0FBRzs7Q0FFOUIsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxVQUFVLFFBQVEsR0FBRzs7Q0FFL0IsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEQsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxVQUFVLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHOztDQUUxRCxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDcEMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUxQixFQUFFLElBQUksSUFBSSxHQUFHOztDQUViLEdBQUcsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO0NBQzNDLElBQUksZUFBZSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUTs7Q0FFbEQsSUFBSSxhQUFhLEdBQUcsZUFBZSxHQUFHLGNBQWM7Q0FDcEQsSUFBSSxhQUFhLEdBQUcsY0FBYyxHQUFHLGVBQWUsQ0FBQzs7Q0FFckQsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDdEQsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTdDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFVBQVUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUc7O0NBRXZELEVBQUUsT0FBTyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTVELEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVzs7Q0FFeEIsRUFBRSxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs7Q0FFbEQsRUFBRSxLQUFLLGlCQUFpQixLQUFLLElBQUksR0FBRzs7Q0FFcEMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0NBQ2xDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztDQUVoRSxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRjs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsU0FBUyxHQUFHOztDQUU5QyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQzs7Q0FFeEQsRUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRTs7Q0FFRjtDQUNBLENBQUMscUJBQXFCLEVBQUUsV0FBVzs7Q0FFbkMsRUFBRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQzs7Q0FFbEMsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxVQUFVLFFBQVEsR0FBRzs7Q0FFbkMsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzs7Q0FFbEQsRUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxVQUFVLE1BQU0sR0FBRzs7Q0FFOUIsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Q0FDMUIsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7O0NBRXBDLEVBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRTVCLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsVUFBVSxRQUFRLEdBQUc7O0NBRTVCLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTVELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsVUFBVSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsR0FBRzs7Q0FFMUQsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSTtDQUMzQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCOztDQUUzQyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztDQUU5QixFQUFFLEtBQUssV0FBVyxLQUFLLElBQUksR0FBRzs7Q0FFOUIsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7Q0FDakQsR0FBRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsV0FBVyxDQUFDOztDQUU1QyxHQUFHOztDQUVILEVBQUUsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLGtCQUFrQjtDQUM1QyxHQUFHLE1BQU0sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDOztDQUVyQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDbkIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQzs7Q0FFOUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLFNBQVMsQ0FBQztDQUMzQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxZQUFZLEdBQUcsU0FBUyxDQUFDOztDQUV6QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVzs7Q0FFekIsRUFBRSxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQzs7Q0FFeEQsRUFBRSxLQUFLLG9CQUFvQixLQUFLLElBQUksR0FBRzs7Q0FFdkMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0NBQ3JDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxDQUFDOztDQUVuRSxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLFFBQVEsRUFBRSxXQUFXOztDQUV0QixFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFckIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXOztDQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFcEIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXOztDQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzs7Q0FFOUMsRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsR0FBRzs7Q0FFaEU7O0NBRUEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRzs7Q0FFeEI7O0NBRUEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQzlCLEdBQUcsT0FBTzs7Q0FFVixHQUFHOztDQUVILEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLFNBQVMsS0FBSyxJQUFJLEdBQUc7O0NBRTVCOztDQUVBLEdBQUcsSUFBSSxXQUFXLEdBQUcsRUFBRSxJQUFJLEdBQUcsU0FBUyxLQUFLLGFBQWEsQ0FBQztDQUMxRCxHQUFHLEtBQUssV0FBVyxHQUFHLENBQUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxHQUFHOztDQUVqRCxJQUFJLE9BQU87O0NBRVgsSUFBSTs7Q0FFSjs7Q0FFQSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0NBQzFCLEdBQUcsU0FBUyxHQUFHLGFBQWEsR0FBRyxXQUFXLENBQUM7O0NBRTNDLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDO0NBQzdDLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0M7Q0FDQTs7Q0FFQSxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFDLEVBQUUsS0FBSyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUVwQixHQUFHLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7Q0FDekMsR0FBRyxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7O0NBRS9DLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFN0QsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQzNDLElBQUksY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXhELElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFVBQVUsSUFBSSxHQUFHOztDQUVqQyxFQUFFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFakIsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUc7O0NBRXRCLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7Q0FDeEIsR0FBRyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7O0NBRTdDLEdBQUcsS0FBSyxXQUFXLEtBQUssSUFBSSxHQUFHOztDQUUvQixJQUFJLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0QsSUFBSSxNQUFNLElBQUksZ0JBQWdCLENBQUM7O0NBRS9CLElBQUksS0FBSyxJQUFJLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUMsRUFBRSxHQUFHOztDQUV0RCxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7Q0FFdkIsS0FBSyxLQUFLLGdCQUFnQixLQUFLLENBQUMsR0FBRzs7Q0FFbkM7Q0FDQSxNQUFNLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOztDQUUzQixNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztDQUNqQyxFQUFFLE9BQU8sTUFBTSxDQUFDOztDQUVoQixFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxJQUFJLEdBQUc7O0NBRXBDLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHOztDQUV2QixHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztDQUU5QixHQUFHLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQzs7Q0FFaEQsR0FBRyxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRS9CLElBQUksSUFBSSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3RCxJQUFJLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQzs7Q0FFbEMsSUFBSSxLQUFLLElBQUksR0FBRyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEdBQUc7O0NBRXRELEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUV4QixLQUFLLEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRzs7Q0FFNUI7Q0FDQSxNQUFNLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztDQUV6QixNQUFNLE1BQU07O0NBRVo7Q0FDQSxNQUFNLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOztDQUVqQyxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztDQUN2QyxFQUFFLE9BQU8sU0FBUyxDQUFDOztDQUVuQixFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFVBQVUsU0FBUyxHQUFHOztDQUVwQyxFQUFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDOztDQUVuQyxFQUFFLEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFckMsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7O0NBRXBDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJO0NBQ25CLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxJQUFJLEtBQUssUUFBUSxHQUFHOztDQUUzQixHQUFHLEtBQUssU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHO0NBQzNCOztDQUVBLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7Q0FDeEIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRTFDLElBQUk7O0NBRUosR0FBRyxXQUFXLEVBQUU7O0NBRWhCLElBQUksS0FBSyxJQUFJLElBQUksUUFBUSxHQUFHOztDQUU1QixLQUFLLElBQUksR0FBRyxRQUFRLENBQUM7O0NBRXJCLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUc7O0NBRTNCLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFZCxLQUFLLE1BQU0sTUFBTSxXQUFXLENBQUM7O0NBRTdCLElBQUksS0FBSyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Q0FDckQsU0FBUyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7Q0FFOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtDQUMvQixLQUFLLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUk7Q0FDbkMsS0FBSyxTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0NBQ3RDLEtBQUssRUFBRSxDQUFDOztDQUVSLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxRQUFRLEtBQUssSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDOztDQUU1QyxHQUFHLEtBQUssU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHO0NBQzNCOztDQUVBLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHOztDQUUxQixLQUFLLFNBQVMsR0FBRyxDQUFDLENBQUM7O0NBRW5CLEtBQUssSUFBSSxDQUFDLFdBQVc7Q0FDckIsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWhELEtBQUssTUFBTTs7Q0FFWDtDQUNBO0NBQ0E7O0NBRUEsS0FBSyxJQUFJLENBQUMsV0FBVztDQUNyQixPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFaEQsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsS0FBSyxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUc7Q0FDdkM7O0NBRUEsSUFBSSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQztDQUNsRCxJQUFJLElBQUksSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDOztDQUVqQyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUV2QyxJQUFJLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDOztDQUUvQyxJQUFJLEtBQUssT0FBTyxHQUFHLENBQUMsR0FBRztDQUN2Qjs7Q0FFQSxLQUFLLEtBQUssSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0NBQ3RELFVBQVUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7O0NBRS9CLEtBQUssSUFBSSxHQUFHLFNBQVMsR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtDQUNoQyxNQUFNLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUk7Q0FDcEMsTUFBTSxTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZDLE1BQU0sRUFBRSxDQUFDOztDQUVULEtBQUssTUFBTTtDQUNYOztDQUVBLEtBQUssS0FBSyxPQUFPLEtBQUssQ0FBQyxHQUFHO0NBQzFCOztDQUVBLE1BQU0sSUFBSSxPQUFPLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztDQUNsQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV2RCxNQUFNLE1BQU07O0NBRVosTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWpELE1BQU07O0NBRU4sS0FBSyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQzs7Q0FFakMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtDQUNoQyxNQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUztDQUN0RCxNQUFNLEVBQUUsQ0FBQzs7Q0FFVCxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxLQUFLLFFBQVEsSUFBSSxFQUFFLFNBQVMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHO0NBQzlDOztDQUVBLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Q0FDckIsSUFBSSxPQUFPLFFBQVEsR0FBRyxJQUFJLENBQUM7O0NBRTNCLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0NBQ25CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxVQUFVLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxHQUFHOztDQUVuRCxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzs7Q0FFM0MsRUFBRSxLQUFLLFFBQVEsR0FBRzs7Q0FFbEIsR0FBRyxRQUFRLENBQUMsV0FBVyxJQUFJLGVBQWUsQ0FBQztDQUMzQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDOztDQUV6QyxHQUFHLE1BQU07O0NBRVQ7O0NBRUEsR0FBRyxLQUFLLE9BQU8sR0FBRzs7Q0FFbEIsSUFBSSxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7Q0FDaEQsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUM7O0NBRTVDLElBQUksTUFBTTs7Q0FFVixJQUFJLFFBQVEsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7O0NBRTVDLElBQUk7O0NBRUosR0FBRyxLQUFLLEtBQUssR0FBRzs7Q0FFaEIsSUFBSSxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjO0NBQzVDLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDOztDQUU1QyxJQUFJLE1BQU07O0NBRVYsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLGdCQUFnQixDQUFDOztDQUU1QyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxVQUFVLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztDQUU5RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJO0NBQzNDLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs7Q0FFekMsRUFBRSxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0NBQ2pELEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQzs7Q0FFekMsR0FBRzs7Q0FFSCxFQUFFLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0I7Q0FDNUMsR0FBRyxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQzs7Q0FFckMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQztDQUNoRCxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQzs7Q0FFeEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLGNBQWMsRUFBRSxJQUFJLEdBQUc7O0NBRWhDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Q0FDbkIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztDQUMzQixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDOztDQUVyQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVmLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7O0NBRXRCLENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUU7O0NBRXBFLENBQUMsV0FBVyxFQUFFLFdBQVcsTUFBTSxFQUFFLGVBQWUsR0FBRzs7Q0FFbkQsRUFBRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLO0NBQzVDLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTTtDQUMvQixHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTTtDQUMxQixHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUMsaUJBQWlCO0NBQ3RDLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxhQUFhO0NBQ3RDLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJO0NBQ3ZCLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0I7Q0FDL0MsR0FBRyxjQUFjLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUvQyxFQUFFLEtBQUssY0FBYyxLQUFLLFNBQVMsR0FBRzs7Q0FFdEMsR0FBRyxjQUFjLEdBQUcsRUFBRSxDQUFDO0NBQ3ZCLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRSxHQUFHLGNBQWMsQ0FBQzs7Q0FFL0MsR0FBRzs7Q0FFSCxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXpDLEdBQUcsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRTtDQUMxQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSTtDQUMxQixJQUFJLE9BQU8sR0FBRyxjQUFjLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRTFDLEdBQUcsS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUVoQyxJQUFJLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUM7O0NBRTVCLElBQUksTUFBTTs7Q0FFVixJQUFJLE9BQU8sR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVCLElBQUksS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUVqQzs7Q0FFQSxLQUFLLEtBQUssT0FBTyxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRXpDLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0NBQ2hDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRS9ELE1BQU07O0NBRU4sS0FBSyxTQUFTOztDQUVkLEtBQUs7O0NBRUwsSUFBSSxJQUFJLElBQUksR0FBRyxlQUFlLElBQUksZUFBZTtDQUNqRCxNQUFNLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7O0NBRWhELElBQUksT0FBTyxHQUFHLElBQUksYUFBYTtDQUMvQixLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7Q0FDcEQsS0FBSyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxJQUFJLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztDQUM5QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUU3RCxJQUFJLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUM7O0NBRTVCLElBQUk7O0NBRUosR0FBRyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7O0NBRW5ELEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLGVBQWUsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdEMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRzs7Q0FFMUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxXQUFXLEtBQUssSUFBSSxHQUFHOztDQUV0QztDQUNBOztDQUVBLElBQUksSUFBSSxRQUFRLEdBQUcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSTtDQUMzRCxLQUFLLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUk7Q0FDakMsS0FBSyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFdEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU07Q0FDNUIsS0FBSyxjQUFjLElBQUksY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUxRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUxRCxJQUFJOztDQUVKLEdBQUcsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDOztDQUUzQztDQUNBLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFekQsSUFBSSxJQUFJLE9BQU8sR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLElBQUksS0FBSyxPQUFPLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHOztDQUVyQyxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDbEMsS0FBSyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFakMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRXhDLEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHOztDQUV4QyxHQUFHLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7Q0FFM0M7Q0FDQSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXpELElBQUksSUFBSSxPQUFPLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLENBQUMsR0FBRzs7Q0FFckMsS0FBSyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztDQUNwQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFdEMsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsa0JBQWtCLEVBQUUsWUFBWTs7Q0FFakMsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztDQUNyQixFQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDOztDQUUzQixFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0NBQzNCO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7OztDQUdBLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Q0FDdEIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDOztDQUU1QixFQUFFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7OztDQUduQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxDQUFDOztDQUV2QyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7Q0FFbkIsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHOztDQUVmLEdBQUcsT0FBTyxFQUFFO0NBQ1osSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtDQUNqRCxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUU7Q0FDakQsSUFBSTtDQUNKLEdBQUcsUUFBUSxFQUFFO0NBQ2IsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtDQUNsRCxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtDQUNsRCxJQUFJO0NBQ0osR0FBRyxtQkFBbUIsRUFBRTtDQUN4QixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUU7Q0FDN0QsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLEVBQUU7Q0FDN0QsSUFBSTs7Q0FFSixHQUFHLENBQUM7O0NBRUosRUFBRTs7Q0FFRjs7Q0FFQSxDQUFDLGVBQWUsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFdEMsRUFBRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0NBQ2pDLEVBQUUsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDOztDQUV4RCxFQUFFOztDQUVGLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7Q0FFN0QsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUTtDQUM3QixHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYztDQUN0QyxHQUFHLGNBQWMsR0FBRyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsS0FBSyxjQUFjLEtBQUssU0FBUyxHQUFHOztDQUV0QyxHQUFHLGNBQWMsR0FBRzs7Q0FFcEIsSUFBSSxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUU7Q0FDNUIsSUFBSSxZQUFZLEVBQUUsRUFBRTs7Q0FFcEIsSUFBSSxDQUFDOztDQUVMLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQzs7Q0FFaEMsR0FBRyxhQUFhLEVBQUUsUUFBUSxFQUFFLEdBQUcsY0FBYyxDQUFDOztDQUU5QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDOztDQUVsRCxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0NBQ2xELEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFL0IsR0FBRzs7Q0FFSCxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztDQUN0QyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpCLEVBQUUsY0FBYyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7O0NBRW5ELEVBQUU7O0NBRUYsQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUTtDQUM3QixHQUFHLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtDQUNyRCxHQUFHLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDOztDQUVuQyxFQUFFLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7Q0FDOUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsa0JBQWtCLENBQUM7Q0FDN0MsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWhCLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7OztDQUc1QixFQUFFLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSTtDQUNsQyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYztDQUN0QyxHQUFHLGNBQWMsR0FBRyxhQUFhLEVBQUUsUUFBUSxFQUFFO0NBQzdDLEdBQUcsbUJBQW1CLEdBQUcsY0FBYyxDQUFDLFlBQVk7O0NBRXBELEdBQUcsZUFBZTtDQUNsQixJQUFJLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O0NBRXpELEdBQUcsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDOztDQUUvQyxFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztDQUN2RCxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLEdBQUcsZUFBZSxDQUFDO0NBQzVELEVBQUUsbUJBQW1CLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRTVCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7O0NBR2xDLEVBQUUsSUFBSSxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVk7Q0FDaEQsR0FBRyxRQUFRLEdBQUcsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDOztDQUV2RCxFQUFFLE9BQU8sWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVsQyxFQUFFLEtBQUssbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7Q0FFMUMsR0FBRyxPQUFPLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFcEMsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLGdDQUFnQyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUV2RCxFQUFFLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztDQUMxQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRXhELEdBQUcsSUFBSSxPQUFPLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixHQUFHLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxLQUFLLENBQUMsR0FBRzs7Q0FFMUMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTNDLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVsQztDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVc7O0NBRWpDLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLEdBQUc7O0NBRTVDLEdBQUcsbUJBQW1CLEdBQUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUFDOztDQUVwRCxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDO0NBQ3ZDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdEMsRUFBRSxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0NBQzlDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLG1CQUFtQixDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUV0QztDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVc7O0NBRWpDLEdBQUcsa0JBQWtCLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZTs7Q0FFL0MsR0FBRyxnQkFBZ0IsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0NBQzFDLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUV6QyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Q0FDM0MsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7O0NBRTFDLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxHQUFHOztDQUVoRSxFQUFFLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0I7Q0FDbEQsR0FBRyxhQUFhLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRTs7Q0FFN0MsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Q0FFN0IsRUFBRSxLQUFLLGFBQWEsS0FBSyxTQUFTLEdBQUc7O0NBRXJDLEdBQUcsYUFBYSxHQUFHLEVBQUUsQ0FBQztDQUN0QixHQUFHLGNBQWMsRUFBRSxRQUFRLEVBQUUsR0FBRyxhQUFhLENBQUM7O0NBRTlDLEdBQUc7O0NBRUgsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDOztDQUV2QyxFQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztDQUN4QyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTNCLEVBQUU7O0NBRUYsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLE9BQU8sR0FBRzs7Q0FFOUMsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUztDQUMvQixHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTztDQUNoQyxHQUFHLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUk7Q0FDdkMsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUk7Q0FDL0IsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDLHNCQUFzQjtDQUMvQyxHQUFHLGFBQWEsR0FBRyxjQUFjLEVBQUUsUUFBUSxFQUFFOztDQUU3QyxHQUFHLG1CQUFtQixHQUFHLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtDQUN4RCxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDOztDQUVwQyxFQUFFLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7Q0FDL0MsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsbUJBQW1CLENBQUM7Q0FDL0MsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWpCLEVBQUUsT0FBTyxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXBDLEVBQUUsZ0JBQWdCLEVBQUU7O0NBRXBCLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxhQUFhLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQzs7Q0FFekQsR0FBRyxPQUFPLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFckMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsT0FBTyxHQUFHOztDQUVwQyxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTO0NBQy9CLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXOztDQUVsQyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7O0NBRTdDLEdBQUcsb0JBQW9CLEdBQUcsUUFBUSxFQUFFLGVBQWUsRUFBRSxDQUFDOztDQUV0RCxFQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDO0NBQ3hDLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQzs7Q0FFeEMsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0NBQy9DLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLG9CQUFvQixDQUFDOztDQUUvQyxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxPQUFPLEdBQUc7O0NBRXhDLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVM7Q0FDL0IsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVc7O0NBRWxDLEdBQUcsa0JBQWtCLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCOztDQUVoRCxHQUFHLGlCQUFpQixHQUFHLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDOztDQUV0RCxFQUFFLE9BQU8sQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7Q0FDM0MsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLENBQUM7O0NBRTNDLEVBQUUsaUJBQWlCLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztDQUM1QyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQzs7Q0FFNUMsRUFBRTs7O0NBR0Y7O0NBRUEsQ0FBQyx1QkFBdUIsRUFBRSxZQUFZOztDQUV0QyxFQUFFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0I7Q0FDOUMsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixHQUFHO0NBQ3hELEdBQUcsV0FBVyxHQUFHLFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUc7O0NBRW5DLEdBQUcsV0FBVyxHQUFHLElBQUksaUJBQWlCO0NBQ3RDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFO0NBQ2hELElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDOztDQUUvQyxHQUFHLFdBQVcsQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDO0NBQzlDLEdBQUcsWUFBWSxFQUFFLGVBQWUsRUFBRSxHQUFHLFdBQVcsQ0FBQzs7Q0FFakQsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sV0FBVyxDQUFDOztDQUVyQixFQUFFOztDQUVGLENBQUMsMkJBQTJCLEVBQUUsV0FBVyxXQUFXLEdBQUc7O0NBRXZELEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjtDQUM5QyxHQUFHLFNBQVMsR0FBRyxXQUFXLENBQUMsWUFBWTs7Q0FFdkMsR0FBRyxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQywyQkFBMkI7O0NBRTNELEdBQUcscUJBQXFCLEdBQUcsWUFBWSxFQUFFLGtCQUFrQixFQUFFLENBQUM7O0NBRTlELEVBQUUsV0FBVyxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztDQUNoRCxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFdBQVcsQ0FBQzs7Q0FFbkQsRUFBRSxxQkFBcUIsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0NBQ2pELEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLHFCQUFxQixDQUFDOztDQUVwRCxFQUFFOztDQUVGLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxZQUFZLEVBQUUsQ0FBQyxFQUFFOztDQUV4RDtDQUNBO0NBQ0E7Q0FDQSxDQUFDLFVBQVUsRUFBRSxXQUFXLElBQUksRUFBRSxZQUFZLEdBQUc7O0NBRTdDLEVBQUUsSUFBSSxJQUFJLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQyxLQUFLO0NBQ3ZDLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJOztDQUV2QixHQUFHLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRO0NBQ3hDLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSTs7Q0FFakQsR0FBRyxRQUFRLEdBQUcsVUFBVSxLQUFLLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUk7O0NBRTFELEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFO0NBQ25ELEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQzs7Q0FFMUIsRUFBRSxLQUFLLGNBQWMsS0FBSyxTQUFTLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxjQUFjO0NBQ3JCLEtBQUssY0FBYyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxLQUFLLGNBQWMsS0FBSyxTQUFTLEdBQUc7O0NBRXZDLElBQUksT0FBTyxjQUFjLENBQUM7O0NBRTFCLElBQUk7O0NBRUo7Q0FDQTtDQUNBLEdBQUcsZUFBZSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXREO0NBQ0EsR0FBRyxLQUFLLFVBQVUsS0FBSyxJQUFJO0NBQzNCLElBQUksVUFBVSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUM7O0NBRXZDLEdBQUc7O0NBRUg7Q0FDQSxFQUFFLEtBQUssVUFBVSxLQUFLLElBQUksR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFekM7Q0FDQSxFQUFFLElBQUksU0FBUyxHQUFHLElBQUksZUFBZSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXhFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQUM7O0NBRWpEO0NBQ0EsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFM0QsRUFBRSxPQUFPLFNBQVMsQ0FBQzs7Q0FFbkIsRUFBRTs7Q0FFRjtDQUNBLENBQUMsY0FBYyxFQUFFLFdBQVcsSUFBSSxFQUFFLFlBQVksR0FBRzs7Q0FFakQsRUFBRSxJQUFJLElBQUksR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUs7Q0FDdkMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUk7O0NBRXZCLEdBQUcsVUFBVSxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVE7Q0FDeEMsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJOztDQUVqRCxHQUFHLFFBQVEsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJOztDQUVqRCxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVwRCxFQUFFLEtBQUssY0FBYyxLQUFLLFNBQVMsR0FBRzs7Q0FFdEMsR0FBRyxPQUFPLGNBQWMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDOztDQUUxRCxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRjtDQUNBLENBQUMsYUFBYSxFQUFFLFlBQVk7O0NBRTVCLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWU7Q0FDbEMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVM7Q0FDNUIsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDOztDQUVyQyxFQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0NBQzNCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzs7Q0FFNUIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUUxQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEIsR0FBRzs7Q0FFSCxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRTNDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7O0NBRTlCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxNQUFNLEVBQUUsV0FBVyxTQUFTLEdBQUc7O0NBRWhDLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRTlCLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVE7Q0FDN0IsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWU7O0NBRWxDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUztDQUNoQyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTs7Q0FFekMsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7O0NBRXBDOztDQUVBLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFMUMsR0FBRyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0QsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTO0NBQy9CLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFckMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUUzQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXBDLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxPQUFPLEVBQUUsWUFBWTs7Q0FFdEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7O0NBRXBCLEVBQUU7O0NBRUY7Q0FDQSxDQUFDLFdBQVcsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUTtDQUM3QixHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSTtDQUN2QixHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYztDQUN0QyxHQUFHLGNBQWMsR0FBRyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsS0FBSyxjQUFjLEtBQUssU0FBUyxHQUFHOztDQUV0QztDQUNBO0NBQ0E7O0NBRUEsR0FBRyxJQUFJLGVBQWUsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDOztDQUVyRCxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWhFLElBQUksSUFBSSxNQUFNLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV0QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVztDQUN2QyxLQUFLLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4RCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0NBQzlCLElBQUksTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7Q0FFcEMsSUFBSSxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0NBQ2hELElBQUksT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLGtCQUFrQixDQUFDO0NBQy9DLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUVsQixJQUFJLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFcEQsSUFBSTs7Q0FFSixHQUFHLE9BQU8sYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVwQyxHQUFHOztDQUVILEVBQUU7O0NBRUY7Q0FDQSxDQUFDLFdBQVcsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSTtDQUMxQixHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDOztDQUV2QyxFQUFFLE1BQU0sSUFBSSxRQUFRLElBQUksYUFBYSxHQUFHOztDQUV4QyxHQUFHLElBQUksWUFBWSxHQUFHLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxZQUFZO0NBQzVELElBQUksTUFBTSxHQUFHLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFdEMsR0FBRyxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRS9CLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ3JDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV6QyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsc0JBQXNCO0NBQ2xELEdBQUcsYUFBYSxHQUFHLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFOUMsRUFBRSxLQUFLLGFBQWEsS0FBSyxTQUFTLEdBQUc7O0NBRXJDLEdBQUcsTUFBTSxJQUFJLFNBQVMsSUFBSSxhQUFhLEdBQUc7O0NBRTFDLElBQUksSUFBSSxPQUFPLEdBQUcsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQzdDLElBQUksT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7Q0FDbkMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTNDLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGO0NBQ0EsQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLEVBQUUsWUFBWSxHQUFHOztDQUVoRCxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUV6RCxFQUFFLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRzs7Q0FFekIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDcEMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXhDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxPQUFPLEVBQUUsS0FBSyxHQUFHOztDQUUxQixDQUFDLEtBQUssT0FBTyxLQUFLLEtBQUssUUFBUSxHQUFHOztDQUVsQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsb0RBQW9ELEVBQUUsQ0FBQztDQUN2RSxFQUFFLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpCLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFcEIsQ0FBQzs7Q0FFRCxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxZQUFZOztDQUV0QyxDQUFDLE9BQU8sSUFBSSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUV4RixDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLFNBQVMsdUJBQXVCLEdBQUc7O0NBRW5DLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLHlCQUF5QixDQUFDO0NBQ3ZDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQzs7Q0FFcEMsQ0FBQzs7Q0FFRCx1QkFBdUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFOUYsQ0FBQyxXQUFXLEVBQUUsdUJBQXVCOztDQUVyQyxDQUFDLHlCQUF5QixFQUFFLElBQUk7O0NBRWhDLENBQUMsUUFBUSxFQUFFLFdBQVcsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLEdBQUc7O0NBRXBELEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7O0NBRXBCLEdBQUcsS0FBSyxFQUFFLEtBQUs7Q0FDZixHQUFHLEtBQUssRUFBRSxLQUFLO0NBQ2YsR0FBRyxhQUFhLEVBQUUsYUFBYTs7Q0FFL0IsR0FBRyxFQUFFLENBQUM7O0NBRU4sRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOztDQUUzQixFQUFFLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRzs7Q0FFeEIsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVsQyxHQUFHOztDQUVILEVBQUUsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Q0FFckMsRUFBRSxNQUFNLElBQUksSUFBSSxJQUFJLFVBQVUsR0FBRzs7Q0FFakMsR0FBRyxJQUFJLFNBQVMsR0FBRyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDdEMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRzs7Q0FFSCxFQUFFLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0NBRTdCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFcEQsR0FBRyxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRWxFLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxHQUFHOztDQUV2RixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDOztDQUVsQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7Q0FDL0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztDQUMxQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztDQUV0QixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxLQUFLLElBQUksQ0FBQzs7Q0FFdkMsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsMEJBQTBCLENBQUMsU0FBUyxFQUFFOztDQUUvRCxDQUFDLEtBQUssRUFBRTs7Q0FFUixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRTs7Q0FFUixFQUFFLEdBQUcsRUFBRSxZQUFZOztDQUVuQixHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSixNQUFNLENBQUMsTUFBTSxFQUFFLDBCQUEwQixDQUFDLFNBQVMsRUFBRTs7Q0FFckQsQ0FBQyw0QkFBNEIsRUFBRSxJQUFJOztDQUVuQyxDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWhFLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVwRSxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxHQUFHOztDQUU3QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEUsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXBFLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRW5FLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkUsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV2RSxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRXZFLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFakMsRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRWpELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFckMsRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRWpELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV6QyxFQUFFLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Q0FFakQsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNuQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFNUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFbEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ3RCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFOUQsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztDQUN0QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5QyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLEVBQUUsQ0FBQzs7Q0FFeEMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUU7O0NBRW5FLENBQUMsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUV6QixFQUFFLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7O0NBRXhDLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUU7O0NBRTVDLENBQUMsbUJBQW1CLEVBQUUsSUFBSTs7Q0FFMUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTlCLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHOztDQUVoQyxHQUFHLE1BQU0sSUFBSSxTQUFTLEVBQUUsdURBQXVELEVBQUUsQ0FBQzs7Q0FFbEYsR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0NBQ3BFLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0NBRXJCLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7O0NBRXZCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQzVELEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0NBQzVCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0NBQzlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztDQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sR0FBRzs7Q0FFaEQsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUN4QixFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDOztDQUU3QixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxELEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTVELEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFakMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsUUFBUSxFQUFFLFdBQVcsUUFBUSxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUywwQkFBMEIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixHQUFHOztDQUV2RSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUvQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7O0NBRS9DLENBQUM7O0NBRUQsMEJBQTBCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFcEcsQ0FBQyxXQUFXLEVBQUUsMEJBQTBCOztDQUV4QyxDQUFDLDRCQUE0QixFQUFFLElBQUk7O0NBRW5DLENBQUMsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUUzQixFQUFFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFeEQsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOztDQUVsRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBOztDQUVBLFNBQVMsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsR0FBRzs7Q0FFdkUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLENBQUMsQ0FBQzs7Q0FFL0MsQ0FBQzs7Q0FFRCx3QkFBd0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFaEcsQ0FBQyxXQUFXLEVBQUUsd0JBQXdCOztDQUV0QyxDQUFDLDBCQUEwQixFQUFFLElBQUk7O0NBRWpDLENBQUMsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUUzQixFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXRELEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7Q0FFbEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHOztDQUVuRCxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ3pDOztDQUVBLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0NBQ3ZCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxDQUFDOztDQUU1QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUc7Q0FDZixFQUFFLElBQUksRUFBRSxFQUFFO0NBQ1YsRUFBRSxJQUFJLEVBQUUsRUFBRTtDQUNWLEVBQUUsR0FBRyxFQUFFLEVBQUU7Q0FDVCxFQUFFLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7Q0FDMUIsRUFBRSxNQUFNLEVBQUUsRUFBRTtDQUNaLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO0NBQ3ZDLEVBQUUsVUFBVSxFQUFFO0NBQ2QsR0FBRyxHQUFHLEVBQUUsWUFBWTtDQUNwQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUVBQXVFLEVBQUUsQ0FBQztDQUM1RixJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztDQUN2QixJQUFJO0NBQ0osR0FBRztDQUNILEVBQUUsRUFBRSxDQUFDOztDQUVMLENBQUM7O0NBRUQsU0FBUyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7Q0FFaEMsQ0FBQzs7Q0FFRCxTQUFTLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEdBQUc7O0NBRXJFLENBQUMsS0FBSyxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssR0FBRyxPQUFPOztDQUV4QyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUV6QyxDQUFDLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVqQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXRELEdBQUcsZUFBZSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVqRSxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUU7O0NBRXBDLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRWpCLENBQUMsR0FBRyxFQUFFLFdBQVcsTUFBTSxFQUFFLFNBQVMsR0FBRzs7Q0FFckM7O0NBRUEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXBDLEVBQUU7O0NBRUYsQ0FBQyxhQUFhLEVBQUUsV0FBVyxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUU1QyxFQUFFLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSzs7Q0FFbEQsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDL0QsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFNUcsR0FBRyxNQUFNLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsS0FBSzs7Q0FFMUQsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQzlILEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRWhGLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsMkNBQTJDLEVBQUUsQ0FBQzs7Q0FFaEUsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsTUFBTSxFQUFFLFNBQVMsR0FBRzs7Q0FFakQsRUFBRSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7O0NBRXRCLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUV6RCxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTdCLEVBQUUsT0FBTyxVQUFVLENBQUM7O0NBRXBCLEVBQUU7O0NBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLE9BQU8sRUFBRSxTQUFTLEdBQUc7O0NBRW5ELEVBQUUsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztDQUV0QixFQUFFLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRTVDLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw0REFBNEQsRUFBRSxDQUFDO0NBQ2hGLEdBQUcsT0FBTyxVQUFVLENBQUM7O0NBRXJCLEdBQUc7O0NBRUgsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxHQUFHLGVBQWUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFaEUsR0FBRzs7Q0FFSCxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRTdCLEVBQUUsT0FBTyxVQUFVLENBQUM7O0NBRXBCLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBOztDQUVBLFNBQVMsS0FBSyxFQUFFLFNBQVMsR0FBRzs7Q0FFNUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsU0FBUyxLQUFLLFNBQVMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDOztDQUVqRSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7Q0FDbEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7Q0FFdEIsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUU7O0NBRWhDLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLE9BQU8sV0FBVyxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQUcsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUVyRixFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7O0NBRXRCLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7Q0FFbkIsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDeEIsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7Q0FFdkIsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxZQUFZOztDQUU3QixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUNsQixFQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQzs7Q0FFMUIsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxZQUFZOztDQUV2QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFZixFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUc7O0NBRTFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ2hCLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRVosR0FBRzs7Q0FFSCxFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sR0FBRzs7Q0FFdEIsR0FBRyxJQUFJLE9BQU8sR0FBRyxFQUFFLE9BQU8sV0FBVyxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQUcsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUVuRixHQUFHLElBQUksR0FBRyxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztDQUM1QyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOztDQUUxQixHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDOztDQUU1QixHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUc7O0NBRXpDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLEdBQUcsQ0FBQztDQUN2RCxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7Q0FDNUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztDQUVsRCxDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFOztDQUVwQyxDQUFDLEdBQUcsRUFBRSxXQUFXLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHOztDQUV0QyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDakIsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFckIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTFCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0NBQ3ZCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztDQUUzQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUY7Q0FDQSxDQUFDLFFBQVEsRUFBRSxXQUFXOztDQUV0QixFQUFFLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQztDQUNyQixFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbEUsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsY0FBYyxFQUFFLFVBQVUsSUFBSSxHQUFHOztDQUVsQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU5QixFQUFFLEtBQUssSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUc7O0NBRTNCLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbEIsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsR0FBRyxNQUFNOztDQUVULEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzdDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXZFLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRzs7Q0FFekMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUcsR0FBRyxDQUFDO0NBQ3ZELENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQztDQUNsRCxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRDLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQzs7Q0FFRCxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUU7O0NBRXRDLENBQUMsR0FBRyxFQUFFLFdBQVcsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUc7O0NBRXBDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdkIsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUNyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUViLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUUxQixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztDQUM3QixFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztDQUMzQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsY0FBYyxFQUFFLFVBQVUsSUFBSSxHQUFHOztDQUVsQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDL0QsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O0NBRWxCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7Q0FFOUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXZDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7Q0FDekIsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUI7Q0FDQTs7Q0FFQSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQzs7Q0FFbkQsQ0FBQyxJQUFJLElBQUksR0FBRyxXQUFXLENBQUM7O0NBRXhCLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCLENBQUMsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQzs7Q0FFOUIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDOztDQUV6QixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekQsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVwQyxDQUFDOztDQUVELGNBQWMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDM0QsY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDOztDQUV0RCxjQUFjLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxXQUFXLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFOUUsQ0FBQyxJQUFJLFNBQVMsR0FBRzs7Q0FFakIsRUFBRSxLQUFLLEVBQUUsS0FBSztDQUNkLEVBQUUsR0FBRyxFQUFFLEdBQUc7O0NBRVYsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLEtBQUssR0FBRyxDQUFDOztDQUV6QixFQUFFLEdBQUcsRUFBRSxHQUFHO0NBQ1YsRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEdBQUcsS0FBSyxLQUFLLEdBQUc7O0NBRWpDLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDZCxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVqQixFQUFFLE1BQU0sRUFBRSxLQUFLOztDQUVmLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDVCxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2QsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFWCxFQUFFLGtCQUFrQixFQUFFLEtBQUs7Q0FDM0IsRUFBRSxZQUFZLEVBQUUsS0FBSzs7Q0FFckIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUM7Q0FDeEMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFdkMsQ0FBQyxDQUFDOztDQUVGLGNBQWMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxHQUFHLEdBQUc7O0NBRWpFLENBQUMsSUFBSSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7O0NBRWxDLENBQUMsSUFBSSxjQUFjLEVBQUUsV0FBVyxHQUFHLEVBQUUsQ0FBQzs7Q0FFdEMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUU5QixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRSxFQUFFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDekMsRUFBRSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRSxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFckMsR0FBRyxJQUFJLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUUzRixHQUFHLElBQUksS0FBSyxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0NBQzFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEMsR0FBRyxLQUFLLEVBQUUsY0FBYyxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUM7O0NBRWpELEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksV0FBVyxHQUFHOztDQUVqQyxFQUFFLElBQUksS0FBSyxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFNUQsRUFBRTs7Q0FFRixDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDOztDQUV0QyxDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsR0FBRyxXQUFXLElBQUksR0FBRzs7Q0FFMUUsQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVsQixFQUFFLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0NBQzFCLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQzs7Q0FFdkMsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsR0FBRyxXQUFXLElBQUksR0FBRzs7Q0FFM0UsQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVsQixFQUFFLFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUM7Q0FDNUIsRUFBRSxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOztDQUV0QyxFQUFFOztDQUVGLENBQUMsQ0FBQzs7Q0FFRixjQUFjLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxXQUFXLElBQUksRUFBRSxHQUFHLEdBQUc7O0NBRWxFLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUN0QixFQUFFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQzs7Q0FFM0UsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLElBQUksRUFBRSxRQUFRLEdBQUc7O0NBRTVFLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztDQUNoQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0UsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLElBQUksRUFBRSxNQUFNLEdBQUc7O0NBRXhFLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFNUIsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLElBQUksRUFBRSxJQUFJLEdBQUc7O0NBRXBFLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzs7Q0FFeEIsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLElBQUksR0FBRzs7Q0FFOUQsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRWQsQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVsQixFQUFFLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDOztDQUV4QixFQUFFOztDQUVGLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGLGNBQWMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxJQUFJLEdBQUc7O0NBRWxFLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUM7O0NBRXBCLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Q0FFaEMsRUFBRTs7Q0FFRixDQUFDLE9BQU8sUUFBUSxDQUFDOztDQUVqQixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsV0FBVyxJQUFJLEdBQUc7O0NBRTNELENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUMsQ0FBQyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEIsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUNyQixFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztDQUUxQixFQUFFLE1BQU07O0NBRVIsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxHQUFHLElBQUksR0FBRyxpQ0FBaUMsRUFBRSxDQUFDOztDQUVoRyxFQUFFOztDQUVGLENBQUMsQ0FBQzs7Q0FFRixjQUFjLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxXQUFXLElBQUksR0FBRzs7Q0FFM0QsQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVsQixFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUUzQixFQUFFOztDQUVGLENBQUMsQ0FBQzs7Q0FFRixjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxXQUFXLEtBQUssR0FBRzs7Q0FFckQsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbEUsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLFNBQVM7O0NBRXJDLEVBQUUsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDOztDQUV4RCxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7O0NBRWhELEVBQUUsS0FBSyxTQUFTLENBQUMsWUFBWSxHQUFHOztDQUVoQyxHQUFHLEtBQUssU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHOztDQUVwRSxJQUFJLFNBQVMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7O0NBRS9CLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEdBQUc7O0NBRS9DLEtBQUssU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0NBQ3pDLEtBQUssU0FBUyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQzs7Q0FFekMsS0FBSzs7Q0FFTCxJQUFJLEtBQUssU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUc7O0NBRTlCLEtBQUssU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDeEIsS0FBSyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDOztDQUUxQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7O0NBRXhELEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUM7O0NBRWxFLEdBQUc7O0NBRUgsRUFBRSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3BILEVBQUUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQzs7Q0FFaEMsRUFBRSxLQUFLLFFBQVEsS0FBSyxTQUFTLENBQUMsWUFBWSxHQUFHOztDQUU3QyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pELEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztDQUVyRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRTlDLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO0NBQ2hELEdBQUcsU0FBUyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxLQUFLLFNBQVMsQ0FBQzs7Q0FFdkQsRUFBRSxLQUFLLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLFNBQVMsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLFNBQVMsR0FBRzs7Q0FFeEQsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7Q0FDdkUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7O0NBRTVFLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUVqRSxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLHFCQUFxQixFQUFFLFFBQVEsR0FBRzs7Q0FFM0MsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLGNBQWMsR0FBRyxFQUFFLENBQUM7O0NBRTlDLENBQUM7O0NBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3RFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUM7O0NBRXBFLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7O0NBRS9EO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHOztDQUU3RCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztDQUV0QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRS9DLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRyxRQUFRLENBQUM7O0NBRXBELENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxTQUFTLEtBQUssU0FBUyxLQUFLLFNBQVMsR0FBRyxDQUFDLENBQUM7O0NBRXpEOztDQUVBLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDOztDQUVsQixDQUFDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUV4QyxDQUFDLEtBQUssV0FBVyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEdBQUc7O0NBRTlDLEVBQUUsUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFMUMsRUFBRSxNQUFNLEtBQUssV0FBVyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRzs7Q0FFM0QsRUFBRSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztDQUVqRCxFQUFFOztDQUVGOztDQUVBLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQzs7Q0FFckMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxJQUFJLHNCQUFzQixFQUFFLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVuRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVoRCxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVsRzs7Q0FFQSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0NBRS9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVmLENBQUM7O0NBRUQsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ3hFLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7O0NBRWhFLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssWUFBWTs7Q0FFckQsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ3hCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN4QixDQUFDLElBQUksWUFBWSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRWxDLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRzs7Q0FFMUIsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRTFELEVBQUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRTVDLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUVuRDs7Q0FFQSxFQUFFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUV6QyxFQUFFLEtBQUssV0FBVyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEdBQUc7O0NBRS9DLEdBQUcsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQzs7Q0FFdkMsR0FBRyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOztDQUVqQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFZixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBELElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRSxLQUFLLElBQUksTUFBTSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEQsS0FBSyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUVuRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV0RyxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTlDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0NBRW5CLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsTUFBTSxLQUFLLFdBQVcsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEdBQUc7O0NBRTVELEdBQUcsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0NBRWhELEdBQUcsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7O0NBRS9DLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztDQUVmOztDQUVBLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdEQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDOztDQUUvRixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFdEUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV0RixJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0NBRWxCLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NBRTlCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVOO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxlQUFlLEVBQUUsS0FBSyxHQUFHOztDQUVsQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRWhDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0NBQ2pDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLElBQUksU0FBUyxHQUFHO0NBQ2pCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQ3hCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQ3hCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDeEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDeEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztDQUN4QixFQUFFLENBQUM7O0NBRUgsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRW5DLEVBQUUsU0FBUyxDQUFDLElBQUk7Q0FDaEIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNwQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3BDLEdBQUcsQ0FBQzs7Q0FFSixFQUFFOztDQUVGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakYsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXhELENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDcEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRWYsQ0FBQzs7Q0FFRCxlQUFlLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ2hFLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQzs7Q0FFeEQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7Q0FFaEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztDQUM5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOztDQUU5QixDQUFDLENBQUM7O0NBRUYsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFL0MsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQzVCLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHOztDQUUxQixFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztDQUNwRSxFQUFFLElBQUksU0FBUyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTVELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTFELEVBQUUsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDekQsRUFBRSxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRWpFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztDQUU1QyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsY0FBYyxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQzs7Q0FFckMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7Q0FDbkIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWpCLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuQyxDQUFDLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVoRCxFQUFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEVBQUUsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHOztDQUUzQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM1QixHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM1QixHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMvQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNoRixDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksc0JBQXNCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTNFLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDOztDQUVoSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFL0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7Q0FDbEMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUUvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFZixDQUFDOzs7Q0FHRCxjQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ25FLGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQzs7Q0FFdEQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxNQUFNLEdBQUc7O0NBRTFELENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztDQUVuQixDQUFDLEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0NBRWhDLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRTs7Q0FFRixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFNUUsRUFBRTs7Q0FFRixDQUFDLE9BQU8sUUFBUSxDQUFDOztDQUVqQixDQUFDLENBQUM7O0NBRUYsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFOUMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QixDQUFDLElBQUksVUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDaEMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUVwQyxDQUFDLE9BQU8sU0FBUyxNQUFNLEdBQUc7O0NBRTFCLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMvQixFQUFFLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRXJELEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUVyRCxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxHQUFHLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTlCLEdBQUcsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHOztDQUU1QyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0NBQ3BFLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQy9DLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkQsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDM0UsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDL0MsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVYLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekQsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFVBQVUsR0FBRzs7Q0FFL0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0QsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztDQUN6RSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXpDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV2QyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDdEMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUUvQjtDQUNBO0NBQ0E7O0NBRUE7Q0FDQTs7Q0FFQTs7Q0FFQTs7Q0FFQTs7Q0FFQTs7Q0FFQTs7Q0FFQTs7Q0FFQTtDQUNBOztDQUVBLENBQUM7O0NBRUQsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzdELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7O0NBRTFELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7Q0FFakQsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0NBQ3pCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsQ0FBQyxDQUFDOztDQUVGLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFaEQsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFOUM7Q0FDQTs7Q0FFQTs7Q0FFQTs7Q0FFQTs7Q0FFQTtDQUNBOztDQUVBO0NBQ0E7O0NBRUEsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxtQkFBbUIsRUFBRSxLQUFLLEdBQUc7O0NBRXRDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztDQUNwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7Q0FDakMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUUvQixDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRWhFLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQzs7Q0FFckMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLGVBQWUsRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFMUYsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDOztDQUU1QyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFZixDQUFDOztDQUVELG1CQUFtQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNwRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDOztDQUVoRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFlBQVk7O0NBRXBELENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Q0FDdkMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFdkMsQ0FBQyxDQUFDOztDQUVGLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7Q0FFbkQsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQjs7Q0FFQSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU5Qzs7Q0FFQSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztDQUNqQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Q0FFbEMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Q0FDbEQsQ0FBQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUU1Qjs7Q0FFQSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pELENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pELENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekQsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pELENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpELENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0NB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TSxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0NBRTNFLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRTdDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVyQyxFQUFFOztDQUVGLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztDQUNyQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7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R0FBRyxNQUFNLENBQUM7O0NBRXRDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sS0FBSyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyQzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkQsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FB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LEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUN2QyxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0NBQ3JDLENBQUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7Q0FDekMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFeEM7O0NBRUEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEs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QyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakUsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHOztDQUUxQixFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQzNCLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRTNCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRW5CO0NBQ0E7O0NBRUEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFL0Q7O0NBRUEsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM3QixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQzs7Q0FFQSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQzs7Q0FFQSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVDOztDQUVBLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakMsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDakMsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMs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Q0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0NBQ25ELEVBQUUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFN0IsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDaEUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDaEUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDaEUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDaEUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFH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RUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ1YsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ1YsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRWpDLEVBQUU7O0NBRUYsQ0FBQyxPQUFPOztDQUVSLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFaEUsR0FBRzs7Q0FFSCxFQUFFLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUV2RTtDQUNBLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUM7Q0FDaEYsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQzs7Q0FFaEY7Q0FDQSxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUM7Q0FD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RUFBRSxDQUFDOztDQUV0QyxFQUFFLE1BQU07O0NBRVI7Q0FDQSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNoRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRVgsRUFBRTs7Q0FFRixDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQzdCLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7O0NBRXJDLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUV4QyxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUV0QyxFQUFFLE1BQU07O0NBRVI7Q0FDQSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM1RSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRVgsRUFBRTs7Q0FFRixDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTFGO0NBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0NBQ2pELEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDeEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV4RDtDQUNBLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUIsRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QixFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUU5QixFQUFFLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkUsRUFBRSxFQUFFLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3ZFLEVBQUUsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkUsRUFBRSxN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
|