com.phloxui
Version:
PhloxUI Ng2+ Framework
670 lines (669 loc) • 48.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, ViewChild, EventEmitter } from '@angular/core';
import { I18N } from '../../../../../decorator/I18N.decorator';
import { Option } from '../../../../../decorator/Option.decorator';
import { AbstractSelectItems } from '../../../../../component/dataview/input/AbstractSelectItems';
import { NeedFocusService } from '../../../../../service/NeedFocusService.service';
import { EventUtils } from '../../../../../share/utils/EventUtils';
import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../../../../../share/CustomEventType';
import { MatButtonToggleGroup } from '@angular/material';
var /** @type {?} */ TYPE_NAME = "material-button-toggle";
var MaterialButtonToggle = /** @class */ (function (_super) {
tslib_1.__extends(MaterialButtonToggle, _super);
function MaterialButtonToggle(elementRef, needFocusService) {
var _this = _super.call(this, elementRef, needFocusService) || this;
_this.beforeClickEvent = new EventEmitter();
_this.clickEvent = new EventEmitter();
_this.beforeFocusEvent = new EventEmitter();
_this.focusEvent = new EventEmitter();
_this.beforeLostFocusEvent = new EventEmitter();
_this.lostFocusEvent = new EventEmitter();
_this.selectEvent = new EventEmitter();
_this.beforeSelectEvent = new EventEmitter();
_this.multiple = false;
return _this;
}
/**
* @return {?}
*/
MaterialButtonToggle.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
setTimeout(function () {
_this.initEventHandlers();
}, 20);
};
/**
* @param {?} $event
* @param {?} index
* @return {?}
*/
MaterialButtonToggle.prototype.setSelectedItem = /**
* @param {?} $event
* @param {?} index
* @return {?}
*/
function ($event, index) {
var /** @type {?} */ oldIndexes = this.getSelectedIndexes();
var /** @type {?} */ item = this.getItemAtIndex(index);
var /** @type {?} */ oldDatas = [];
var /** @type {?} */ newDatas = [];
if (oldIndexes !== null && oldIndexes !== undefined) {
try {
for (var oldIndexes_1 = tslib_1.__values(oldIndexes), oldIndexes_1_1 = oldIndexes_1.next(); !oldIndexes_1_1.done; oldIndexes_1_1 = oldIndexes_1.next()) {
var oldIndex = oldIndexes_1_1.value;
oldDatas.push(this.getItemAtIndex(oldIndex));
newDatas.push(this.getItemAtIndex(oldIndex));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (oldIndexes_1_1 && !oldIndexes_1_1.done && (_a = oldIndexes_1.return)) _a.call(oldIndexes_1);
}
finally { if (e_1) throw e_1.error; }
}
}
if (oldDatas.indexOf(item) === -1) {
newDatas.push(item);
}
else {
newDatas.splice(oldDatas.indexOf(item), 1);
}
this.setSelectedItems(newDatas);
var e_1, _a;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.getItems = /**
* @return {?}
*/
function () {
return this.items;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.isDisableRipple = /**
* @return {?}
*/
function () {
return this.disableRipple;
};
/**
* @param {?} disableRipple
* @return {?}
*/
MaterialButtonToggle.prototype.setDisableRipple = /**
* @param {?} disableRipple
* @return {?}
*/
function (disableRipple) {
this.disableRipple = disableRipple;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.isMultiple = /**
* @return {?}
*/
function () {
return this.multiple;
};
/**
* @param {?} multiple
* @return {?}
*/
MaterialButtonToggle.prototype.setMultiple = /**
* @param {?} multiple
* @return {?}
*/
function (multiple) {
this.multiple = multiple;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.toggle = /**
* @return {?}
*/
function () {
this.multiple = !this.multiple;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.isDisabledRipple = /**
* @return {?}
*/
function () {
return this.disableRipple;
};
/**
* @param {?} disableRipple
* @return {?}
*/
MaterialButtonToggle.prototype.setDisabledRipple = /**
* @param {?} disableRipple
* @return {?}
*/
function (disableRipple) {
this.disableRipple = disableRipple;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.isVertical = /**
* @return {?}
*/
function () {
return this.vertical;
};
/**
* @param {?} vertical
* @return {?}
*/
MaterialButtonToggle.prototype.setVertical = /**
* @param {?} vertical
* @return {?}
*/
function (vertical) {
this.vertical = vertical;
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.isChecked = /**
* @return {?}
*/
function () {
return this.checked;
};
/**
* @param {?} checked
* @return {?}
*/
MaterialButtonToggle.prototype.setChecked = /**
* @param {?} checked
* @return {?}
*/
function (checked) {
this.checked = checked;
};
/**
* @param {?} $event
* @param {?} i
* @return {?}
*/
MaterialButtonToggle.prototype.onChange = /**
* @param {?} $event
* @param {?} i
* @return {?}
*/
function ($event, i) {
if ($event.value !== null && $event.value !== undefined) {
}
};
/**
* @param {?} $event
* @return {?}
*/
MaterialButtonToggle.prototype.onFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.setFocusingComponent(this, $event);
};
/**
* @param {?} $event
* @return {?}
*/
MaterialButtonToggle.prototype.onLostFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.resetFocusingComponent($event);
};
/**
* @return {?}
*/
MaterialButtonToggle.prototype.initEventHandlers = /**
* @return {?}
*/
function () {
var _this = this;
$(this.elementRef.nativeElement).find('button.mat-button-toggle-button').focus(function ($event) {
_this.onFocusing($event);
});
$(this.elementRef.nativeElement).find('button.mat-button-toggle-button').blur(function ($event) {
_this.onLostFocusing($event);
});
};
/**
* @param {?} $event
* @param {?} index
* @param {?=} fireEvent
* @return {?}
*/
MaterialButtonToggle.prototype.onClick = /**
* @param {?} $event
* @param {?} index
* @param {?=} fireEvent
* @return {?}
*/
function ($event, index, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
if (this.beforeClickEvent.observers.length > 0 && fireEvent) {
if (!this._beforeClickInited) {
this.beforeClickEvent.subscribe(function ($event) {
if (!$event.defaultPrevented) {
_this.setSelectedItem($event, index);
_this.emitClickEvent($event);
}
});
this._beforeClickInited = true;
}
this.emitBeforeClickEvent($event);
}
else {
if (fireEvent) {
this.setSelectedItem($event, index);
this.emitClickEvent($event);
}
}
};
/**
* @param {?=} $event
* @return {?}
*/
MaterialButtonToggle.prototype.emitBeforeClickEvent = /**
* @param {?=} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ eventData = null;
// emit event
var /** @type {?} */ data = eventData;
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) {
this.beforeClickEvent.emit(ev);
}
};
/**
* @param {?=} $event
* @return {?}
*/
MaterialButtonToggle.prototype.emitClickEvent = /**
* @param {?=} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ eventData = null;
// emit event
var /** @type {?} */ data = eventData;
var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
if (this.clickEvent !== null && this.clickEvent !== undefined) {
this.clickEvent.emit(ev);
}
};
/**
* @param {?} $event
* @return {?}
*/
MaterialButtonToggle.prototype.doFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($(this.elementRef.nativeElement).find('button.mat-button-toggle-button:focus').length <= 0) {
$(this.elementRef.nativeElement).find('button.mat-button-toggle-button').focus();
}
};
/**
* @param {?} $event
* @return {?}
*/
MaterialButtonToggle.prototype.doLostFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if ($(this.elementRef.nativeElement).find('button.mat-button-toggle-button:focus').length > 0) {
$(this.elementRef.nativeElement).find('button.mat-button-toggle-button').blur();
}
};
/**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
MaterialButtonToggle.prototype.onValidationEnd = /**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
function (inputValue, results) {
};
/**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
MaterialButtonToggle.prototype.onDataChange = /**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
function (data, inputVal) {
};
MaterialButtonToggle.TYPE_NAME = TYPE_NAME;
MaterialButtonToggle.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: "<div class=\"material-input\">\n <mat-button-toggle-group #group=\"matButtonToggleGroup\" multiple *ngIf=\"isMultiple() === true\" [vertical]=\"isVertical()\">\n <mat-button-toggle [value]=\"item.value\" *ngFor=\"let item of getItems(); let i = index\" [disabled]=\"isDisabled()\" [disableRipple]=\"isDisabledRipple()\" [checked]=\"isChecked()\" (change)=\"onChange($event, i)\" (click)=\"onClick($event, i)\">\n <mat-icon>{{ item.label }}</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <mat-button-toggle-group #group=\"matButtonToggleGroup\" *ngIf=\"isMultiple() === false\" [vertical]=\"isVertical()\">\n <mat-button-toggle [value]=\"item.value\" *ngFor=\"let item of getItems(); let i = index\" [disabled]=\"isDisabled()\" [disableRipple]=\"isDisabledRipple()\" [checked]=\"isChecked()\" (change)=\"onChange($event, i)\" (click)=\"onClick($event, i)\">\n <mat-icon>{{ item.label }}</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>",
},] },
];
/** @nocollapse */
MaterialButtonToggle.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: NeedFocusService, },
]; };
MaterialButtonToggle.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 },],
"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',] },],
"value": [{ type: Input },],
"multiple": [{ type: Input },],
"vertical": [{ type: Input },],
"disableRipple": [{ type: Input },],
"checked": [{ type: Input },],
"beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },],
"clickEvent": [{ type: Output, args: ['phxClick',] },],
"group": [{ type: ViewChild, args: ['group',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialButtonToggle.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialButtonToggle.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], MaterialButtonToggle.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], MaterialButtonToggle.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialButtonToggle.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialButtonToggle.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialButtonToggle.prototype, "name", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialButtonToggle.prototype, "typeOfData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "readOnly", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialButtonToggle.prototype, "help", void 0);
tslib_1.__decorate([
Option('comparator'),
tslib_1.__metadata("design:type", Object)
], MaterialButtonToggle.prototype, "dataComparator", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Array)
], MaterialButtonToggle.prototype, "items", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "endValidateEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "beforeChangeEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeSelect'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "beforeSelectEvent", void 0);
tslib_1.__decorate([
Option('select'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "selectEvent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialButtonToggle.prototype, "value", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "multiple", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "vertical", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "disableRipple", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialButtonToggle.prototype, "checked", void 0);
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialButtonToggle.prototype, "clickEvent", void 0);
tslib_1.__decorate([
I18N(),
tslib_1.__metadata("design:type", MatButtonToggleGroup)
], MaterialButtonToggle.prototype, "group", void 0);
return MaterialButtonToggle;
}(AbstractSelectItems));
export { MaterialButtonToggle };
function MaterialButtonToggle_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MaterialButtonToggle.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MaterialButtonToggle.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MaterialButtonToggle.propDecorators;
/** @type {?} */
MaterialButtonToggle.TYPE_NAME;
/** @type {?} */
MaterialButtonToggle.prototype.dataParent;
/** @type {?} */
MaterialButtonToggle.prototype.ignoreParentData;
/** @type {?} */
MaterialButtonToggle.prototype.data;
/** @type {?} */
MaterialButtonToggle.prototype.ignoreParentDisabled;
/** @type {?} */
MaterialButtonToggle.prototype.delegateHistory;
/** @type {?} */
MaterialButtonToggle.prototype.onDisabled;
/** @type {?} */
MaterialButtonToggle.prototype.onEnabled;
/** @type {?} */
MaterialButtonToggle.prototype.loadingEnabled;
/** @type {?} */
MaterialButtonToggle.prototype.i18nKey;
/** @type {?} */
MaterialButtonToggle.prototype.bypass;
/** @type {?} */
MaterialButtonToggle.prototype.options;
/** @type {?} */
MaterialButtonToggle.prototype.disabled;
/** @type {?} */
MaterialButtonToggle.prototype.field;
/** @type {?} */
MaterialButtonToggle.prototype.name;
/** @type {?} */
MaterialButtonToggle.prototype.typeOfData;
/** @type {?} */
MaterialButtonToggle.prototype.readOnly;
/** @type {?} */
MaterialButtonToggle.prototype.help;
/** @type {?} */
MaterialButtonToggle.prototype.dataComparator;
/** @type {?} */
MaterialButtonToggle.prototype.items;
/** @type {?} */
MaterialButtonToggle.prototype.loadEvent;
/** @type {?} */
MaterialButtonToggle.prototype.startValidateEvent;
/** @type {?} */
MaterialButtonToggle.prototype.endValidateEvent;
/** @type {?} */
MaterialButtonToggle.prototype.beforeFocusEvent;
/** @type {?} */
MaterialButtonToggle.prototype.focusEvent;
/** @type {?} */
MaterialButtonToggle.prototype.beforeLostFocusEvent;
/** @type {?} */
MaterialButtonToggle.prototype.lostFocusEvent;
/** @type {?} */
MaterialButtonToggle.prototype.beforeChangeEvent;
/** @type {?} */
MaterialButtonToggle.prototype.changeEvent;
/** @type {?} */
MaterialButtonToggle.prototype.beforeSelectEvent;
/** @type {?} */
MaterialButtonToggle.prototype.selectEvent;
/** @type {?} */
MaterialButtonToggle.prototype.value;
/** @type {?} */
MaterialButtonToggle.prototype.multiple;
/** @type {?} */
MaterialButtonToggle.prototype.vertical;
/** @type {?} */
MaterialButtonToggle.prototype.disableRipple;
/** @type {?} */
MaterialButtonToggle.prototype.checked;
/** @type {?} */
MaterialButtonToggle.prototype.beforeClickEvent;
/** @type {?} */
MaterialButtonToggle.prototype.clickEvent;
/** @type {?} */
MaterialButtonToggle.prototype.group;
/** @type {?} */
MaterialButtonToggle.prototype._beforeClickInited;
/** @type {?} */
MaterialButtonToggle.prototype.array;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxCdXR0b25Ub2dnbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvdGhlbWUvbWF0ZXJpYWwvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L01hdGVyaWFsQnV0dG9uVG9nZ2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWdCLFNBQVMsRUFBaUIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25JLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQW9FLE1BQU0sc0NBQXNDLENBQUM7QUFDekosT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHekQscUJBQU0sU0FBUyxHQUFXLHdCQUF3QixDQUFDOztJQWtCVCxnREFBbUI7SUF3STNELDhCQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQXRFLFlBQ0Usa0JBQU0sVUFBVSxFQUFFLGdCQUFnQixDQUFDLFNBV3BDO1FBVEMsS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLEtBQUksQ0FB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TSxDQUFDLGFBQWEsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQzswQ0FDTSxZQUFZOzs7UUFDakMsSUFBSSxFQUFFOzBDQUVRLG9CQUFvQjs7K0JBbktyQztFQWdDMEMsbUJBQW1CO1NBQWhELG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBIb3N0TGlzdGVuZXIsIFZpZXdDaGlsZCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JSGFzRGF0YSc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgQWJzdHJhY3RTZWxlY3RJdGVtcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdFNlbGVjdEl0ZW1zJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL0RlZmF1bHRTZWxlY3RJdGVtTW9kZWwnO1xyXG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSURhdGFDb21wYXJhdG9yJztcclxuaW1wb3J0IHsgQ0xJQ0tfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCwgRk9DVVNfRVZFTlQsIExPU1RfRk9DVVNfRVZFTlQsIFNFTEVDVF9FVkVOVCwgQkVGT1JFX1NFTEVDVF9FVkVOVCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvblRvZ2dsZUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xyXG5cclxuXHJcbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJtYXRlcmlhbC1idXR0b24tdG9nZ2xlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwibWF0ZXJpYWwtaW5wdXRcIj5cclxuICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgI2dyb3VwPVwibWF0QnV0dG9uVG9nZ2xlR3JvdXBcIiBtdWx0aXBsZSAqbmdJZj1cImlzTXVsdGlwbGUoKSA9PT0gdHJ1ZVwiIFt2ZXJ0aWNhbF09XCJpc1ZlcnRpY2FsKClcIj5cclxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEl0ZW1zKCk7IGxldCBpID0gaW5kZXhcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgW2Rpc2FibGVSaXBwbGVdPVwiaXNEaXNhYmxlZFJpcHBsZSgpXCIgW2NoZWNrZWRdPVwiaXNDaGVja2VkKClcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudCwgaSlcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQsIGkpXCI+XHJcbiAgICAgIDxtYXQtaWNvbj57eyBpdGVtLmxhYmVsIH19PC9tYXQtaWNvbj5cclxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgI2dyb3VwPVwibWF0QnV0dG9uVG9nZ2xlR3JvdXBcIiAqbmdJZj1cImlzTXVsdGlwbGUoKSA9PT0gZmFsc2VcIiBbdmVydGljYWxdPVwiaXNWZXJ0aWNhbCgpXCI+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRJdGVtcygpOyBsZXQgaSA9IGluZGV4XCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiIFtkaXNhYmxlUmlwcGxlXT1cImlzRGlzYWJsZWRSaXBwbGUoKVwiIFtjaGVja2VkXT1cImlzQ2hlY2tlZCgpXCIgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIGkpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50LCBpKVwiPlxyXG4gICAgICA8bWF0LWljb24+e3sgaXRlbS5sYWJlbCB9fTwvbWF0LWljb24+XHJcbiAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XHJcbjwvZGl2PmAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbEJ1dHRvblRvZ2dsZSBleHRlbmRzIEFic3RyYWN0U2VsZWN0SXRlbXMgaW1wbGVtZW50cyBPbkluaXQsIElIYXNEYXRhIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBuYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdHlwZU9mRGF0YTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHJlYWRPbmx5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RJdGVtc1xyXG4gIEBJbnB1dCgnY29tcGFyYXRvcicpXHJcbiAgQE9wdGlvbignY29tcGFyYXRvcicpXHJcbiAgcHJvdGVjdGVkIGRhdGFDb21wYXJhdG9yOiBJRGF0YUNvbXBhcmF0b3I8YW55PjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpdGVtczogRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbFtdO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBAT3V0cHV0KCdwaHhMb2FkJylcclxuICBAT3B0aW9uKCdsb2FkJylcclxuICBwcm90ZWN0ZWQgbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XHJcbiAgQE91dHB1dCgncGh4U3RhcnRWYWxpZGF0ZScpXHJcbiAgQE9wdGlvbignc3RhcnRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4RW5kVmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ2VuZFZhbGlkYXRlJylcclxuICBwcm90ZWN0ZWQgZW5kVmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlRm9jdXMnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlRm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2ZvY3VzJylcclxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlTG9zdEZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVMb3N0Rm9jdXMnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4TG9zdEZvY3VzJylcclxuICBAT3B0aW9uKCdsb3N0Rm9jdXMnKVxyXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhbmdlJylcclxuICBAT3B0aW9uKCdiZWZvcmVDaGFuZ2UnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4Q2hhbmdlJylcclxuICBAT3B0aW9uKCdjaGFuZ2UnKVxyXG4gIHByb3RlY3RlZCBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RJdGVtc1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0U2VsZWN0T25lSXRlbVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZVNlbGVjdCcpXHJcbiAgQE9wdGlvbignYmVmb3JlU2VsZWN0JylcclxuICBwcm90ZWN0ZWQgYmVmb3JlU2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeFNlbGVjdCcpXHJcbiAgQE9wdGlvbignc2VsZWN0JylcclxuICBwcm90ZWN0ZWQgc2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICAvLyAtLS0gZnJvbSBzZWxmXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdmFsdWU6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBtdWx0aXBsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCB2ZXJ0aWNhbDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlUmlwcGxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGNoZWNrZWQ6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2xpY2snKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4Q2xpY2snKVxyXG4gIEBPcHRpb24oJ2NsaWNrJylcclxuICBwcm90ZWN0ZWQgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQEkxOE4oKVxyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwJylcclxuICBwcml2YXRlIGdyb3VwOiBNYXRCdXR0b25Ub2dnbGVHcm91cDtcclxuXHJcbiAgcHJpdmF0ZSBfYmVmb3JlQ2xpY2tJbml0ZWQ6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBhcnJheTogYW55W107XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlRm9jdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuZm9jdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmxvc3RGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5zZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlU2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm11bHRpcGxlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcnMoKTtcclxuICAgIH0sMjApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGVkSXRlbSgkZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IG9sZEluZGV4ZXM6IG51bWJlcltdID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0SXRlbUF0SW5kZXgoaW5kZXgpO1xyXG5cclxuICAgIGxldCBvbGREYXRhczogYW55ID0gW107XHJcbiAgICBsZXQgbmV3RGF0YXM6IGFueSA9IFtdO1xyXG5cclxuICAgIGlmIChvbGRJbmRleGVzICE9PSBudWxsICYmIG9sZEluZGV4ZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGxldCBvbGRJbmRleCBvZiBvbGRJbmRleGVzKSB7XHJcbiAgICAgICAgb2xkRGF0YXMucHVzaCh0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSk7XHJcbiAgICAgICAgbmV3RGF0YXMucHVzaCh0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob2xkRGF0YXMuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHtcclxuICAgICAgbmV3RGF0YXMucHVzaChpdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0RhdGFzLnNwbGljZShvbGREYXRhcy5pbmRleE9mKGl0ZW0pLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbXMobmV3RGF0YXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEl0ZW1zKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRGlzYWJsZVJpcHBsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVSaXBwbGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGlzYWJsZVJpcHBsZShkaXNhYmxlUmlwcGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVSaXBwbGUgPSBkaXNhYmxlUmlwcGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTXVsdGlwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRNdWx0aXBsZShtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5tdWx0aXBsZSA9IG11bHRpcGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubXVsdGlwbGUgPSAhdGhpcy5tdWx0aXBsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Rpc2FibGVkUmlwcGxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVJpcHBsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREaXNhYmxlZFJpcHBsZShkaXNhYmxlUmlwcGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVSaXBwbGUgPSBkaXNhYmxlUmlwcGxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVmVydGljYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWZXJ0aWNhbCh2ZXJ0aWNhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQ2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2hlY2tlZChjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKCRldmVudDogYW55LCBpOm51bWJlcik6IHZvaWQge1xyXG4gICAgaWYoJGV2ZW50LnZhbHVlICE9PSBudWxsICYmICRldmVudC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0RXZlbnRIYW5kbGVycygpOiB2b2lkIHtcclxuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b24nKS5mb2N1cygoJGV2ZW50KT0+e1xyXG4gICAgICB0aGlzLm9uRm9jdXNpbmcoJGV2ZW50KTtcclxuICAgIH0pXHJcblxyXG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbicpLmJsdXIoKCRldmVudCk9PntcclxuICAgICAgdGhpcy5vbkxvc3RGb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljaygkZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyLCBmaXJlRXZlbnQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5vYnNlcnZlcnMubGVuZ3RoID4gMCAmJiBmaXJlRXZlbnQpIHtcclxuICAgICAgaWYgKCF0aGlzLl9iZWZvcmVDbGlja0luaXRlZCkge1xyXG4gICAgICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5zdWJzY3JpYmUoKCRldmVudDogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgaWYgKCEkZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkSXRlbSgkZXZlbnQsIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2xpY2tFdmVudCgkZXZlbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2JlZm9yZUNsaWNrSW5pdGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGZpcmVFdmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtKCRldmVudCwgaW5kZXgpO1xyXG4gICAgICAgIHRoaXMuZW1pdENsaWNrRXZlbnQoJGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYmVmb3JlQ2xpY2tFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQuZW1pdChldik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdENsaWNrRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8vIGVtaXQgZXZlbnRcclxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KENMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5jbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbjpmb2N1cycpLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b24nKS5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmKCQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246Zm9jdXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b24nKS5ibHVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=