com.phloxui
Version:
PhloxUI Ng2+ Framework
638 lines (637 loc) • 49.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { AbstractSimpleDropdown } from './AbstractSimpleDropdown';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
import { ColorSelectItemModel } from '../../model/ColorSelectItemModel';
import { ColorUtils } from '../../../share/utils/ColorUtils';
import { I18N } from '../../../decorator/I18N.decorator';
import { Option } from '../../../decorator/Option.decorator';
import { PhloxAppInfoService } from '../../../service/PhloxAppInfoService.service';
var /** @type {?} */ TYPE_NAME = "phx-theme-color-swatch";
var ThemeColorSwatch = /** @class */ (function (_super) {
tslib_1.__extends(ThemeColorSwatch, _super);
function ThemeColorSwatch(needFocusService, elementRef, phloxAppInfoService) {
var _this = _super.call(this, needFocusService, elementRef, phloxAppInfoService) || this;
_this.items = [];
_this.gradientLevelMap = {};
_this.baseSaturation = 25;
_this.baseBright = 25;
return _this;
}
/**
* @return {?}
*/
ThemeColorSwatch.prototype.ngOnInit = /**
* @return {?}
*/
function () {
_super.prototype.ngOnInit.call(this);
if (this.pigmentColors !== null && typeof this.pigmentColors !== 'undefined') {
this.setPigmentColors(this.pigmentColors);
}
};
/**
* @param {?} changes
* @return {?}
*/
ThemeColorSwatch.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
_super.prototype.ngOnChanges.call(this, changes);
};
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getSelectedItemHexColor = /**
* @return {?}
*/
function () {
return this.getSelectedItem().getValue();
};
/**
* @param {?} index
* @return {?}
*/
ThemeColorSwatch.prototype._showNewLine = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.pigmentColors !== null && typeof this.pigmentColors !== 'undefined') {
var /** @type {?} */ pigmentColorsCount = this.pigmentColors.length;
var /** @type {?} */ count = index + 1;
if (count % pigmentColorsCount === 0) {
return true;
}
}
return false;
};
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getFakeGradientLevelArray = /**
* @return {?}
*/
function () {
var /** @type {?} */ fakeArray = [];
if (this.gradientLevel > 0) {
fakeArray = new Array(this.gradientLevel);
}
return fakeArray;
};
/**
* @param {?} level
* @return {?}
*/
ThemeColorSwatch.prototype.getShadeColorItemsLevel = /**
* @param {?} level
* @return {?}
*/
function (level) {
var /** @type {?} */ result = [];
if (level >= 0) {
try {
for (var _a = tslib_1.__values(this.items), _b = _a.next(); !_b.done; _b = _a.next()) {
var item = _b.value;
var /** @type {?} */ key = item.getValue();
var /** @type {?} */ levelArray = this.gradientLevelMap[key];
if (levelArray !== null && typeof levelArray !== 'undefined') {
if (level < levelArray.length) {
result.push(new ColorSelectItemModel(levelArray[level], levelArray[level]));
}
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
}
return result;
var e_1, _c;
};
/**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
ThemeColorSwatch.prototype.onValidationEnd = /**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
function (inputValue, results) {
//! do sthing
};
/**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
ThemeColorSwatch.prototype.onDataChange = /**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
function (data, inputVal) {
};
/**
* @param {?} $event
* @return {?}
*/
ThemeColorSwatch.prototype.doFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
$(this.elementRef.nativeElement).find(".swatch > button").focus();
};
// Override
/**
* @param {?} $event
* @return {?}
*/
ThemeColorSwatch.prototype.doBlur = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
$(this.elementRef.nativeElement).find(".swatch > button").blur();
};
// Override
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getDropdownPopupSelector = /**
* @return {?}
*/
function () {
return '.menu';
};
/**
* @param {?} colorModel
* @return {?}
*/
ThemeColorSwatch.prototype.setPigmentColors = /**
* @param {?} colorModel
* @return {?}
*/
function (colorModel) {
this.pigmentColors = colorModel;
this.items = [];
this.gradientLevelMap = {};
if (this.pigmentColors !== null && typeof this.pigmentColors !== 'undefined') {
var /** @type {?} */ percentShade = 100;
if (this.gradientLevel !== null && typeof this.gradientLevel === 'number' && this.gradientLevel > 0) {
percentShade = Math.round(percentShade / this.gradientLevel);
}
try {
for (var _a = tslib_1.__values(this.pigmentColors), _b = _a.next(); !_b.done; _b = _a.next()) {
var color = _b.value;
var /** @type {?} */ key = color.value;
this.items.push(new ColorSelectItemModel(color.name, color.value));
if (this.gradientLevel !== null && typeof this.gradientLevel === 'number' && this.gradientLevel > 0) {
var /** @type {?} */ grLVArray = [];
var /** @type {?} */ pigmentHex = color.value;
var /** @type {?} */ hsl = ColorUtils.hexToHsl(pigmentHex);
var /** @type {?} */ hue = Math.round(hsl[0] * 360);
var /** @type {?} */ saturation = Math.round(hsl[1] * 100);
var /** @type {?} */ br = Math.round(hsl[2] * 100);
var /** @type {?} */ baseSat = this.baseSaturation;
var /** @type {?} */ baseBr = this.baseBright;
for (var /** @type {?} */ i = 0; i < this.gradientLevel; i++) {
var /** @type {?} */ newShade = ColorUtils.hsbToHex(hue, saturation - baseSat, br + baseBr);
newShade = newShade.toUpperCase();
grLVArray.push(newShade);
pigmentHex = newShade;
// testing
// this.items.push(new ColorSelectItemModel(newShade, newShade));
baseSat += 5;
baseBr -= 5;
}
this.gradientLevelMap[key] = grLVArray;
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_2) throw e_2.error; }
}
// adding for shading
for (var /** @type {?} */ i = 0; i < this.gradientLevel; i++) {
var /** @type {?} */ shadingItems = this.getShadeColorItemsLevel(i);
try {
for (var shadingItems_1 = tslib_1.__values(shadingItems), shadingItems_1_1 = shadingItems_1.next(); !shadingItems_1_1.done; shadingItems_1_1 = shadingItems_1.next()) {
var item = shadingItems_1_1.value;
this.items.push(item);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (shadingItems_1_1 && !shadingItems_1_1.done && (_d = shadingItems_1.return)) _d.call(shadingItems_1);
}
finally { if (e_3) throw e_3.error; }
}
}
}
var e_2, _c, e_3, _d;
};
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getSelectedItem = /**
* @return {?}
*/
function () {
var /** @type {?} */ sItem = _super.prototype.getSelectedItem.call(this);
if (sItem != null) {
return /** @type {?} */ (sItem);
}
return null;
};
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getLabel = /**
* @return {?}
*/
function () {
return this.label;
};
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getItems = /**
* @return {?}
*/
function () {
return this.items;
};
/**
* @return {?}
*/
ThemeColorSwatch.prototype.getDropdownWidth = /**
* @return {?}
*/
function () {
return this.dropdownWidth;
};
ThemeColorSwatch.TYPE_NAME = TYPE_NAME;
ThemeColorSwatch.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: "<div class=\"phx-theme-color-swatch\" [style.width]=\"getWidth()\" [style.height]=\"getHeight()\">\n\t<div class=\"swatch-container fluid\">\n\t\t<div class=\"swatch\">\n\t\t\t<button type=\"button\" (click)=\"click($event)\" (focusin)=\"onFocusing($event)\" (blur)=\"onLostFocusing($event)\">\n\t\t\t\t<div class=\"label-side\" [style.text-align]=\"getAlign()\" *ngIf=\"getSelectedItem() !== null\">\n\t\t\t\t\t<div class=\"box\" [style.background-color]=\"getSelectedItemHexColor()\"></div> <div class=\"label\">{{getSelectedItem().label}}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"arrow-side\">\n\t\t\t\t\t<div class=\"flex-center\">\n\t\t\t\t\t\t<div class=\"down-triangle\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</button>\n\t\t</div>\n <div class=\"menu-container\" [class.show]=\"isShow()\" [style.width]=\"getDropdownWidth()\">\n <ul class=\"menu\">\n\t\t\t\t<ng-template ngFor let-item [ngForOf]=\"getItems()\" let-i=\"index\">\n\t\t\t\t\t<li (click)=\"onSelectItemClicked($event, i)\" [style.text-align]=\"getAlign()\">\n\t\t\t\t\t\t<div class=\"box\" [style.background-color]=\"item.value\"></div>\n\t\t\t\t\t</li>\n\t\t\t\t\t<br *ngIf=\"_showNewLine(i)\"/>\n\t\t\t\t</ng-template>\n \t\t</ul>\n \t</div>\n\t</div>\n</div>\n"
},] },
];
/** @nocollapse */
ThemeColorSwatch.ctorParameters = function () { return [
{ type: NeedFocusService, },
{ type: ElementRef, },
{ type: PhloxAppInfoService, },
]; };
ThemeColorSwatch.propDecorators = {
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"field": [{ type: Input },],
"name": [{ type: Input },],
"typeOfData": [{ type: Input },],
"readOnly": [{ type: Input },],
"help": [{ type: Input },],
"dataComparator": [{ type: Input, args: ['comparator',] },],
"items": [{ type: Input },],
"align": [{ type: Input },],
"width": [{ type: Input },],
"height": [{ type: Input },],
"dropdownWidth": [{ type: Input },],
"dropdownHeight": [{ type: Input },],
"pigmentColors": [{ type: Input },],
"gradientLevel": [{ type: Input },],
"label": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },],
"endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },],
"beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },],
"focusEvent": [{ type: Output, args: ['phxFocus',] },],
"beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },],
"lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeSelectEvent": [{ type: Output, args: ['phxBeforeSelect',] },],
"selectEvent": [{ type: Output, args: ['phxSelect',] },],
"beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },],
"clickEvent": [{ type: Output, args: ['phxClick',] },],
"beforeShowEvent": [{ type: Output, args: ['phxBeforeShow',] },],
"showEvent": [{ type: Output, args: ['phxShow',] },],
"beforeHideEvent": [{ type: Output, args: ['phxBeforeHide',] },],
"hideEvent": [{ type: Output, args: ['phxHide',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ThemeColorSwatch.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ThemeColorSwatch.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "name", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "typeOfData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ThemeColorSwatch.prototype, "readOnly", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "help", void 0);
tslib_1.__decorate([
Option('comparator'),
tslib_1.__metadata("design:type", Object)
], ThemeColorSwatch.prototype, "dataComparator", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Array)
], ThemeColorSwatch.prototype, "items", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "align", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "width", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "height", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "dropdownWidth", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "dropdownHeight", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Array)
], ThemeColorSwatch.prototype, "pigmentColors", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Number)
], ThemeColorSwatch.prototype, "gradientLevel", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ThemeColorSwatch.prototype, "label", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "endValidateEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeChangeEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeSelect'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeSelectEvent", void 0);
tslib_1.__decorate([
Option('select'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "selectEvent", void 0);
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeShow'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeShowEvent", void 0);
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('beforeHide'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "beforeHideEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], ThemeColorSwatch.prototype, "hideEvent", void 0);
return ThemeColorSwatch;
}(AbstractSimpleDropdown));
export { ThemeColorSwatch };
function ThemeColorSwatch_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ThemeColorSwatch.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ThemeColorSwatch.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ThemeColorSwatch.propDecorators;
/** @type {?} */
ThemeColorSwatch.TYPE_NAME;
/** @type {?} */
ThemeColorSwatch.prototype.dataParent;
/** @type {?} */
ThemeColorSwatch.prototype.ignoreParentData;
/** @type {?} */
ThemeColorSwatch.prototype.data;
/** @type {?} */
ThemeColorSwatch.prototype.ignoreParentDisabled;
/** @type {?} */
ThemeColorSwatch.prototype.delegateHistory;
/** @type {?} */
ThemeColorSwatch.prototype.onDisabled;
/** @type {?} */
ThemeColorSwatch.prototype.onEnabled;
/** @type {?} */
ThemeColorSwatch.prototype.loadingEnabled;
/** @type {?} */
ThemeColorSwatch.prototype.i18nKey;
/** @type {?} */
ThemeColorSwatch.prototype.bypass;
/** @type {?} */
ThemeColorSwatch.prototype.options;
/** @type {?} */
ThemeColorSwatch.prototype.disabled;
/** @type {?} */
ThemeColorSwatch.prototype.field;
/** @type {?} */
ThemeColorSwatch.prototype.name;
/** @type {?} */
ThemeColorSwatch.prototype.typeOfData;
/** @type {?} */
ThemeColorSwatch.prototype.readOnly;
/** @type {?} */
ThemeColorSwatch.prototype.help;
/** @type {?} */
ThemeColorSwatch.prototype.dataComparator;
/** @type {?} */
ThemeColorSwatch.prototype.items;
/** @type {?} */
ThemeColorSwatch.prototype.align;
/** @type {?} */
ThemeColorSwatch.prototype.width;
/** @type {?} */
ThemeColorSwatch.prototype.height;
/** @type {?} */
ThemeColorSwatch.prototype.dropdownWidth;
/** @type {?} */
ThemeColorSwatch.prototype.dropdownHeight;
/** @type {?} */
ThemeColorSwatch.prototype.pigmentColors;
/** @type {?} */
ThemeColorSwatch.prototype.gradientLevel;
/** @type {?} */
ThemeColorSwatch.prototype.label;
/** @type {?} */
ThemeColorSwatch.prototype.gradientLevelMap;
/** @type {?} */
ThemeColorSwatch.prototype.baseSaturation;
/** @type {?} */
ThemeColorSwatch.prototype.baseBright;
/** @type {?} */
ThemeColorSwatch.prototype.loadEvent;
/** @type {?} */
ThemeColorSwatch.prototype.startValidateEvent;
/** @type {?} */
ThemeColorSwatch.prototype.endValidateEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeFocusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.focusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeLostFocusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.lostFocusEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeChangeEvent;
/** @type {?} */
ThemeColorSwatch.prototype.changeEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeSelectEvent;
/** @type {?} */
ThemeColorSwatch.prototype.selectEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeClickEvent;
/** @type {?} */
ThemeColorSwatch.prototype.clickEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeShowEvent;
/** @type {?} */
ThemeColorSwatch.prototype.showEvent;
/** @type {?} */
ThemeColorSwatch.prototype.beforeHideEvent;
/** @type {?} */
ThemeColorSwatch.prototype.hideEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhlbWVDb2xvclN3YXRjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvVGhlbWVDb2xvclN3YXRjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUd4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUluRixxQkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7O0lBaUNiLDRDQUFzQjtJQWdLMUQsMEJBQVksZ0JBQWtDLEVBQUUsVUFBc0IsRUFBRSxtQkFBd0M7UUFBaEgsWUFDRSxrQkFBTSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLENBQUMsU0FNekQ7UUFKQyxLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLEtBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDOztLQUN0Qjs7OztJQUVNLG1DQUFROzs7O1FBQ2IsaUJBQU0sUUFBUSxXQUFFLENBQUM7UUFFakIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMzQzs7Ozs7O0lBR0ksc0NBQVc7Ozs7Y0FBQyxPQUFZO1FBQzdCLGlCQUFNLFdBQVcsWUFBQyxPQUFPLENBQUMsQ0FBQzs7Ozs7SUFHdEIsa0RBQXVCOzs7O1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Ozs7OztJQUdwQyx1Q0FBWTs7OztjQUFDLEtBQWE7UUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDN0UscUJBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFFbkQscUJBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDdEIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLGtCQUFrQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQzs7Ozs7SUFHUCxvREFBeUI7Ozs7UUFDL0IscUJBQUksU0FBUyxHQUFVLEVBQUUsQ0FBQztRQUUxQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMzQztRQUVELE1BQU0sQ0FBQyxTQUFTLENBQUM7Ozs7OztJQUdYLGtEQUF1Qjs7OztjQUFDLEtBQWE7UUFDM0MscUJBQUksTUFBTSxHQUEyQixFQUFFLENBQUM7UUFFeEMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUNmLEdBQUcsQ0FBQyxDQUFhLElBQUEsS0FBQSxpQkFBQSxJQUFJLENBQUMsS0FBSyxDQUFBLGdCQUFBO29CQUF0QixJQUFJLElBQUksV0FBQTtvQkFDWCxxQkFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNsQyxxQkFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QyxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQzdELEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs0QkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM3RTtxQkFDRjtpQkFDRjs7Ozs7Ozs7O1NBQ0Y7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDOzs7Ozs7OztJQUdOLDBDQUFlOzs7OztJQUF6QixVQUEwQixVQUFlLEVBQUUsT0FBMkI7O0tBRXJFOzs7Ozs7SUFFUyx1Q0FBWTs7Ozs7SUFBdEIsVUFBdUIsSUFBUyxFQUFFLFFBQWE7S0FDOUM7Ozs7O0lBRVMsa0NBQU87Ozs7SUFBakIsVUFBa0IsTUFBYTtRQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNuRTtJQUVELFdBQVc7Ozs7O0lBQ0QsaUNBQU07Ozs7SUFBaEIsVUFBaUIsTUFBYTtRQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNsRTtJQUVELFdBQVc7Ozs7SUFDRCxtREFBd0I7OztJQUFsQztRQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEI7Ozs7O0lBRU0sMkNBQWdCOzs7O2NBQUMsVUFBd0I7UUFDOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUM3RSxxQkFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzlEOztnQkFFRCxHQUFHLENBQUMsQ0FBYyxJQUFBLEtBQUEsaUJBQUEsSUFBSSxDQUFDLGFBQWEsQ0FBQSxnQkFBQTtvQkFBL0IsSUFBSSxLQUFLLFdBQUE7b0JBQ1oscUJBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDbkUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BHLHFCQUFJLFNBQVMsR0FBVSxFQUFFLENBQUM7d0JBQzFCLHFCQUFJLFVBQVUsR0FBVyxLQUFLLENBQUMsS0FBSyxDQUFDO3dCQUVyQyxxQkFBSSxHQUFHLEdBQWEsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDcEQscUJBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO3dCQUMzQyxxQkFBSSxVQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7d0JBQ2xELHFCQUFJLEVBQUUsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFFMUMscUJBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxjQUFjLENBQUM7d0JBQzFDLHFCQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsVUFBVSxDQUFDO3dCQUVyQyxHQUFHLENBQUMsQ0FBQyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7NEJBQzVDLHFCQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsT0FBTyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQzs0QkFDM0UsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDekIsVUFBVSxHQUFHLFFBQVEsQ0FBQzs7OzRCQUl0QixPQUFPLElBQUksQ0FBQyxDQUFDOzRCQUNiLE1BQU0sSUFBSSxDQUFDLENBQUM7eUJBQ2I7d0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztxQkFDeEM7aUJBQ0Y7Ozs7Ozs7Ozs7WUFHRCxHQUFHLENBQUMsQ0FBQyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVDLHFCQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUNuRCxHQUFHLENBQUMsQ0FBYSxJQUFBLGlCQUFBLGlCQUFBLFlBQVksQ0FBQSwwQ0FBQTt3QkFBeEIsSUFBSSxJQUFJLHlCQUFBO3dCQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUN2Qjs7Ozs7Ozs7O2FBQ0Y7U0FDRjs7Ozs7O0lBR0ksMENBQWU7Ozs7UUFDcEIscUJBQUksS0FBSyxHQUFHLGlCQUFNLGVBQWUsV0FBRSxDQUFDO1FBRXBDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sbUJBQUMsS0FBNkIsRUFBQztTQUN0QztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUM7Ozs7O0lBR1AsbUNBQVE7Ozs7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Ozs7SUFHYixtQ0FBUTs7OztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzs7OztJQUdiLDJDQUFnQjs7OztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7aUNBelRlLFNBQVM7O2dCQWpDckQsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtvQkFDbkIsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLFFBQVEsRUFBRSxndkNBMEJYO2lCQUNBOzs7O2dCQTNDUSxnQkFBZ0I7Z0JBSkcsVUFBVTtnQkFXN0IsbUJBQW1COzs7K0JBMkN6QixLQUFLO3FDQUdMLEtBQUs7eUJBR0wsS0FBSzt5Q0FHTCxLQUFLO29DQUdMLEtBQUs7K0JBR0wsS0FBSzs4QkFHTCxLQUFLO21DQUdMLEtBQUs7NEJBR0wsS0FBSzsyQkFHTCxLQUFLLFNBQUMsWUFBWTs0QkFHbEIsS0FBSzs2QkFFTCxLQUFLOzBCQUlMLEtBQUs7eUJBSUwsS0FBSzsrQkFHTCxLQUFLOzZCQUdMLEtBQUs7eUJBR0wsS0FBSzttQ0FLTCxLQUFLLFNBQUMsWUFBWTswQkFHbEIsS0FBSzswQkFNTCxLQUFLOzBCQUdMLEtBQUs7MkJBR0wsS0FBSztrQ0FHTCxLQUFLO21DQUdMLEtBQUs7a0NBTUwsS0FBSztrQ0FHTCxLQUFLOzBCQUdMLEtBQUs7OEJBVUwsTUFBTSxTQUFDLFNBQVM7dUNBS2hCLE1BQU0sU0FBQyxrQkFBa0I7cUNBR3pCLE1BQU0sU0FBQyxnQkFBZ0I7cUNBR3ZCLE1BQU0sU0FBQyxnQkFBZ0I7K0JBR3ZCLE1BQU0sU0FBQyxVQUFVO3lDQUdqQixNQUFNLFNBQUMsb0JBQW9CO21DQUczQixNQUFNLFNBQUMsY0FBYztzQ0FHckIsTUFBTSxTQUFDLGlCQUFpQjtnQ0FHeEIsTUFBTSxTQUFDLFdBQVc7c0NBSWxCLE1BQU0sU0FBQyxpQkFBaUI7Z0NBR3hCLE1BQU0sU0FBQyxXQUFXO3FDQUtsQixNQUFNLFNBQUMsZ0JBQWdCOytCQUd2QixNQUFNLFNBQUMsVUFBVTtvQ0FHakIsTUFBTSxTQUFDLGVBQWU7OEJBR3RCLE1BQU0sU0FBQyxTQUFTO29DQUdoQixNQUFNLFNBQUMsZUFBZTs4QkFHdEIsTUFBTSxTQUFDLFNBQVM7OztRQXJKaEIsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzBDQUNhLFFBQVE7OztRQUU3QixNQUFNLEVBQUU7MENBQ1ksUUFBUTs7O1FBRTVCLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sQ0FBQyxZQUFZLENBQUM7Ozs7UUFLcEIsTUFBTSxFQUFFOzs7O1FBSVIsTUFBTSxFQUFFOzs7O1FBSVIsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsSUFBSSxFQUFFO1FBQ04sTUFBTSxFQUFFOzs7O1FBSVIsTUFBTSxDQUFDLFlBQVksQ0FBQzs7OztRQUdwQixJQUFJLEVBQUU7UUFDTixNQUFNLEVBQUU7Ozs7UUFLUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFJUixJQUFJLEVBQUU7UUFFTixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFVUixNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUloQyxNQUFNLENBQUMsZUFBZSxDQUFDOzBDQUNNLFlBQVk7OztRQUV6QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUV2QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUV2QyxNQUFNLENBQUMsT0FBTyxDQUFDOzBDQUNNLFlBQVk7OztRQUVqQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7MENBQ00sWUFBWTs7O1FBRTNDLE1BQU0sQ0FBQyxXQUFXLENBQUM7MENBQ00sWUFBWTs7O1FBRXJDLE1BQU0sQ0FBQyxjQUFjLENBQUM7MENBQ00sWUFBWTs7O1FBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7MENBQ00sWUFBWTs7O1FBR2xDLE1BQU0sQ0FBQyxjQUFjLENBQUM7MENBQ00sWUFBWTs7O1FBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7MENBQ00sWUFBWTs7O1FBSWxDLE1BQU0sQ0FBQyxhQUFhLENBQUM7MENBQ00sWUFBWTs7O1FBRXZDLE1BQU0sQ0FBQyxPQUFPLENBQUM7MENBQ00sWUFBWTs7O1FBRWpDLE1BQU0sQ0FBQyxZQUFZLENBQUM7MENBQ00sWUFBWTs7O1FBRXRDLE1BQU0sQ0FBQyxNQUFNLENBQUM7MENBQ00sWUFBWTs7O1FBRWhDLE1BQU0sQ0FBQyxZQUFZLENBQUM7MENBQ00sWUFBWTs7O1FBRXRDLE1BQU0sQ0FBQyxNQUFNLENBQUM7MENBQ00sWUFBWTs7MkJBOU1uQztFQWdEc0Msc0JBQXNCO1NBQS9DLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RTaW1wbGVEcm9wZG93biB9IGZyb20gJy4vQWJzdHJhY3RTaW1wbGVEcm9wZG93bic7XG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL0lIYXNEYXRhJztcbmltcG9ydCB7IElEYXRhQ29tcGFyYXRvciB9IGZyb20gJy4uLy4uL0lEYXRhQ29tcGFyYXRvcic7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sb3JTZWxlY3RJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9Db2xvclNlbGVjdEl0ZW1Nb2RlbCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vbW9kZWwvVmFsaWRhdGlvblJlc3VsdCc7XG5pbXBvcnQgeyBDb2xvck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvQ29sb3JNb2RlbCc7XG5pbXBvcnQgeyBDb2xvclV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvQ29sb3JVdGlscyc7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IFBobG94QXBwSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL1BobG94QXBwSW5mb1NlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC10aGVtZS1jb2xvci1zd2F0Y2hcIjtcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC10aGVtZS1jb2xvci1zd2F0Y2hcIiBbc3R5bGUud2lkdGhdPVwiZ2V0V2lkdGgoKVwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVpZ2h0KClcIj5cblx0PGRpdiBjbGFzcz1cInN3YXRjaC1jb250YWluZXIgZmx1aWRcIj5cblx0XHQ8ZGl2IGNsYXNzPVwic3dhdGNoXCI+XG5cdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xpY2soJGV2ZW50KVwiIChmb2N1c2luKT1cIm9uRm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImxhYmVsLXNpZGVcIiBbc3R5bGUudGV4dC1hbGlnbl09XCJnZXRBbGlnbigpXCIgKm5nSWY9XCJnZXRTZWxlY3RlZEl0ZW0oKSAhPT0gbnVsbFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3hcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJnZXRTZWxlY3RlZEl0ZW1IZXhDb2xvcigpXCI+PC9kaXY+IDxkaXYgY2xhc3M9XCJsYWJlbFwiPnt7Z2V0U2VsZWN0ZWRJdGVtKCkubGFiZWx9fTwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImFycm93LXNpZGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1jZW50ZXJcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJkb3duLXRyaWFuZ2xlXCI+PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9idXR0b24+XG5cdFx0PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1lbnUtY29udGFpbmVyXCIgW2NsYXNzLnNob3ddPVwiaXNTaG93KClcIiBbc3R5bGUud2lkdGhdPVwiZ2V0RHJvcGRvd25XaWR0aCgpXCI+XG4gICAgICAgIDx1bCBjbGFzcz1cIm1lbnVcIj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cImdldEl0ZW1zKClcIiBsZXQtaT1cImluZGV4XCI+XG5cdFx0XHRcdFx0PGxpIChjbGljayk9XCJvblNlbGVjdEl0ZW1DbGlja2VkKCRldmVudCwgaSlcIiBbc3R5bGUudGV4dC1hbGlnbl09XCJnZXRBbGlnbigpXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm94XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbS52YWx1ZVwiPjwvZGl2PlxuXHRcdFx0XHRcdDwvbGk+XG5cdFx0XHRcdFx0PGJyICpuZ0lmPVwiX3Nob3dOZXdMaW5lKGkpXCIvPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuICAgIFx0XHQ8L3VsPlxuICAgIFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFRoZW1lQ29sb3JTd2F0Y2ggZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZURyb3Bkb3duIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0U2VsZWN0SXRlbXNcbiAgQElucHV0KCdjb21wYXJhdG9yJylcbiAgQE9wdGlvbignY29tcGFyYXRvcicpXG4gIHByb3RlY3RlZCBkYXRhQ29tcGFyYXRvcjogSURhdGFDb21wYXJhdG9yPGFueT47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBpdGVtczogQ29sb3JTZWxlY3RJdGVtTW9kZWxbXTtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RPbmVJdGVtXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0U2ltcGxlRHJvcGRvd25cbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBhbGlnbjogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHdpZHRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaGVpZ2h0OiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZHJvcGRvd25XaWR0aDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRyb3Bkb3duSGVpZ2h0OiBzdHJpbmc7XG4gIFxuICAvLyAtLS0gU2VsZlxuICBASTE4TigpXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcml2YXRlIHBpZ21lbnRDb2xvcnM6IENvbG9yTW9kZWxbXTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgZ3JhZGllbnRMZXZlbDogbnVtYmVyO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGxhYmVsOiBzdHJpbmc7XG4gIFxuICBwcml2YXRlIGdyYWRpZW50TGV2ZWxNYXA6IGFueTtcbiAgcHJpdmF0ZSBiYXNlU2F0dXJhdGlvbjogbnVtYmVyO1xuICBwcml2YXRlIGJhc2VCcmlnaHQ6IG51bWJlcjtcbiAgXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcbiAgQE91dHB1dCgncGh4TG9hZCcpXG4gIEBPcHRpb24oJ2xvYWQnKVxuICBwcm90ZWN0ZWQgbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcbiAgQE91dHB1dCgncGh4U3RhcnRWYWxpZGF0ZScpXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxuICBwcm90ZWN0ZWQgc3RhcnRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4RW5kVmFsaWRhdGUnKVxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXG4gIHByb3RlY3RlZCBlbmRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlRm9jdXMnKVxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4Rm9jdXMnKVxuICBAT3B0aW9uKCdmb2N1cycpXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlTG9zdEZvY3VzJylcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4TG9zdEZvY3VzJylcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhbmdlJylcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4Q2hhbmdlJylcbiAgQE9wdGlvbignY2hhbmdlJylcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RJdGVtc1xuICBAT3V0cHV0KCdwaHhCZWZvcmVTZWxlY3QnKVxuICBAT3B0aW9uKCdiZWZvcmVTZWxlY3QnKVxuICBwcm90ZWN0ZWQgYmVmb3JlU2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhTZWxlY3QnKVxuICBAT3B0aW9uKCdzZWxlY3QnKVxuICBwcm90ZWN0ZWQgc2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdE9uZUl0ZW1cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTaW1wbGVEcm9wZG93blxuICBAT3V0cHV0KCdwaHhCZWZvcmVDbGljaycpXG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcbiAgcHJvdGVjdGVkIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhDbGljaycpXG4gIEBPcHRpb24oJ2NsaWNrJylcbiAgcHJvdGVjdGVkIGNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVTaG93JylcbiAgQE9wdGlvbignYmVmb3JlU2hvdycpXG4gIHByb3RlY3RlZCBiZWZvcmVTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhTaG93JylcbiAgQE9wdGlvbignc2hvdycpXG4gIHByb3RlY3RlZCBzaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVIaWRlJylcbiAgQE9wdGlvbignYmVmb3JlSGlkZScpXG4gIHByb3RlY3RlZCBiZWZvcmVIaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhIaWRlJylcbiAgQE9wdGlvbignaGlkZScpXG4gIHByb3RlY3RlZCBoaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UsIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHBobG94QXBwSW5mb1NlcnZpY2U6IFBobG94QXBwSW5mb1NlcnZpY2UpIHtcbiAgICBzdXBlcihuZWVkRm9jdXNTZXJ2aWNlLCBlbGVtZW50UmVmLCBwaGxveEFwcEluZm9TZXJ2aWNlKTtcblxuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLmdyYWRpZW50TGV2ZWxNYXAgPSB7fTtcbiAgICB0aGlzLmJhc2VTYXR1cmF0aW9uID0gMjU7XG4gICAgdGhpcy5iYXNlQnJpZ2h0ID0gMjU7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGlmICh0aGlzLnBpZ21lbnRDb2xvcnMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMucGlnbWVudENvbG9ycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuc2V0UGlnbWVudENvbG9ycyh0aGlzLnBpZ21lbnRDb2xvcnMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZEl0ZW1IZXhDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdGVkSXRlbSgpLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgX3Nob3dOZXdMaW5lKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5waWdtZW50Q29sb3JzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBpZ21lbnRDb2xvcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgcGlnbWVudENvbG9yc0NvdW50ID0gdGhpcy5waWdtZW50Q29sb3JzLmxlbmd0aDtcblxuICAgICAgbGV0IGNvdW50ID0gaW5kZXggKyAxO1xuICAgICAgaWYgKGNvdW50ICUgcGlnbWVudENvbG9yc0NvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldEZha2VHcmFkaWVudExldmVsQXJyYXkoKTogYW55W10ge1xuICAgIGxldCBmYWtlQXJyYXk6IGFueVtdID0gW107XG5cbiAgICBpZiAodGhpcy5ncmFkaWVudExldmVsID4gMCkge1xuICAgICAgZmFrZUFycmF5ID0gbmV3IEFycmF5KHRoaXMuZ3JhZGllbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZha2VBcnJheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hhZGVDb2xvckl0ZW1zTGV2ZWwobGV2ZWw6IG51bWJlcik6IENvbG9yU2VsZWN0SXRlbU1vZGVsW10ge1xuICAgIGxldCByZXN1bHQ6IENvbG9yU2VsZWN0SXRlbU1vZGVsW10gPSBbXTtcblxuICAgIGlmIChsZXZlbCA+PSAwKSB7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nID0gaXRlbS5nZXRWYWx1ZSgpO1xuICAgICAgICBsZXQgbGV2ZWxBcnJheSA9IHRoaXMuZ3JhZGllbnRMZXZlbE1hcFtrZXldO1xuICAgICAgICBpZiAobGV2ZWxBcnJheSAhPT0gbnVsbCAmJiB0eXBlb2YgbGV2ZWxBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAobGV2ZWwgPCBsZXZlbEFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IENvbG9yU2VsZWN0SXRlbU1vZGVsKGxldmVsQXJyYXlbbGV2ZWxdLCBsZXZlbEFycmF5W2xldmVsXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XG4gICAgLy8hIGRvIHN0aGluZ1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiLnN3YXRjaCA+IGJ1dHRvblwiKS5mb2N1cygpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGVcbiAgcHJvdGVjdGVkIGRvQmx1cigkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChcIi5zd2F0Y2ggPiBidXR0b25cIikuYmx1cigpO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGVcbiAgcHJvdGVjdGVkIGdldERyb3Bkb3duUG9wdXBTZWxlY3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1lbnUnO1xuICB9XG5cbiAgcHVibGljIHNldFBpZ21lbnRDb2xvcnMoY29sb3JNb2RlbDogQ29sb3JNb2RlbFtdKTogdm9pZCB7XG4gICAgdGhpcy5waWdtZW50Q29sb3JzID0gY29sb3JNb2RlbDtcbiAgICB0aGlzLml0ZW1zID0gW107XG4gICAgdGhpcy5ncmFkaWVudExldmVsTWFwID0ge307XG4gICAgaWYgKHRoaXMucGlnbWVudENvbG9ycyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5waWdtZW50Q29sb3JzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHBlcmNlbnRTaGFkZSA9IDEwMDtcbiAgICAgIGlmICh0aGlzLmdyYWRpZW50TGV2ZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZ3JhZGllbnRMZXZlbCA9PT0gJ251bWJlcicgJiYgdGhpcy5ncmFkaWVudExldmVsID4gMCkge1xuICAgICAgICBwZXJjZW50U2hhZGUgPSBNYXRoLnJvdW5kKHBlcmNlbnRTaGFkZSAvIHRoaXMuZ3JhZGllbnRMZXZlbCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGNvbG9yIG9mIHRoaXMucGlnbWVudENvbG9ycykge1xuICAgICAgICBsZXQga2V5ID0gY29sb3IudmFsdWU7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaChuZXcgQ29sb3JTZWxlY3RJdGVtTW9kZWwoY29sb3IubmFtZSwgY29sb3IudmFsdWUpKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGllbnRMZXZlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5ncmFkaWVudExldmVsID09PSAnbnVtYmVyJyAmJiB0aGlzLmdyYWRpZW50TGV2ZWwgPiAwKSB7XG4gICAgICAgICAgbGV0IGdyTFZBcnJheTogYW55W10gPSBbXTtcbiAgICAgICAgICBsZXQgcGlnbWVudEhleDogc3RyaW5nID0gY29sb3IudmFsdWU7XG5cbiAgICAgICAgICBsZXQgaHNsOiBudW1iZXJbXSA9IENvbG9yVXRpbHMuaGV4VG9Ic2wocGlnbWVudEhleCk7XG4gICAgICAgICAgbGV0IGh1ZTogbnVtYmVyID0gTWF0aC5yb3VuZChoc2xbMF0gKiAzNjApO1xuICAgICAgICAgIGxldCBzYXR1cmF0aW9uOiBudW1iZXIgPSBNYXRoLnJvdW5kKGhzbFsxXSAqIDEwMCk7XG4gICAgICAgICAgbGV0IGJyOiBudW1iZXIgPSBNYXRoLnJvdW5kKGhzbFsyXSAqIDEwMCk7XG5cbiAgICAgICAgICBsZXQgYmFzZVNhdDogbnVtYmVyID0gdGhpcy5iYXNlU2F0dXJhdGlvbjtcbiAgICAgICAgICBsZXQgYmFzZUJyOiBudW1iZXIgPSB0aGlzLmJhc2VCcmlnaHQ7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ3JhZGllbnRMZXZlbDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV3U2hhZGUgPSBDb2xvclV0aWxzLmhzYlRvSGV4KGh1ZSwgc2F0dXJhdGlvbiAtIGJhc2VTYXQsIGJyICsgYmFzZUJyKTtcbiAgICAgICAgICAgIG5ld1NoYWRlID0gbmV3U2hhZGUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGdyTFZBcnJheS5wdXNoKG5ld1NoYWRlKTtcbiAgICAgICAgICAgIHBpZ21lbnRIZXggPSBuZXdTaGFkZTtcblxuICAgICAgICAgICAgLy8gdGVzdGluZ1xuICAgICAgICAgICAgLy8gdGhpcy5pdGVtcy5wdXNoKG5ldyBDb2xvclNlbGVjdEl0ZW1Nb2RlbChuZXdTaGFkZSwgbmV3U2hhZGUpKTtcbiAgICAgICAgICAgIGJhc2VTYXQgKz0gNTtcbiAgICAgICAgICAgIGJhc2VCciAtPSA1O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdyYWRpZW50TGV2ZWxNYXBba2V5XSA9IGdyTFZBcnJheTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGRpbmcgZm9yIHNoYWRpbmdcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ncmFkaWVudExldmVsOyBpKyspIHtcbiAgICAgICAgbGV0IHNoYWRpbmdJdGVtcyA9IHRoaXMuZ2V0U2hhZGVDb2xvckl0ZW1zTGV2ZWwoaSk7XG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2Ygc2hhZGluZ0l0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkSXRlbSgpOiBDb2xvclNlbGVjdEl0ZW1Nb2RlbCB7XG4gICAgbGV0IHNJdGVtID0gc3VwZXIuZ2V0U2VsZWN0ZWRJdGVtKCk7XG5cbiAgICBpZiAoc0l0ZW0gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNJdGVtIGFzIENvbG9yU2VsZWN0SXRlbU1vZGVsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbXMoKTogQ29sb3JTZWxlY3RJdGVtTW9kZWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RHJvcGRvd25XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duV2lkdGg7XG4gIH1cblxufVxuIl19