ngx-analog-wrist-watch
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.14.
678 lines • 70.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/analogwristwatch.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Renderer2, Output, EventEmitter } from '@angular/core';
import { NgxAnalogWristWatchService } from './ngx-analog-wrist-watch.service';
var AnalogwristwatchDirective = /** @class */ (function () {
function AnalogwristwatchDirective(el, renderer, clockService) {
this.el = el;
this.renderer = renderer;
this.clockService = clockService;
this.timeVal = new EventEmitter();
this.elementInfo = {
input: null,
clockBox: null,
spanToggle: null,
watchIcon: null,
label: null,
labelText: null,
hourHand: null,
minuteHand: null,
secondHand: null,
clockCrown: null,
clockSpindle: null,
clockNum: null,
};
}
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.createInitElement();
this.stylesInInit();
this.checkIfInputContainValue(this.elementInfo, this.inlineStyleInfo);
this.watchRunner();
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.createInitElement = /**
* @return {?}
*/
function () {
/** @type {?} */
var label = this.renderer.createElement('label');
/** @type {?} */
var text = this.renderer.createText('Time');
/** @type {?} */
var input = this.renderer.createElement('input');
/** @type {?} */
var clockBox = this.renderer.createElement('div');
/** @type {?} */
var span = this.renderer.createElement('span');
/** @type {?} */
var unicodeClock = "\u231A";
/** @type {?} */
var icon = this.renderer.createText(unicodeClock);
this.elementInfo.input = input;
this.elementInfo.clockBox = clockBox;
this.elementInfo.spanToggle = span;
this.elementInfo.watchIcon = icon;
this.elementInfo.label = label;
this.elementInfo.labelText = text;
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.stylesInInit = /**
* @return {?}
*/
function () {
this.internalStyle = this.clockService.fetchInternalStyle();
this.inlineStyleInfo = this.clockService.fetchInLineStyle();
this.appendTagInInit(this.elementInfo);
this.applyStyleInInit(this.elementInfo);
this.applyStyleInFocus(this.elementInfo, this.inlineStyleInfo);
this.applyStyleInBlur(this.elementInfo, this.inlineStyleInfo);
this.applyBoxStyle(this.elementInfo);
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.watchRunner = /**
* @return {?}
*/
function () {
var _this = this;
this.addClockElement(this.elementInfo.clockBox);
this.runClock = setInterval((/**
* @return {?}
*/
function () {
/** @type {?} */
var timeInfo = _this.startClock();
_this.timeInfo = timeInfo;
}), 1000);
this.onWatchBtnClick();
this.onChangeHourTimeClick();
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.appendTagInInit = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
/** @type {?} */
var container = this.el.nativeElement;
this.renderer.setAttribute(initElement.input, 'type', 'text');
this.renderer.appendChild(initElement.label, initElement.labelText);
this.renderer.appendChild(initElement.spanToggle, initElement.watchIcon);
this.renderer.appendChild(container, initElement.label);
this.renderer.appendChild(container, initElement.input);
this.renderer.appendChild(container, initElement.spanToggle);
this.renderer.appendChild(container, initElement.clockBox);
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInInit = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
this.applyStyleInDivDirective(initElement);
this.applyStyleInInputAndLabelTag(initElement);
this.applyStyleInInputAndLabelTag(initElement);
this.applyStyleInWatchIcon(initElement);
this.applyStyleInClockBox(initElement);
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInDivDirective = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
this.el.nativeElement.style.display = this.inlineStyleInfo.display,
this.el.nativeElement.style.marginBottom = this.inlineStyleInfo.marginbottom,
this.el.nativeElement.style.marginTop = this.inlineStyleInfo.margintop,
this.el.nativeElement.style.padding = this.inlineStyleInfo.padding,
this.el.nativeElement.style.position = this.inlineStyleInfo.relative,
this.el.nativeElement.style.float = this.inlineStyleInfo.float,
initElement.input.style.border = this.inlineStyleInfo.border;
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInInputAndLabelTag = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
initElement.input.style.borderBottom = this.inlineStyleInfo.borderBottom;
initElement.input.style.outline = this.inlineStyleInfo.outline;
initElement.input.style.width = this.inlineStyleInfo.width;
initElement.input.style.fontSize = this.inlineStyleInfo.fontSize;
initElement.label.style.position = this.inlineStyleInfo.absolute;
initElement.label.style.color = this.inlineStyleInfo.color;
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInWatchIcon = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
initElement.spanToggle.style.position = this.inlineStyleInfo.absolute;
initElement.spanToggle.style.marginLeft = this.inlineStyleInfo.marginLeft;
initElement.spanToggle.style.cursor = this.inlineStyleInfo.cursor;
initElement.spanToggle.style.top = this.inlineStyleInfo.iconTop;
initElement.spanToggle.style.fontSize = this.inlineStyleInfo.iconFontSize;
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInClockBox = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
initElement.clockBox.style.boxShadow = this.inlineStyleInfo.boxShadow;
initElement.clockBox.style.width = this.inlineStyleInfo.boxWidth;
initElement.clockBox.style.height = this.inlineStyleInfo.boxHeight;
initElement.clockBox.style.justifyContent = this.inlineStyleInfo.justifyContent;
initElement.clockBox.style.alignItems = this.inlineStyleInfo.alignItems;
initElement.clockBox.style.display = this.inlineStyleInfo.boxDisplayNone;
};
/**
* @param {?} initElement
* @param {?} style
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInFocus = /**
* @param {?} initElement
* @param {?} style
* @return {?}
*/
function (initElement, style) {
var _this = this;
initElement.input.addEventListener('focus', (/**
* @return {?}
*/
function () {
_this.floatLabelToTop(initElement, style);
}));
};
/**
* @param {?} initElement
* @param {?} style
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInBlur = /**
* @param {?} initElement
* @param {?} style
* @return {?}
*/
function (initElement, style) {
var _this = this;
initElement.input.addEventListener('blur', (/**
* @return {?}
*/
function () {
_this.checkIfInputContainValue(initElement, style);
}));
};
/**
* @param {?} initElement
* @param {?} style
* @return {?}
*/
AnalogwristwatchDirective.prototype.checkIfInputContainValue = /**
* @param {?} initElement
* @param {?} style
* @return {?}
*/
function (initElement, style) {
initElement.input.value ? this.floatLabelToTop(initElement, style) : this.floatLabelToBottom(initElement, style);
};
/**
* @param {?} elementInfo
* @param {?} style
* @return {?}
*/
AnalogwristwatchDirective.prototype.floatLabelToTop = /**
* @param {?} elementInfo
* @param {?} style
* @return {?}
*/
function (elementInfo, style) {
elementInfo.label.style.top = style.top;
elementInfo.label.style.fontSize = style.labelFontSize;
elementInfo.input.style.borderBottom = style.inputBorderBottom;
elementInfo.label.style.transition = style.transistionTop;
};
/**
* @param {?} elementInfo
* @param {?} style
* @return {?}
*/
AnalogwristwatchDirective.prototype.floatLabelToBottom = /**
* @param {?} elementInfo
* @param {?} style
* @return {?}
*/
function (elementInfo, style) {
elementInfo.label.style.top = style.inherit;
elementInfo.input.style.borderBottom = style.borderBottom;
elementInfo.label.style.fontSize = style.inherit;
};
/**
* @param {?} initElement
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyBoxStyle = /**
* @param {?} initElement
* @return {?}
*/
function (initElement) {
this.renderer.listen(initElement.spanToggle, 'click', (/**
* @return {?}
*/
function () {
initElement.clockBox.classList.toggle('toggle-time');
}));
};
/**
* @param {?} clockBox
* @return {?}
*/
AnalogwristwatchDirective.prototype.addClockElement = /**
* @param {?} clockBox
* @return {?}
*/
function (clockBox) {
/** @type {?} */
var primaryCircle = this.renderer.createElement('div');
/** @type {?} */
var secondaryCircle = this.renderer.createElement('div');
/** @type {?} */
var thirdCircle = this.renderer.createElement('div');
/** @type {?} */
var clockCrown = this.renderer.createElement('div');
/** @type {?} */
var clockSpindle = this.renderer.createElement('div');
this.renderer.addClass(clockCrown, 'clock-crown');
this.renderer.addClass(clockSpindle, 'spindle');
this.renderer.appendChild(clockBox, primaryCircle);
this.renderer.appendChild(clockBox, secondaryCircle);
this.renderer.appendChild(secondaryCircle, thirdCircle);
this.renderer.appendChild(thirdCircle, clockCrown);
this.renderer.appendChild(thirdCircle, clockSpindle);
this.elementInfo.clockCrown = clockCrown;
this.elementInfo.clockSpindle = clockSpindle;
this.applyStyleInClockCircle(primaryCircle, secondaryCircle, thirdCircle);
this.clockService.addClockNumbers(thirdCircle, this.applyStyleInClockNum, this.renderer);
this.drawClockFace(clockBox);
this.addClockHands(thirdCircle);
};
/**
* @param {?} primaryCircle
* @param {?} secondaryCircle
* @param {?} thirdCircle
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInClockCircle = /**
* @param {?} primaryCircle
* @param {?} secondaryCircle
* @param {?} thirdCircle
* @return {?}
*/
function (primaryCircle, secondaryCircle, thirdCircle) {
primaryCircle.style.width = this.inlineStyleInfo.primaryWidth;
primaryCircle.style.height = this.inlineStyleInfo.primaryHeight;
primaryCircle.style.borderRadius = this.inlineStyleInfo.primaryBorderRadius;
primaryCircle.style.border = this.inlineStyleInfo.primaryBorder;
primaryCircle.style.position = this.inlineStyleInfo.relative;
primaryCircle.style.zIndex = '1';
secondaryCircle.style.width = this.inlineStyleInfo.secondaryWidth;
secondaryCircle.style.height = this.inlineStyleInfo.secondaryHeight;
secondaryCircle.style.borderRadius = this.inlineStyleInfo.secondaryBorderRadius;
secondaryCircle.style.border = this.inlineStyleInfo.secondaryBorder;
secondaryCircle.style.position = this.inlineStyleInfo.absolute;
secondaryCircle.style.zIndex = '1';
thirdCircle.style.width = this.inlineStyleInfo.thirdWidth;
thirdCircle.style.height = this.inlineStyleInfo.thirdHeight;
thirdCircle.style.borderRadius = this.inlineStyleInfo.thirdBorderRadius;
thirdCircle.style.border = this.inlineStyleInfo.thirdBorder;
thirdCircle.style.position = this.inlineStyleInfo.absolute;
thirdCircle.style.top = this.inlineStyleInfo.thirdTop;
};
/**
* @param {?} clockNum
* @param {?} num
* @param {?} style
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInClockNum = /**
* @param {?} clockNum
* @param {?} num
* @param {?} style
* @return {?}
*/
function (clockNum, num, style) {
clockNum.style.position = style.absolute;
clockNum.style.left = style.clockNum[num].left;
clockNum.style.top = style.clockNum[num].top;
};
/**
* @param {?} clockBox
* @return {?}
*/
AnalogwristwatchDirective.prototype.drawClockFace = /**
* @param {?} clockBox
* @return {?}
*/
function (clockBox) {
/** @type {?} */
var wrapper = this.renderer.createElement('div');
this.renderer.appendChild(clockBox, wrapper);
/** @type {?} */
var dugHole = this.clockService.createDugHoles(wrapper, this.renderer);
/** @type {?} */
var strap = this.clockService.createWatchStraps(wrapper, this.renderer);
this.applyStyleInDugHoles(dugHole);
this.applyStyleInWatchStraps(strap);
};
/**
* @param {?} dugHole
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInDugHoles = /**
* @param {?} dugHole
* @return {?}
*/
function (dugHole) {
dugHole.topLeftDugHole.style.position = this.inlineStyleInfo.absolute;
dugHole.topLeftDugHole.style.width = this.inlineStyleInfo.wrapWidth;
dugHole.topLeftDugHole.style.borderBottom = this.inlineStyleInfo.wrapBorderBottom;
dugHole.topLeftDugHole.style.borderLeft = this.inlineStyleInfo.wrapBorderLeft;
dugHole.topLeftDugHole.style.top = this.inlineStyleInfo.wrapTop;
dugHole.topLeftDugHole.style.left = this.inlineStyleInfo.wrapLeft;
dugHole.topLeftDugHole.style.borderBottomRightRadius = this.inlineStyleInfo.rightBorderRightRadius;
this.renderer.addClass(dugHole.topLeftDugHole, 'top-left-dughole');
this.renderer.addClass(dugHole.topRightDugHole, 'top-right-dughole');
this.renderer.addClass(dugHole.bottomLeftDugHole, 'bottom-left-dughole');
this.renderer.addClass(dugHole.bottomRightDugHole, 'bottom-right-dughole');
dugHole.topRightDugHole.style.position = this.inlineStyleInfo.absolute;
dugHole.topRightDugHole.style.width = this.inlineStyleInfo.rightWrapWidth;
dugHole.topRightDugHole.style.borderBottom = this.inlineStyleInfo.rightWrapBorderBottom;
dugHole.topRightDugHole.style.borderRight = this.inlineStyleInfo.rightWrapBorderright;
dugHole.topRightDugHole.style.top = this.inlineStyleInfo.rightWrapTop;
dugHole.topRightDugHole.style.left = this.inlineStyleInfo.rightWrapLeft;
dugHole.topRightDugHole.style.margin = this.inlineStyleInfo.rightWrapMargin;
dugHole.topRightDugHole.style.borderBottomLeftRadius = this.inlineStyleInfo.rightBorderLeftRadius;
/** @type {?} */
var styleTag = this.renderer.createElement('style');
/** @type {?} */
var cssText = this.renderer.createText(this.internalStyle);
this.renderer.appendChild(styleTag, cssText);
this.renderer.appendChild(document.head, styleTag);
};
/**
* @param {?} strap
* @return {?}
*/
AnalogwristwatchDirective.prototype.applyStyleInWatchStraps = /**
* @param {?} strap
* @return {?}
*/
function (strap) {
/** @type {?} */
var pos = 0;
for (var index = 0; pos < strap['className' + index].length; index++) {
/** @type {?} */
var size = strap['className' + index].length;
if (size === 2) {
this.renderer.addClass(strap['elementName' + index], strap['className' + index][index - index]);
this.renderer.addClass(strap['elementName' + index], strap['className' + index][index - (index - 1)]);
continue;
}
else {
this.renderer.addClass(strap['elementName' + index], strap['className' + index][index - index]);
if (index === 17) {
break;
}
}
}
};
/**
* @param {?} thirdCircle
* @return {?}
*/
AnalogwristwatchDirective.prototype.addClockHands = /**
* @param {?} thirdCircle
* @return {?}
*/
function (thirdCircle) {
/** @type {?} */
var axisCircle = this.renderer.createElement('span');
/** @type {?} */
var dotPuncture = this.renderer.createElement('i');
this.renderer.addClass(axisCircle, 'axis-circle');
this.renderer.addClass(dotPuncture, 'dot-puncture');
this.renderer.appendChild(axisCircle, dotPuncture);
/** @type {?} */
var hourHand = this.renderer.createElement('div');
this.renderer.addClass(hourHand, 'hour-hand');
this.renderer.addClass(hourHand, 'hour');
/** @type {?} */
var hourHandRound = this.renderer.createElement('span');
/** @type {?} */
var hourHandArrow = this.renderer.createElement('span');
this.renderer.addClass(hourHandRound, 'hour-hand-round');
this.renderer.addClass(hourHandArrow, 'hour-hand-arrow');
this.renderer.appendChild(hourHand, hourHandRound);
this.renderer.appendChild(hourHand, hourHandArrow);
/** @type {?} */
var secondHand = this.renderer.createElement('div');
this.renderer.addClass(secondHand, 'second-hand');
this.renderer.addClass(secondHand, 'hand');
/** @type {?} */
var minuteHand = this.renderer.createElement('div');
this.renderer.addClass(minuteHand, 'minute-hand');
this.renderer.addClass(minuteHand, 'hour');
this.renderer.appendChild(thirdCircle, axisCircle);
this.renderer.appendChild(thirdCircle, hourHand);
this.renderer.appendChild(thirdCircle, secondHand);
this.renderer.appendChild(thirdCircle, minuteHand);
this.elementInfo.hourHand = hourHand;
this.elementInfo.secondHand = secondHand;
this.elementInfo.minuteHand = minuteHand;
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.startClock = /**
* @return {?}
*/
function () {
/** @type {?} */
var date = new Date();
/** @type {?} */
var seconds = date.getSeconds();
/** @type {?} */
var secondDegrees = ((seconds / 60) * 360) + 90;
this.elementInfo.secondHand.style.transform = "rotate(" + secondDegrees + "deg)";
/** @type {?} */
var minutes = date.getMinutes();
/** @type {?} */
var minuteDegrees = ((minutes / 60) * 360) + 360;
this.elementInfo.minuteHand.style.transform = "rotate(" + minuteDegrees + "deg)";
/** @type {?} */
var hours = date.getHours();
/** @type {?} */
var hourDegrees = hours * 360 / 12 + ((minutes * 360 / 60) / 12);
this.elementInfo.hourHand.style.transform = "rotate(" + hourDegrees + "deg)";
return {
hour: hours,
minute: minutes,
hourDegree: hourDegrees,
minuteDegree: minuteDegrees,
};
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.onWatchBtnClick = /**
* @return {?}
*/
function () {
var _this = this;
this.renderer.listen(this.elementInfo.clockCrown, 'click', (/**
* @return {?}
*/
function () {
/** @type {?} */
var merdian = _this.timeInfo.hour <= 12 || _this.timeInfo.hour === 24 ? 'am' : ' pm ';
_this.renderer.setProperty(_this.elementInfo.input, 'value', _this.timeInfo.hour + ":" + _this.timeInfo.minute + merdian);
_this.checkIfInputContainValue(_this.elementInfo, _this.inlineStyleInfo);
_this.renderer.removeClass(_this.elementInfo.clockBox, 'toggle-time');
_this.clockValue = _this.elementInfo.input.value;
_this.getClockValue();
}));
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.onChangeHourTimeClick = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var nextMove = 0;
this.renderer.listen(this.elementInfo.hourHand, 'click', (/**
* @return {?}
*/
function () {
/** @type {?} */
var date = new Date();
clearInterval(_this.runClock);
nextMove++;
date.setHours(_this.timeInfo.hour, _this.timeInfo.minute + nextMove);
/** @type {?} */
var minutes = date.getMinutes();
/** @type {?} */
var minuteDegrees = ((minutes / 60) * 360) + 360;
_this.elementInfo.minuteHand.style.transform = "rotate(" + minuteDegrees + "deg)";
/** @type {?} */
var hourDegrees = date.getHours() * 360 / 12 + ((date.getMinutes() * 360 / 60) / 12);
_this.elementInfo.hourHand.style.transform = "rotate(" + hourDegrees + "deg)";
/** @type {?} */
var merdian = date.getHours() <= 12 || date.getHours() === 24 ? 'am' : ' pm ';
_this.renderer.setProperty(_this.elementInfo.input, 'value', date.getHours() + ":" + minutes + merdian);
_this.checkIfInputContainValue(_this.elementInfo, _this.inlineStyleInfo);
/** @type {?} */
var changeTimeInfo = {
hour: date.getHours(),
minute: date.getMinutes(),
hourDegree: hourDegrees,
minuteDegree: minuteDegrees,
};
_this.timeInfo = changeTimeInfo;
_this.refreshClock();
}));
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.refreshClock = /**
* @return {?}
*/
function () {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
setInterval((/**
* @return {?}
*/
function () {
_this.timeInfo = _this.startClock();
}), 1000);
}), 40000);
};
/**
* @return {?}
*/
AnalogwristwatchDirective.prototype.getClockValue = /**
* @return {?}
*/
function () {
this.timeVal.emit(this.clockValue);
};
AnalogwristwatchDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxWristAnalogwristwatch]'
},] }
];
/** @nocollapse */
AnalogwristwatchDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: NgxAnalogWristWatchService }
]; };
AnalogwristwatchDirective.propDecorators = {
timeVal: [{ type: Output }]
};
return AnalogwristwatchDirective;
}());
export { AnalogwristwatchDirective };
if (false) {
/** @type {?} */
AnalogwristwatchDirective.prototype.timeVal;
/** @type {?} */
AnalogwristwatchDirective.prototype.internalStyle;
/** @type {?} */
AnalogwristwatchDirective.prototype.inlineStyleInfo;
/** @type {?} */
AnalogwristwatchDirective.prototype.elementInfo;
/** @type {?} */
AnalogwristwatchDirective.prototype.timeInfo;
/** @type {?} */
AnalogwristwatchDirective.prototype.runClock;
/** @type {?} */
AnalogwristwatchDirective.prototype.clockValue;
/**
* @type {?}
* @private
*/
AnalogwristwatchDirective.prototype.el;
/**
* @type {?}
* @private
*/
AnalogwristwatchDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
AnalogwristwatchDirective.prototype.clockService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbG9nd3Jpc3R3YXRjaC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW5hbG9nLXdyaXN0LXdhdGNoLyIsInNvdXJjZXMiOlsibGliL2FuYWxvZ3dyaXN0d2F0Y2guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDOUU7SUF3QkUsbUNBQW9CLEVBQWMsRUFBVSxRQUFtQixFQUFVLFlBQXdDO1FBQTdGLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQTRCO1FBcEJ2RyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUcvQyxnQkFBVyxHQUFRO1lBQ2pCLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSTtZQUNkLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUtELENBQUM7Ozs7SUFHRCw0Q0FBUTs7O0lBQVI7UUFDQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7O0lBR0QscURBQWlCOzs7SUFBakI7O1lBQ1EsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQzs7WUFDNUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7WUFDdkMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQzs7WUFDNUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQzs7WUFDN0MsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQzs7WUFDMUMsWUFBWSxHQUFHLFFBQVc7O1lBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFDbkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQzs7OztJQUVELGdEQUFZOzs7SUFBWjtRQUNFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDOzs7O0lBRUQsK0NBQVc7OztJQUFYO1FBQUEsaUJBUUM7UUFQQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXOzs7UUFBQzs7Z0JBQ3BCLFFBQVEsR0FBRyxLQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xDLEtBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzNCLENBQUMsR0FBRSxJQUFJLENBQUMsQ0FBQztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDOzs7OztJQUVELG1EQUFlOzs7O0lBQWYsVUFBZ0IsV0FBVzs7WUFDbkIsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYTtRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdELENBQUM7Ozs7O0lBRUQsb0RBQWdCOzs7O0lBQWhCLFVBQWlCLFdBQVc7UUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDOzs7OztJQUdELDREQUF3Qjs7OztJQUF4QixVQUF5QixXQUFXO1FBQ2xDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPO1lBQ2xFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZO1lBQzVFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTO1lBQ3RFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPO1lBQ2xFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQ3BFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO1lBQzlELFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUMvRCxDQUFDOzs7OztJQUVELGdFQUE0Qjs7OztJQUE1QixVQUE2QixXQUFXO1FBQ3RDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztRQUN6RSxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7UUFDL0QsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQzNELFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUNqRSxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDakUsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQzdELENBQUM7Ozs7O0lBRUQseURBQXFCOzs7O0lBQXJCLFVBQXNCLFdBQVc7UUFDL0IsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1FBQ3RFLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztRQUMxRSxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDbEUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQ2hFLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztJQUM1RSxDQUFDOzs7OztJQUVELHdEQUFvQjs7OztJQUFwQixVQUFxQixXQUFXO1FBQzlCLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztRQUN0RSxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDakUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQ25FLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQztRQUNoRixXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7UUFDeEUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO0lBQzNFLENBQUM7Ozs7OztJQUVELHFEQUFpQjs7Ozs7SUFBakIsVUFBa0IsV0FBVyxFQUFFLEtBQUs7UUFBcEMsaUJBSUM7UUFIQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU87OztRQUFFO1lBQzFDLEtBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRUQsb0RBQWdCOzs7OztJQUFoQixVQUFpQixXQUFXLEVBQUUsS0FBSztRQUFuQyxpQkFJQztRQUhDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTTs7O1FBQUU7WUFDekMsS0FBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7OztJQUVELDREQUF3Qjs7Ozs7SUFBeEIsVUFBeUIsV0FBVyxFQUFFLEtBQUs7UUFDekMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ILENBQUM7Ozs7OztJQUVELG1EQUFlOzs7OztJQUFmLFVBQWdCLFdBQVcsRUFBRSxLQUFLO1FBQ2hDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3ZELFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDL0QsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7SUFDNUQsQ0FBQzs7Ozs7O0lBRUQsc0RBQWtCOzs7OztJQUFsQixVQUFtQixXQUFXLEVBQUUsS0FBSztRQUNuQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM1QyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUMxRCxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUNuRCxDQUFDOzs7OztJQUVELGlEQUFhOzs7O0lBQWIsVUFBYyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsT0FBTzs7O1FBQUU7WUFDcEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxtREFBZTs7OztJQUFmLFVBQWdCLFFBQVE7O1lBQ2hCLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7O1lBQ2xELGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7O1lBQ3BELFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7O1lBQ2hELFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7O1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Ozs7Ozs7SUFHRCwyREFBdUI7Ozs7OztJQUF2QixVQUF3QixhQUFhLEVBQUUsZUFBZSxFQUFFLFdBQVc7UUFDakUsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7UUFDOUQsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDaEUsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQztRQUM1RSxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUNoRSxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUM3RCxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFFakMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7UUFDbEUsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7UUFDcEUsZUFBZSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQztRQUNoRixlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztRQUNwRSxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUMvRCxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFHbkMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7UUFDMUQsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUM7UUFDNUQsV0FBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQztRQUN4RSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztRQUM1RCxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUMzRCxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztJQUN4RCxDQUFDOzs7Ozs7O0lBR0Qsd0RBQW9COzs7Ozs7SUFBcEIsVUFBcUIsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLO1FBQ3ZDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDekMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDL0MsQ0FBQzs7Ozs7SUFFRCxpREFBYTs7OztJQUFiLFVBQWMsUUFBUTs7WUFDZCxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7WUFDdkMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDOztZQUNsRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7O0lBRUQsd0RBQW9COzs7O0lBQXBCLFVBQXFCLE9BQU87UUFDMUIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztRQUNwRSxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNsRixPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7UUFDOUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQ2hFLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUNsRSxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDO1FBRW5HLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFHM0UsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQztRQUMxRSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RixPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQztRQUN0RixPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7UUFDdEUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztRQUM1RSxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDOztZQUU1RixRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDOztZQUMvQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDOzs7OztJQUVELDJEQUF1Qjs7OztJQUF2QixVQUF3QixLQUFLOztZQUNyQixHQUFHLEdBQUcsQ0FBQztRQUNiLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTs7Z0JBQzlELElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07WUFDOUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDaEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RHLFNBQVM7YUFDVjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2hHLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtvQkFBRSxNQUFNO2lCQUFFO2FBQzdCO1NBQ0Y7SUFDSCxDQUFDOzs7OztJQUdELGlEQUFhOzs7O0lBQWIsVUFBYyxXQUFXOztZQUNqQixVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDOztZQUNoRCxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDOztZQUM3QyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7O1lBQ25DLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7O1lBQ25ELGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQzs7WUFDN0MsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDOztZQUNyQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQzNDLENBQUM7Ozs7SUFHRCw4Q0FBVTs7O0lBQVY7O1lBQ1EsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFOztZQUNqQixPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTs7WUFDM0IsYUFBYSxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRTtRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFlBQVUsYUFBYSxTQUFNLENBQUM7O1lBRXRFLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFOztZQUMzQixhQUFhLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHO1FBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBVSxhQUFhLFNBQU0sQ0FBQzs7WUFFdEUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7O1lBQ3ZCLFdBQVcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFVLFdBQVcsU0FBTSxDQUFDO1FBRXhFLE9BQU87WUFDTCxJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxPQUFPO1lBQ2YsVUFBVSxFQUFFLFdBQVc7WUFDdkIsWUFBWSxFQUFFLGFBQWE7U0FDNUIsQ0FBQztJQUNKLENBQUM7Ozs7SUFHRCxtREFBZTs7O0lBQWY7UUFBQSxpQkFTQztRQVJDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE9BQU87OztRQUFFOztnQkFDbkQsT0FBTyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUNyRixLQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUssS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsT0FBUyxDQUFDLENBQUM7WUFDdEgsS0FBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RFLEtBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3BFLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9DLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCx5REFBcUI7OztJQUFyQjtRQUFBLGlCQTRCQzs7WUEzQkssUUFBUSxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTzs7O1FBQUU7O2dCQUNqRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdkIsYUFBYSxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU3QixRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7O2dCQUM3RCxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTs7Z0JBQzNCLGFBQWEsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7WUFFbEQsS0FBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFVLGFBQWEsU0FBTSxDQUFDOztnQkFDdEUsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0RixLQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFlBQVUsV0FBVyxTQUFNLENBQUM7O2dCQUVsRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDL0UsS0FBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBSSxPQUFPLEdBQUcsT0FBUyxDQUFDLENBQUM7WUFDdEcsS0FBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFFaEUsY0FBYyxHQUFHO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3pCLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixZQUFZLEVBQUUsYUFBYTthQUM1QjtZQUNELEtBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1lBQy9CLEtBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCxnREFBWTs7O0lBQVo7UUFBQSxpQkFNRTtRQUxBLFVBQVU7OztRQUFFO1lBQ1YsV0FBVzs7O1lBQUM7Z0JBQ1YsS0FBSSxDQUFDLFFBQVEsR0FBRyxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsQ0FBQyxHQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxHQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1gsQ0FBQzs7OztJQUVGLGlEQUFhOzs7SUFBYjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDOztnQkF4WEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSw0QkFBNEI7aUJBQ3ZDOzs7O2dCQUptQixVQUFVO2dCQUFFLFNBQVM7Z0JBQ2hDLDBCQUEwQjs7OzBCQUtoQyxNQUFNOztJQXFYVCxnQ0FBQztDQUFBLEFBelhELElBeVhDO1NBdFhZLHlCQUF5Qjs7O0lBQ3BDLDRDQUErQzs7SUFDL0Msa0RBQWM7O0lBQ2Qsb0RBQWdCOztJQUNoQixnREFhRTs7SUFDRiw2Q0FBUzs7SUFDVCw2Q0FBUzs7SUFDVCwrQ0FBVzs7Ozs7SUFDQyx1Q0FBc0I7Ozs7O0lBQUUsNkNBQTJCOzs7OztJQUFFLGlEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neEFuYWxvZ1dyaXN0V2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtYW5hbG9nLXdyaXN0LXdhdGNoLnNlcnZpY2UnO1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neFdyaXN0QW5hbG9nd3Jpc3R3YXRjaF0nXG59KVxuZXhwb3J0IGNsYXNzIEFuYWxvZ3dyaXN0d2F0Y2hEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBAT3V0cHV0KCkgdGltZVZhbCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBpbnRlcm5hbFN0eWxlO1xuICBpbmxpbmVTdHlsZUluZm87XG4gIGVsZW1lbnRJbmZvOiBhbnkgPSB7XG4gICAgaW5wdXQ6IG51bGwsXG4gICAgY2xvY2tCb3g6IG51bGwsXG4gICAgc3BhblRvZ2dsZTogbnVsbCxcbiAgICB3YXRjaEljb246IG51bGwsXG4gICAgbGFiZWw6IG51bGwsXG4gICAgbGFiZWxUZXh0OiBudWxsLFxuICAgIGhvdXJIYW5kOiBudWxsLFxuICAgIG1pbnV0ZUhhbmQ6IG51bGwsXG4gICAgc2Vjb25kSGFuZDogbnVsbCxcbiAgICBjbG9ja0Nyb3duOiBudWxsLFxuICAgIGNsb2NrU3BpbmRsZTogbnVsbCxcbiAgICBjbG9ja051bTogbnVsbCxcbiAgfTtcbiAgdGltZUluZm87XG4gIHJ1bkNsb2NrO1xuICBjbG9ja1ZhbHVlO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgY2xvY2tTZXJ2aWNlOiBOZ3hBbmFsb2dXcmlzdFdhdGNoU2VydmljZSkge1xuICAgfVxuXG5cbiAgIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY3JlYXRlSW5pdEVsZW1lbnQoKTtcbiAgICB0aGlzLnN0eWxlc0luSW5pdCgpO1xuICAgIHRoaXMuY2hlY2tJZklucHV0Q29udGFpblZhbHVlKHRoaXMuZWxlbWVudEluZm8sIHRoaXMuaW5saW5lU3R5bGVJbmZvKTtcbiAgICB0aGlzLndhdGNoUnVubmVyKCk7XG4gIH1cblxuXG4gIGNyZWF0ZUluaXRFbGVtZW50KCkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoJ1RpbWUnKTtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjb25zdCBjbG9ja0JveCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3Qgc3BhbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGNvbnN0IHVuaWNvZGVDbG9jayA9IGBcXHV7MDIzMUF9YDtcbiAgICBjb25zdCBpY29uID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHVuaWNvZGVDbG9jayk7XG4gICAgdGhpcy5lbGVtZW50SW5mby5pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMuZWxlbWVudEluZm8uY2xvY2tCb3ggPSBjbG9ja0JveDtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLnNwYW5Ub2dnbGUgPSBzcGFuO1xuICAgIHRoaXMuZWxlbWVudEluZm8ud2F0Y2hJY29uID0gaWNvbjtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLmxhYmVsID0gbGFiZWw7XG4gICAgdGhpcy5lbGVtZW50SW5mby5sYWJlbFRleHQgPSB0ZXh0O1xuICB9XG5cbiAgc3R5bGVzSW5Jbml0KCkge1xuICAgIHRoaXMuaW50ZXJuYWxTdHlsZSA9IHRoaXMuY2xvY2tTZXJ2aWNlLmZldGNoSW50ZXJuYWxTdHlsZSgpO1xuICAgIHRoaXMuaW5saW5lU3R5bGVJbmZvID0gdGhpcy5jbG9ja1NlcnZpY2UuZmV0Y2hJbkxpbmVTdHlsZSgpO1xuICAgIHRoaXMuYXBwZW5kVGFnSW5Jbml0KHRoaXMuZWxlbWVudEluZm8pO1xuICAgIHRoaXMuYXBwbHlTdHlsZUluSW5pdCh0aGlzLmVsZW1lbnRJbmZvKTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkZvY3VzKHRoaXMuZWxlbWVudEluZm8sIHRoaXMuaW5saW5lU3R5bGVJbmZvKTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkJsdXIodGhpcy5lbGVtZW50SW5mbywgdGhpcy5pbmxpbmVTdHlsZUluZm8pO1xuICAgIHRoaXMuYXBwbHlCb3hTdHlsZSh0aGlzLmVsZW1lbnRJbmZvKTtcbiAgfVxuXG4gIHdhdGNoUnVubmVyKCkge1xuICAgIHRoaXMuYWRkQ2xvY2tFbGVtZW50KHRoaXMuZWxlbWVudEluZm8uY2xvY2tCb3gpO1xuICAgIHRoaXMucnVuQ2xvY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lSW5mbyA9IHRoaXMuc3RhcnRDbG9jaygpO1xuICAgICAgdGhpcy50aW1lSW5mbyA9IHRpbWVJbmZvO1xuICAgIH0sIDEwMDApO1xuICAgIHRoaXMub25XYXRjaEJ0bkNsaWNrKCk7XG4gICAgdGhpcy5vbkNoYW5nZUhvdXJUaW1lQ2xpY2soKTtcbiAgfVxuXG4gIGFwcGVuZFRhZ0luSW5pdChpbml0RWxlbWVudCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShpbml0RWxlbWVudC5pbnB1dCwgJ3R5cGUnLCAndGV4dCcpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5pdEVsZW1lbnQubGFiZWwsIGluaXRFbGVtZW50LmxhYmVsVGV4dCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbml0RWxlbWVudC5zcGFuVG9nZ2xlLCBpbml0RWxlbWVudC53YXRjaEljb24pO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBpbml0RWxlbWVudC5sYWJlbCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGluaXRFbGVtZW50LmlucHV0KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgaW5pdEVsZW1lbnQuc3BhblRvZ2dsZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGluaXRFbGVtZW50LmNsb2NrQm94KTtcbiAgfVxuXG4gIGFwcGx5U3R5bGVJbkluaXQoaW5pdEVsZW1lbnQpIHtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkRpdkRpcmVjdGl2ZShpbml0RWxlbWVudCk7XG4gICAgdGhpcy5hcHBseVN0eWxlSW5JbnB1dEFuZExhYmVsVGFnKGluaXRFbGVtZW50KTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbklucHV0QW5kTGFiZWxUYWcoaW5pdEVsZW1lbnQpO1xuICAgIHRoaXMuYXBwbHlTdHlsZUluV2F0Y2hJY29uKGluaXRFbGVtZW50KTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkNsb2NrQm94KGluaXRFbGVtZW50KTtcbiAgfVxuXG5cbiAgYXBwbHlTdHlsZUluRGl2RGlyZWN0aXZlKGluaXRFbGVtZW50KSB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmlubGluZVN0eWxlSW5mby5kaXNwbGF5LFxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSB0aGlzLmlubGluZVN0eWxlSW5mby5tYXJnaW5ib3R0b20sXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLm1hcmdpbnRvcCxcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucGFkZGluZyA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnBhZGRpbmcsXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmVsYXRpdmUsXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmZsb2F0ID0gdGhpcy5pbmxpbmVTdHlsZUluZm8uZmxvYXQsXG4gICAgaW5pdEVsZW1lbnQuaW5wdXQuc3R5bGUuYm9yZGVyID0gdGhpcy5pbmxpbmVTdHlsZUluZm8uYm9yZGVyO1xuICB9XG5cbiAgYXBwbHlTdHlsZUluSW5wdXRBbmRMYWJlbFRhZyhpbml0RWxlbWVudCkge1xuICAgIGluaXRFbGVtZW50LmlucHV0LnN0eWxlLmJvcmRlckJvdHRvbSA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmJvcmRlckJvdHRvbTtcbiAgICBpbml0RWxlbWVudC5pbnB1dC5zdHlsZS5vdXRsaW5lID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ub3V0bGluZTtcbiAgICBpbml0RWxlbWVudC5pbnB1dC5zdHlsZS53aWR0aCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLndpZHRoO1xuICAgIGluaXRFbGVtZW50LmlucHV0LnN0eWxlLmZvbnRTaXplID0gdGhpcy5pbmxpbmVTdHlsZUluZm8uZm9udFNpemU7XG4gICAgaW5pdEVsZW1lbnQubGFiZWwuc3R5bGUucG9zaXRpb24gPSB0aGlzLmlubGluZVN0eWxlSW5mby5hYnNvbHV0ZTtcbiAgICBpbml0RWxlbWVudC5sYWJlbC5zdHlsZS5jb2xvciA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmNvbG9yO1xuICB9XG5cbiAgYXBwbHlTdHlsZUluV2F0Y2hJY29uKGluaXRFbGVtZW50KSB7XG4gICAgaW5pdEVsZW1lbnQuc3BhblRvZ2dsZS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmFic29sdXRlO1xuICAgIGluaXRFbGVtZW50LnNwYW5Ub2dnbGUuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLm1hcmdpbkxlZnQ7XG4gICAgaW5pdEVsZW1lbnQuc3BhblRvZ2dsZS5zdHlsZS5jdXJzb3IgPSB0aGlzLmlubGluZVN0eWxlSW5mby5jdXJzb3I7XG4gICAgaW5pdEVsZW1lbnQuc3BhblRvZ2dsZS5zdHlsZS50b3AgPSB0aGlzLmlubGluZVN0eWxlSW5mby5pY29uVG9wO1xuICAgIGluaXRFbGVtZW50LnNwYW5Ub2dnbGUuc3R5bGUuZm9udFNpemUgPSB0aGlzLmlubGluZVN0eWxlSW5mby5pY29uRm9udFNpemU7XG4gIH1cblxuICBhcHBseVN0eWxlSW5DbG9ja0JveChpbml0RWxlbWVudCkge1xuICAgIGluaXRFbGVtZW50LmNsb2NrQm94LnN0eWxlLmJveFNoYWRvdyA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmJveFNoYWRvdztcbiAgICBpbml0RWxlbWVudC5jbG9ja0JveC5zdHlsZS53aWR0aCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmJveFdpZHRoO1xuICAgIGluaXRFbGVtZW50LmNsb2NrQm94LnN0eWxlLmhlaWdodCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmJveEhlaWdodDtcbiAgICBpbml0RWxlbWVudC5jbG9ja0JveC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmp1c3RpZnlDb250ZW50O1xuICAgIGluaXRFbGVtZW50LmNsb2NrQm94LnN0eWxlLmFsaWduSXRlbXMgPSB0aGlzLmlubGluZVN0eWxlSW5mby5hbGlnbkl0ZW1zO1xuICAgIGluaXRFbGVtZW50LmNsb2NrQm94LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmlubGluZVN0eWxlSW5mby5ib3hEaXNwbGF5Tm9uZTtcbiAgfVxuXG4gIGFwcGx5U3R5bGVJbkZvY3VzKGluaXRFbGVtZW50LCBzdHlsZSkge1xuICAgIGluaXRFbGVtZW50LmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgdGhpcy5mbG9hdExhYmVsVG9Ub3AoaW5pdEVsZW1lbnQsIHN0eWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGx5U3R5bGVJbkJsdXIoaW5pdEVsZW1lbnQsIHN0eWxlKSB7XG4gICAgaW5pdEVsZW1lbnQuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tJZklucHV0Q29udGFpblZhbHVlKGluaXRFbGVtZW50LCBzdHlsZSk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja0lmSW5wdXRDb250YWluVmFsdWUoaW5pdEVsZW1lbnQsIHN0eWxlKSB7XG4gICAgaW5pdEVsZW1lbnQuaW5wdXQudmFsdWUgPyB0aGlzLmZsb2F0TGFiZWxUb1RvcChpbml0RWxlbWVudCwgc3R5bGUpIDogdGhpcy5mbG9hdExhYmVsVG9Cb3R0b20oaW5pdEVsZW1lbnQsIHN0eWxlKTtcbiAgfVxuXG4gIGZsb2F0TGFiZWxUb1RvcChlbGVtZW50SW5mbywgc3R5bGUpIHtcbiAgICBlbGVtZW50SW5mby5sYWJlbC5zdHlsZS50b3AgPSBzdHlsZS50b3A7XG4gICAgZWxlbWVudEluZm8ubGFiZWwuc3R5bGUuZm9udFNpemUgPSBzdHlsZS5sYWJlbEZvbnRTaXplO1xuICAgIGVsZW1lbnRJbmZvLmlucHV0LnN0eWxlLmJvcmRlckJvdHRvbSA9IHN0eWxlLmlucHV0Qm9yZGVyQm90dG9tO1xuICAgIGVsZW1lbnRJbmZvLmxhYmVsLnN0eWxlLnRyYW5zaXRpb24gPSBzdHlsZS50cmFuc2lzdGlvblRvcDtcbiAgfVxuXG4gIGZsb2F0TGFiZWxUb0JvdHRvbShlbGVtZW50SW5mbywgc3R5bGUpIHtcbiAgICBlbGVtZW50SW5mby5sYWJlbC5zdHlsZS50b3AgPSBzdHlsZS5pbmhlcml0O1xuICAgIGVsZW1lbnRJbmZvLmlucHV0LnN0eWxlLmJvcmRlckJvdHRvbSA9IHN0eWxlLmJvcmRlckJvdHRvbTtcbiAgICBlbGVtZW50SW5mby5sYWJlbC5zdHlsZS5mb250U2l6ZSA9IHN0eWxlLmluaGVyaXQ7XG4gIH1cblxuICBhcHBseUJveFN0eWxlKGluaXRFbGVtZW50KSB7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oaW5pdEVsZW1lbnQuc3BhblRvZ2dsZSwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaW5pdEVsZW1lbnQuY2xvY2tCb3guY2xhc3NMaXN0LnRvZ2dsZSgndG9nZ2xlLXRpbWUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZENsb2NrRWxlbWVudChjbG9ja0JveCkge1xuICAgIGNvbnN0IHByaW1hcnlDaXJjbGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IHNlY29uZGFyeUNpcmNsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgdGhpcmRDaXJjbGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNsb2NrQ3Jvd24gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNsb2NrU3BpbmRsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjbG9ja0Nyb3duLCAnY2xvY2stY3Jvd24nKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNsb2NrU3BpbmRsZSwgJ3NwaW5kbGUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNsb2NrQm94LCBwcmltYXJ5Q2lyY2xlKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNsb2NrQm94LCBzZWNvbmRhcnlDaXJjbGUpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc2Vjb25kYXJ5Q2lyY2xlLCB0aGlyZENpcmNsZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlyZENpcmNsZSwgY2xvY2tDcm93bik7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlyZENpcmNsZSwgY2xvY2tTcGluZGxlKTtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLmNsb2NrQ3Jvd24gPSBjbG9ja0Nyb3duO1xuICAgIHRoaXMuZWxlbWVudEluZm8uY2xvY2tTcGluZGxlID0gY2xvY2tTcGluZGxlO1xuICAgIHRoaXMuYXBwbHlTdHlsZUluQ2xvY2tDaXJjbGUocHJpbWFyeUNpcmNsZSwgc2Vjb25kYXJ5Q2lyY2xlLCB0aGlyZENpcmNsZSk7XG4gICAgdGhpcy5jbG9ja1NlcnZpY2UuYWRkQ2xvY2tOdW1iZXJzKHRoaXJkQ2lyY2xlLCB0aGlzLmFwcGx5U3R5bGVJbkNsb2NrTnVtLCB0aGlzLnJlbmRlcmVyKTtcbiAgICB0aGlzLmRyYXdDbG9ja0ZhY2UoY2xvY2tCb3gpO1xuICAgIHRoaXMuYWRkQ2xvY2tIYW5kcyh0aGlyZENpcmNsZSk7XG4gIH1cblxuXG4gIGFwcGx5U3R5bGVJbkNsb2NrQ2lyY2xlKHByaW1hcnlDaXJjbGUsIHNlY29uZGFyeUNpcmNsZSwgdGhpcmRDaXJjbGUpIHtcbiAgICBwcmltYXJ5Q2lyY2xlLnN0eWxlLndpZHRoID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucHJpbWFyeVdpZHRoO1xuICAgIHByaW1hcnlDaXJjbGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucHJpbWFyeUhlaWdodDtcbiAgICBwcmltYXJ5Q2lyY2xlLnN0eWxlLmJvcmRlclJhZGl1cyA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnByaW1hcnlCb3JkZXJSYWRpdXM7XG4gICAgcHJpbWFyeUNpcmNsZS5zdHlsZS5ib3JkZXIgPSB0aGlzLmlubGluZVN0eWxlSW5mby5wcmltYXJ5Qm9yZGVyO1xuICAgIHByaW1hcnlDaXJjbGUuc3R5bGUucG9zaXRpb24gPSB0aGlzLmlubGluZVN0eWxlSW5mby5yZWxhdGl2ZTtcbiAgICBwcmltYXJ5Q2lyY2xlLnN0eWxlLnpJbmRleCA9ICcxJztcblxuICAgIHNlY29uZGFyeUNpcmNsZS5zdHlsZS53aWR0aCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnNlY29uZGFyeVdpZHRoO1xuICAgIHNlY29uZGFyeUNpcmNsZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmlubGluZVN0eWxlSW5mby5zZWNvbmRhcnlIZWlnaHQ7XG4gICAgc2Vjb25kYXJ5Q2lyY2xlLnN0eWxlLmJvcmRlclJhZGl1cyA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnNlY29uZGFyeUJvcmRlclJhZGl1cztcbiAgICBzZWNvbmRhcnlDaXJjbGUuc3R5bGUuYm9yZGVyID0gdGhpcy5pbmxpbmVTdHlsZUluZm8uc2Vjb25kYXJ5Qm9yZGVyO1xuICAgIHNlY29uZGFyeUNpcmNsZS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmFic29sdXRlO1xuICAgIHNlY29uZGFyeUNpcmNsZS5zdHlsZS56SW5kZXggPSAnMSc7XG5cblxuICAgIHRoaXJkQ2lyY2xlLnN0eWxlLndpZHRoID0gdGhpcy5pbmxpbmVTdHlsZUluZm8udGhpcmRXaWR0aDtcbiAgICB0aGlyZENpcmNsZS5zdHlsZS5oZWlnaHQgPSB0aGlzLmlubGluZVN0eWxlSW5mby50aGlyZEhlaWdodDtcbiAgICB0aGlyZENpcmNsZS5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0aGlzLmlubGluZVN0eWxlSW5mby50aGlyZEJvcmRlclJhZGl1cztcbiAgICB0aGlyZENpcmNsZS5zdHlsZS5ib3JkZXIgPSB0aGlzLmlubGluZVN0eWxlSW5mby50aGlyZEJvcmRlcjtcbiAgICB0aGlyZENpcmNsZS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmFic29sdXRlO1xuICAgIHRoaXJkQ2lyY2xlLnN0eWxlLnRvcCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnRoaXJkVG9wO1xuICB9XG5cblxuICBhcHBseVN0eWxlSW5DbG9ja051bShjbG9ja051bSwgbnVtLCBzdHlsZSkge1xuICAgIGNsb2NrTnVtLnN0eWxlLnBvc2l0aW9uID0gc3R5bGUuYWJzb2x1dGU7XG4gICAgY2xvY2tOdW0uc3R5bGUubGVmdCA9IHN0eWxlLmNsb2NrTnVtW251bV0ubGVmdDtcbiAgICBjbG9ja051bS5zdHlsZS50b3AgPSBzdHlsZS5jbG9ja051bVtudW1dLnRvcDtcbiAgfVxuXG4gIGRyYXdDbG9ja0ZhY2UoY2xvY2tCb3gpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNsb2NrQm94LCB3cmFwcGVyKTtcbiAgICBjb25zdCBkdWdIb2xlID0gdGhpcy5jbG9ja1NlcnZpY2UuY3JlYXRlRHVnSG9sZXMod3JhcHBlciwgdGhpcy5yZW5kZXJlcik7XG4gICAgY29uc3Qgc3RyYXAgPSB0aGlzLmNsb2NrU2VydmljZS5jcmVhdGVXYXRjaFN0cmFwcyh3cmFwcGVyLCB0aGlzLnJlbmRlcmVyKTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkR1Z0hvbGVzKGR1Z0hvbGUpO1xuICAgIHRoaXMuYXBwbHlTdHlsZUluV2F0Y2hTdHJhcHMoc3RyYXApO1xuICB9XG5cbiAgYXBwbHlTdHlsZUluRHVnSG9sZXMoZHVnSG9sZSkge1xuICAgIGR1Z0hvbGUudG9wTGVmdER1Z0hvbGUuc3R5bGUucG9zaXRpb24gPSB0aGlzLmlubGluZVN0eWxlSW5mby5hYnNvbHV0ZTtcbiAgICBkdWdIb2xlLnRvcExlZnREdWdIb2xlLnN0eWxlLndpZHRoID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ud3JhcFdpZHRoO1xuICAgIGR1Z0hvbGUudG9wTGVmdER1Z0hvbGUuc3R5bGUuYm9yZGVyQm90dG9tID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ud3JhcEJvcmRlckJvdHRvbTtcbiAgICBkdWdIb2xlLnRvcExlZnREdWdIb2xlLnN0eWxlLmJvcmRlckxlZnQgPSB0aGlzLmlubGluZVN0eWxlSW5mby53cmFwQm9yZGVyTGVmdDtcbiAgICBkdWdIb2xlLnRvcExlZnREdWdIb2xlLnN0eWxlLnRvcCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLndyYXBUb3A7XG4gICAgZHVnSG9sZS50b3BMZWZ0RHVnSG9sZS5zdHlsZS5sZWZ0ID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ud3JhcExlZnQ7XG4gICAgZHVnSG9sZS50b3BMZWZ0RHVnSG9sZS5zdHlsZS5ib3JkZXJCb3R0b21SaWdodFJhZGl1cyA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnJpZ2h0Qm9yZGVyUmlnaHRSYWRpdXM7XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGR1Z0hvbGUudG9wTGVmdER1Z0hvbGUsICd0b3AtbGVmdC1kdWdob2xlJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkdWdIb2xlLnRvcFJpZ2h0RHVnSG9sZSwgJ3RvcC1yaWdodC1kdWdob2xlJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkdWdIb2xlLmJvdHRvbUxlZnREdWdIb2xlLCAnYm90dG9tLWxlZnQtZHVnaG9sZScpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZHVnSG9sZS5ib3R0b21SaWdodER1Z0hvbGUsICdib3R0b20tcmlnaHQtZHVnaG9sZScpO1xuXG5cbiAgICBkdWdIb2xlLnRvcFJpZ2h0RHVnSG9sZS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLmFic29sdXRlO1xuICAgIGR1Z0hvbGUudG9wUmlnaHREdWdIb2xlLnN0eWxlLndpZHRoID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmlnaHRXcmFwV2lkdGg7XG4gICAgZHVnSG9sZS50b3BSaWdodER1Z0hvbGUuc3R5bGUuYm9yZGVyQm90dG9tID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmlnaHRXcmFwQm9yZGVyQm90dG9tO1xuICAgIGR1Z0hvbGUudG9wUmlnaHREdWdIb2xlLnN0eWxlLmJvcmRlclJpZ2h0ID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmlnaHRXcmFwQm9yZGVycmlnaHQ7XG4gICAgZHVnSG9sZS50b3BSaWdodER1Z0hvbGUuc3R5bGUudG9wID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmlnaHRXcmFwVG9wO1xuICAgIGR1Z0hvbGUudG9wUmlnaHREdWdIb2xlLnN0eWxlLmxlZnQgPSB0aGlzLmlubGluZVN0eWxlSW5mby5yaWdodFdyYXBMZWZ0O1xuICAgIGR1Z0hvbGUudG9wUmlnaHREdWdIb2xlLnN0eWxlLm1hcmdpbiA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnJpZ2h0V3JhcE1hcmdpbjtcbiAgICBkdWdIb2xlLnRvcFJpZ2h0RHVnSG9sZS5zdHlsZS5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmlnaHRCb3JkZXJMZWZ0UmFkaXVzO1xuXG4gICAgY29uc3Qgc3R5bGVUYWcgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgY3NzVGV4dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh0aGlzLmludGVybmFsU3R5bGUpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3R5bGVUYWcsIGNzc1RleHQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaGVhZCwgc3R5bGVUYWcpO1xuICB9XG5cbiAgYXBwbHlTdHlsZUluV2F0Y2hTdHJhcHMoc3RyYXApIHtcbiAgICBjb25zdCBwb3MgPSAwO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgcG9zIDwgc3RyYXBbJ2NsYXNzTmFtZScgKyBpbmRleF0ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzaXplID0gc3RyYXBbJ2NsYXNzTmFtZScgKyBpbmRleF0ubGVuZ3RoO1xuICAgICAgaWYgKHNpemUgPT09IDIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhzdHJhcFsnZWxlbWVudE5hbWUnICsgaW5kZXhdLCBzdHJhcFsnY2xhc3NOYW1lJyArIGluZGV4XVtpbmRleCAtIGluZGV4XSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Moc3RyYXBbJ2VsZW1lbnROYW1lJyArIGluZGV4XSwgc3RyYXBbJ2NsYXNzTmFtZScgKyBpbmRleF1baW5kZXggLSAoaW5kZXggLSAxKV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3Moc3RyYXBbJ2VsZW1lbnROYW1lJyArIGluZGV4XSwgc3RyYXBbJ2NsYXNzTmFtZScgKyBpbmRleF1baW5kZXggLSBpbmRleF0pO1xuICAgICAgICBpZiAoaW5kZXggPT09IDE3KSB7IGJyZWFrOyB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBhZGRDbG9ja0hhbmRzKHRoaXJkQ2lyY2xlKSB7XG4gICAgY29uc3QgYXhpc0NpcmNsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGNvbnN0IGRvdFB1bmN0dXJlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhheGlzQ2lyY2xlLCAnYXhpcy1jaXJjbGUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvdFB1bmN0dXJlLCAnZG90LXB1bmN0dXJlJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChheGlzQ2lyY2xlLCBkb3RQdW5jdHVyZSk7XG4gICAgY29uc3QgaG91ckhhbmQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaG91ckhhbmQsICdob3VyLWhhbmQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGhvdXJIYW5kLCAnaG91cicpO1xuICAgIGNvbnN0IGhvdXJIYW5kUm91bmQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBjb25zdCBob3VySGFuZEFycm93ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhob3VySGFuZFJvdW5kLCAnaG91ci1oYW5kLXJvdW5kJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhob3VySGFuZEFycm93LCAnaG91ci1oYW5kLWFycm93Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChob3VySGFuZCwgaG91ckhhbmRSb3VuZCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChob3VySGFuZCwgaG91ckhhbmRBcnJvdyk7XG4gICAgY29uc3Qgc2Vjb25kSGFuZCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhzZWNvbmRIYW5kLCAnc2Vjb25kLWhhbmQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHNlY29uZEhhbmQsICdoYW5kJyk7XG4gICAgY29uc3QgbWludXRlSGFuZCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhtaW51dGVIYW5kLCAnbWludXRlLWhhbmQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG1pbnV0ZUhhbmQsICdob3VyJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlyZENpcmNsZSwgYXhpc0NpcmNsZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlyZENpcmNsZSwgaG91ckhhbmQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcmRDaXJjbGUsIHNlY29uZEhhbmQpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcmRDaXJjbGUsIG1pbnV0ZUhhbmQpO1xuICAgIHRoaXMuZWxlbWVudEluZm8uaG91ckhhbmQgPSBob3VySGFuZDtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLnNlY29uZEhhbmQgPSBzZWNvbmRIYW5kO1xuICAgIHRoaXMuZWxlbWVudEluZm8ubWludXRlSGFuZCA9IG1pbnV0ZUhhbmQ7XG4gIH1cblxuXG4gIHN0YXJ0Q2xvY2soKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgIGNvbnN0IHNlY29uZERlZ3JlZXMgPSAoKHNlY29uZHMgLyA2MCkgKiAzNjApICsgOTA7XG4gICAgdGhpcy5lbGVtZW50SW5mby5zZWNvbmRIYW5kLnN0eWxlLnRyYW5zZm9ybSA9IGByb3RhdGUoJHtzZWNvbmREZWdyZWVzfWRlZylgO1xuXG4gICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuICAgIGNvbnN0IG1pbnV0ZURlZ3JlZXMgPSAoKG1pbnV0ZXMgLyA2MCkgKiAzNjApICsgMzYwO1xuICAgIHRoaXMuZWxlbWVudEluZm8ubWludXRlSGFuZC5zdHlsZS50cmFuc2Zvcm0gPSBgcm90YXRlKCR7bWludXRlRGVncmVlc31kZWcpYDtcblxuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IGhvdXJEZWdyZWVzID0gaG91cnMgKiAzNjAgLyAxMiArICgobWludXRlcyAqIDM2MCAvIDYwKSAvIDEyKTtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLmhvdXJIYW5kLnN0eWxlLnRyYW5zZm9ybSA9IGByb3RhdGUoJHtob3VyRGVncmVlc31kZWcpYDtcblxuICAgIHJldHVybiB7XG4gICAgICBob3VyOiBob3VycyxcbiAgICAgIG1pbnV0ZTogbWludXRlcyxcbiAgICAgIGhvdXJEZWdyZWU6IGhvdXJEZWdyZWVzLFxuICAgICAgbWludXRlRGVncmVlOiBtaW51dGVEZWdyZWVzLFxuICAgIH07XG4gIH1cblxuXG4gIG9uV2F0Y2hCdG5DbGljaygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnRJbmZvLmNsb2NrQ3Jvd24sICdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lcmRpYW4gPSB0aGlzLnRpbWVJbmZvLmhvdXIgPD0gMTIgfHwgdGhpcy50aW1lSW5mby5ob3VyID09PSAyNCA/ICdhbScgOiAnIHBtICc7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudEluZm8uaW5wdXQsICd2YWx1ZScsIGAke3RoaXMudGltZUluZm8uaG91cn06JHt0aGlzLnRpbWVJbmZvLm1pbnV0ZX0ke21lcmRpYW59YCk7XG4gICAgICB0aGlzLmNoZWNrSWZJbnB1dENvbnRhaW5WYWx1ZSh0aGlzLmVsZW1lbnRJbmZvLCB0aGlzLmlubGluZVN0eWxlSW5mbyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudEluZm8uY2xvY2tCb3gsICd0b2dnbGUtdGltZScpO1xuICAgICAgdGhpcy5jbG9ja1ZhbHVlID0gdGhpcy5lbGVtZW50SW5mby5pbnB1dC52YWx1ZTtcbiAgICAgIHRoaXMuZ2V0Q2xvY2tWYWx1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgb25DaGFuZ2VIb3VyVGltZUNsaWNrKCkge1xuICAgIGxldCBuZXh0TW92ZSA9IDA7XG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50SW5mby5ob3VySGFuZCwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucnVuQ2xvY2spO1xuXG4gICAgICBuZXh0TW92ZSsrO1xuICAgICAgZGF0ZS5zZXRIb3Vycyh0aGlzLnRpbWVJbmZvLmhvdXIsIHRoaXMudGltZUluZm8ubWludXRlICsgbmV4dE1vdmUpO1xuICAgICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuICAgICAgY29uc3QgbWludXRlRGVncmVlcyA9ICgobWludXRlcyAvIDYwKSAqIDM2MCkgKyAzNjA7XG5cbiAgICAgIHRoaXMuZWxlbWVudEluZm8ubWludXRlSGFuZC5zdHlsZS50cmFuc2Zvcm0gPSBgcm90YXRlKCR7bWludXRlRGVncmVlc31kZWcpYDtcbiAgICAgIGNvbnN0IGhvdXJEZWdyZWVzID0gZGF0ZS5nZXRIb3VycygpICogMzYwIC8gMTIgKyAoKGRhdGUuZ2V0TWludXRlcygpICogMzYwIC8gNjApIC8gMTIpO1xuICAgICAgdGhpcy5lbGVtZW50SW5mby5ob3VySGFuZC5zdHlsZS50cmFuc2Zvcm0gPSBgcm90YXRlKCR7aG91ckRlZ3JlZXN9ZGVnKWA7XG5cbiAgICAgIGNvbnN0IG1lcmRpYW4gPSBkYXRlLmdldEhvdXJzKCkgPD0gMTIgfHwgZGF0ZS5nZXRIb3VycygpID09PSAyNCA/ICdhbScgOiAnIHBtICc7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudEluZm8uaW5wdXQsICd2YWx1ZScsIGAke2RhdGUuZ2V0SG91cnMoKX06JHttaW51dGVzfSR7bWVyZGlhbn1gKTtcbiAgICAgIHRoaXMuY2hlY2tJZklucHV0Q29udGFpblZhbHVlKHRoaXMuZWxlbWVudEluZm8sIHRoaXMuaW5saW5lU3R5bGVJbmZvKTtcblxuICAgICAgY29uc3QgY2hhbmdlVGltZUluZm8gPSB7XG4gICAgICAgIGhvdXI6IGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgbWludXRlOiBkYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgICAgaG91ckRlZ3JlZTogaG91ckRlZ3JlZXMsXG4gICAgICAgIG1pbnV0ZURlZ3JlZTogbWludXRlRGVncmVlcyxcbiAgICAgIH07XG4gICAgICB0aGlzLnRpbWVJbmZvID0gY2hhbmdlVGltZUluZm87XG4gICAgICB0aGlzLnJlZnJlc2hDbG9jaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaENsb2NrKCkge1xuICAgIHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy50aW1lSW5mbyA9IHRoaXMuc3RhcnRDbG9jaygpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSwgNDAwMDApO1xuICAgfVxuXG4gIGdldENsb2NrVmFsdWUoKSB7XG4gICAgdGhpcy50aW1lVmFsLmVtaXQodGhpcy5jbG9ja1ZhbHVlKTtcbiAgfVxufVxuIl19