com.phloxui
Version:
PhloxUI Ng2+ Framework
736 lines (735 loc) • 53.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core';
import { AbstractHasFormatterInputDataView } from './AbstractHasFormatterInputDataView';
import { BEFORE_KEY_UP_EVENT, KEY_UP_EVENT, BEFORE_KEY_DOWN_EVENT, KEY_DOWN_EVENT } from '../../../share/CustomEventType';
import { Option } from '../../../decorator/Option.decorator';
import { I18N } from '../../../decorator/I18N.decorator';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
import { EventUtils } from '../../../share/utils/EventUtils';
import { FormatterFactory } from '../../../service/FormatterFactory.service';
const /** @type {?} */ TYPE_NAME = "phx-text-box";
export class TextBox extends AbstractHasFormatterInputDataView {
/**
* @param {?} elementRef
* @param {?} formatterFactory
* @param {?} needFocusService
*/
constructor(elementRef, formatterFactory, needFocusService) {
super(elementRef, formatterFactory, needFocusService);
this.beforeKeyUpEvent = new EventEmitter();
this.keyUpEvent = new EventEmitter();
this.beforeKeyDownEvent = new EventEmitter();
this.keyDownEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
this.checkType();
}
/**
* @return {?}
*/
revertOriginalToData() {
this.formattedData = this.originalValue;
}
/**
* @return {?}
*/
checkType() {
if (this.type === null || this.type === undefined || typeof this.type !== 'string' || this.type === '') {
this.type = 'text';
}
if (this.type.trim().toLowerCase() !== 'text'
&& this.type.trim().toLowerCase() !== 'password'
&& this.type.trim().toLowerCase() !== 'number') {
// Only allow to possible values.
// If not, use default value as "text".
this.type = 'text';
}
}
/**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
onValidationEnd(inputValue, results) {
//! do sthing
}
/**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
onDataChange(data, inputVal) {
}
/**
* @param {?} $event
* @return {?}
*/
doFocus($event) {
if (this.elementRef) {
$(this.elementRef.nativeElement).find('input').focus();
}
}
/**
* @param {?} inputVal
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
setInputValue(inputVal, $event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
let /** @type {?} */ oldValue = this.getInputValue();
EventUtils.handleBrowserEvent(this, 'beforeChangeEvent', $event, fireEvent, ($event) => {
// doEvent
// Set input value into data object.
this._setValueToData(inputVal);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeChangeEvent(oldValue, inputVal, true, $event);
}, ($event) => {
// emitAfterEvent
this.emitChangeEvent(oldValue, inputVal, true, $event);
}, ($event) => {
// doPrevented
if ($event !== null && $event !== undefined) {
(/** @type {?} */ ($event.target)).value = (oldValue !== null && oldValue !== undefined) ? oldValue : "";
}
}, 'inputValue');
}
/**
* @param {?} $event
* @return {?}
*/
doLostFocus($event) {
}
/**
* @param {?} $event
* @return {?}
*/
doKeyUp($event) {
}
/**
* @param {?} $event
* @return {?}
*/
doKeyDown($event) {
}
/**
* @param {?} $event
* @return {?}
*/
emitBeforeKeyUpEvent($event) {
let /** @type {?} */ inputText = null;
try {
inputText = (/** @type {?} */ ($event.target)).value.toString();
}
catch (/** @type {?} */ e) {
}
let /** @type {?} */ data = {
data: this.data,
value: inputText
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_KEY_UP_EVENT, this, data, $event);
this.beforeKeyUpEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitKeyUpEvent($event) {
let /** @type {?} */ inputText = null;
try {
inputText = (/** @type {?} */ ($event.target)).value.toString();
}
catch (/** @type {?} */ e) {
}
let /** @type {?} */ data = {
data: this.data,
value: inputText
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(KEY_UP_EVENT, this, data, $event);
this.keyUpEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitBeforeKeyDownEvent($event) {
let /** @type {?} */ inputText = null;
try {
inputText = (/** @type {?} */ ($event.target)).value.toString();
}
catch (/** @type {?} */ e) {
}
let /** @type {?} */ data = {
data: this.data,
value: inputText
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_KEY_DOWN_EVENT, this, data, $event);
this.beforeKeyDownEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitKeyDownEvent($event) {
let /** @type {?} */ inputText = null;
try {
inputText = (/** @type {?} */ ($event.target)).value.toString();
}
catch (/** @type {?} */ e) {
}
let /** @type {?} */ data = {
data: this.data,
value: inputText
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(KEY_DOWN_EVENT, this, data, $event);
this.keyDownEvent.emit(ev);
}
/**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
onKeyUp($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeKeyUpEvent', $event, fireEvent, ($event) => {
// doEvent
this.doKeyUp($event);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeKeyUpEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitKeyUpEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
onKeyDown($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeKeyDownEvent', $event, fireEvent, ($event) => {
// doEvent
this.doKeyDown($event);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeKeyDownEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitKeyDownEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?} $event
* @return {?}
*/
onValueChanged($event) {
let /** @type {?} */ inputText = null;
try {
inputText = (/** @type {?} */ ($event.target)).value.toString();
}
catch (/** @type {?} */ e) {
}
this.setFormattedData(inputText, $event);
}
/**
* @param {?} $event
* @return {?}
*/
onFocusing($event) {
this.needFocusService.setFocusingComponent(this, $event);
}
/**
* @param {?} $event
* @return {?}
*/
onLostFocusing($event) {
this.needFocusService.resetFocusingComponent($event);
}
/**
* @return {?}
*/
isSelfDataDirty() {
let /** @type {?} */ d1 = (this.originalValue === null || typeof this.originalValue === 'undefined') ? '' : this.originalValue;
let /** @type {?} */ d2 = (this.formattedData === null || typeof this.formattedData === 'undefined') ? '' : this.formattedData;
// check array open this is u want to check array
try {
let /** @type {?} */ jsonD1 = JSON.stringify(d1);
let /** @type {?} */ jsonD2 = JSON.stringify(d2);
if (jsonD1 !== jsonD2) {
return true;
}
else {
return false;
}
}
catch (/** @type {?} */ error) {
// error
}
if (d1 !== d2) {
return true;
}
return false;
}
/**
* @param {?} data
* @return {?}
*/
setData(data) {
super.setData(data);
if (!this._isSetOriginal) {
this.originalValue = AbstractHasFormatterInputDataView.resolveFormattedData(this.formatter, AbstractHasFormatterInputDataView.resolveInputValue(this.field, data));
this._isSetOriginal = true;
}
}
/**
* @param {?} data
* @return {?}
*/
selfSaveData(data) {
this.originalValue = AbstractHasFormatterInputDataView.resolveFormattedData(this.formatter, AbstractHasFormatterInputDataView.resolveInputValue(this.field, data));
}
/**
* @return {?}
*/
selfResetData() {
this.revertOriginalToData();
}
/**
* @return {?}
*/
resetOriginalData() {
this._isSetOriginal = false;
this.originalValue = undefined;
}
/**
* @param {?} options
* @return {?}
*/
setOptions(options) {
super.setOptions(options);
this.checkType();
}
/**
* @return {?}
*/
getType() {
return this.type;
}
/**
* @param {?} type
* @return {?}
*/
setType(type) {
this.type = type;
this.checkType();
}
/**
* @return {?}
*/
getWidth() {
return this.width;
}
/**
* @param {?} width
* @return {?}
*/
setWidth(width) {
this.width = width;
}
/**
* @return {?}
*/
getHeight() {
return this.height;
}
/**
* @param {?} height
* @return {?}
*/
setHeight(height) {
this.height = height;
}
/**
* @return {?}
*/
getBeforeKeyDownEvent() {
return this.beforeKeyDownEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeKeyDownEvent(event) {
this.beforeKeyDownEvent = event;
}
/**
* @return {?}
*/
getKeyDownEvent() {
return this.keyDownEvent;
}
/**
* @param {?} event
* @return {?}
*/
setKeyDownEvent(event) {
this.keyDownEvent = event;
}
/**
* @return {?}
*/
getBeforeKeyUpEvent() {
return this.beforeKeyUpEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeKeyUpEvent(event) {
this.beforeKeyUpEvent = event;
}
/**
* @return {?}
*/
getKeyUpEvent() {
return this.keyUpEvent;
}
/**
* @param {?} event
* @return {?}
*/
setKeyUpEvent(event) {
this.keyUpEvent = event;
}
/**
* @return {?}
*/
getMaxLength() {
return this.maxLength;
}
}
TextBox.TYPE_NAME = TYPE_NAME;
TextBox.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-text-box">
<div class="table-wrapper">
<div class="table-cell-wrapper middle">
<input [attr.maxlength]="getMaxLength()" [style.width]="getWidth()" [style.height]="getHeight()" (keyup)="onKeyUp($event)" (keydown)="onKeyDown($event)" type="{{getType()}}" class="form-control" [disabled]="isDisabled()" [readonly]="isReadOnly()" [class.dirty]="isDataDirty()" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)" (change)="onValueChanged($event)" [value]="(formattedData === undefined || formattedData === null) ? '' : formattedData">
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
TextBox.ctorParameters = () => [
{ type: ElementRef, },
{ type: FormatterFactory, },
{ type: NeedFocusService, },
];
TextBox.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 },],
"formatter": [{ type: Input, args: ['formatter',] },],
"formatterName": [{ type: Input, args: ['formatterName',] },],
"formatterOptions": [{ type: Input, args: ['formatterOptions',] },],
"formatterUsePropertyValue": [{ type: Input, args: ['formatterUsePropertyValue',] },],
"type": [{ type: Input },],
"width": [{ type: Input },],
"height": [{ type: Input },],
"maxLength": [{ type: Input, args: ['maxLength',] },],
"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',] },],
"beforeKeyUpEvent": [{ type: Output, args: ['phxBeforeKeyUp',] },],
"keyUpEvent": [{ type: Output, args: ['phxKeyUp',] },],
"beforeKeyDownEvent": [{ type: Output, args: ['phxBeforeKeyDown',] },],
"keyDownEvent": [{ type: Output, args: ['phxKeyDown',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], TextBox.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], TextBox.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], TextBox.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], TextBox.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "name", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "typeOfData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "readOnly", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], TextBox.prototype, "help", void 0);
tslib_1.__decorate([
Option('formatter.instance'),
tslib_1.__metadata("design:type", Object)
], TextBox.prototype, "formatter", void 0);
tslib_1.__decorate([
Option('formatter.name'),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "formatterName", void 0);
tslib_1.__decorate([
Option('formatter.options'),
tslib_1.__metadata("design:type", Object)
], TextBox.prototype, "formatterOptions", void 0);
tslib_1.__decorate([
Option('formatter.usePropertyValue'),
tslib_1.__metadata("design:type", Boolean)
], TextBox.prototype, "formatterUsePropertyValue", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "type", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "width", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], TextBox.prototype, "height", void 0);
tslib_1.__decorate([
Option('maxLength'),
tslib_1.__metadata("design:type", Number)
], TextBox.prototype, "maxLength", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "endValidateEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "beforeChangeEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeKeyUp'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "beforeKeyUpEvent", void 0);
tslib_1.__decorate([
Option('keyUp'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "keyUpEvent", void 0);
tslib_1.__decorate([
Option('beforeKeyDown'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "beforeKeyDownEvent", void 0);
tslib_1.__decorate([
Option('keyDown'),
tslib_1.__metadata("design:type", EventEmitter)
], TextBox.prototype, "keyDownEvent", void 0);
function TextBox_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TextBox.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TextBox.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TextBox.propDecorators;
/** @type {?} */
TextBox.TYPE_NAME;
/** @type {?} */
TextBox.prototype.dataParent;
/** @type {?} */
TextBox.prototype.ignoreParentData;
/** @type {?} */
TextBox.prototype.data;
/** @type {?} */
TextBox.prototype.ignoreParentDisabled;
/** @type {?} */
TextBox.prototype.delegateHistory;
/** @type {?} */
TextBox.prototype.onDisabled;
/** @type {?} */
TextBox.prototype.onEnabled;
/** @type {?} */
TextBox.prototype.loadingEnabled;
/** @type {?} */
TextBox.prototype.i18nKey;
/** @type {?} */
TextBox.prototype.bypass;
/** @type {?} */
TextBox.prototype.options;
/** @type {?} */
TextBox.prototype.disabled;
/** @type {?} */
TextBox.prototype.field;
/** @type {?} */
TextBox.prototype.name;
/** @type {?} */
TextBox.prototype.typeOfData;
/** @type {?} */
TextBox.prototype.readOnly;
/** @type {?} */
TextBox.prototype.help;
/** @type {?} */
TextBox.prototype.formatter;
/** @type {?} */
TextBox.prototype.formatterName;
/** @type {?} */
TextBox.prototype.formatterOptions;
/** @type {?} */
TextBox.prototype.formatterUsePropertyValue;
/** @type {?} */
TextBox.prototype.type;
/** @type {?} */
TextBox.prototype.width;
/** @type {?} */
TextBox.prototype.height;
/** @type {?} */
TextBox.prototype.maxLength;
/** @type {?} */
TextBox.prototype.loadEvent;
/** @type {?} */
TextBox.prototype.startValidateEvent;
/** @type {?} */
TextBox.prototype.endValidateEvent;
/** @type {?} */
TextBox.prototype.beforeFocusEvent;
/** @type {?} */
TextBox.prototype.focusEvent;
/** @type {?} */
TextBox.prototype.beforeLostFocusEvent;
/** @type {?} */
TextBox.prototype.lostFocusEvent;
/** @type {?} */
TextBox.prototype.beforeChangeEvent;
/** @type {?} */
TextBox.prototype.changeEvent;
/** @type {?} */
TextBox.prototype.beforeKeyUpEvent;
/** @type {?} */
TextBox.prototype.keyUpEvent;
/** @type {?} */
TextBox.prototype.beforeKeyDownEvent;
/** @type {?} */
TextBox.prototype.keyDownEvent;
/** @type {?} */
TextBox.prototype.originalValue;
/** @type {?} */
TextBox.prototype._isSetOriginal;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dEJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvVGV4dEJveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRTdFLHVCQUFNLFNBQVMsR0FBVyxjQUFjLENBQUM7QUFjekMsTUFBTSxjQUFlLFNBQVEsaUNBQWlDOzs7Ozs7SUFzSTVELFlBQVksVUFBc0IsRUFBRSxnQkFBa0MsRUFBRSxnQkFBa0M7UUFDeEcsS0FBSyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3QyxJ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RU0sWUFBWTs7O0lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBRU0sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgQkVGT1JFX0tFWV9VUF9FVkVOVCwgS0VZX1VQX0VWRU5ULCBCRUZPUkVfS0VZX0RPV05fRVZFTlQsIEtFWV9ET1dOX0VWRU5UIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9WYWxpZGF0aW9uUmVzdWx0JztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7IElGb3JtYXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9mb3JtYXR0ZXIvSUZvcm1hdHRlcic7XG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXRleHQtYm94XCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtdGV4dC1ib3hcIj5cblx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0PGlucHV0IFthdHRyLm1heGxlbmd0aF09XCJnZXRNYXhMZW5ndGgoKVwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIHR5cGU9XCJ7e2dldFR5cGUoKX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgW3JlYWRvbmx5XT1cImlzUmVhZE9ubHkoKVwiIFtjbGFzcy5kaXJ0eV09XCJpc0RhdGFEaXJ0eSgpXCIgKGZvY3VzaW4pPVwib25Gb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIFt2YWx1ZV09XCIoZm9ybWF0dGVkRGF0YSA9PT0gdW5kZWZpbmVkIHx8IGZvcm1hdHRlZERhdGEgPT09IG51bGwpID8gJycgOiBmb3JtYXR0ZWREYXRhXCI+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFRleHRCb3ggZXh0ZW5kcyBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xuICBASW5wdXQoJ2Zvcm1hdHRlcicpXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5pbnN0YW5jZScpXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXI6IElGb3JtYXR0ZXI7XG4gIEBJbnB1dCgnZm9ybWF0dGVyTmFtZScpXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5uYW1lJylcbiAgcHJvdGVjdGVkIGZvcm1hdHRlck5hbWU6IHN0cmluZztcbiAgQElucHV0KCdmb3JtYXR0ZXJPcHRpb25zJylcbiAgQE9wdGlvbignZm9ybWF0dGVyLm9wdGlvbnMnKVxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyT3B0aW9uczogYW55O1xuICBASW5wdXQoJ2Zvcm1hdHRlclVzZVByb3BlcnR5VmFsdWUnKVxuICBAT3B0aW9uKCdmb3JtYXR0ZXIudXNlUHJvcGVydHlWYWx1ZScpXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlOiBib29sZWFuO1xuICAvLyAtLS0gc2VsZlxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHR5cGU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB3aWR0aDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGhlaWdodDogc3RyaW5nO1xuICBASW5wdXQoJ21heExlbmd0aCcpXG4gIEBPcHRpb24oJ21heExlbmd0aCcpXG4gIHByb3RlY3RlZCBtYXhMZW5ndGg6IG51bWJlcjtcblxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxuICBAT3B0aW9uKCdsb2FkJylcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxuICBAT3B0aW9uKCdzdGFydFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcbiAgQE9wdGlvbignZW5kVmFsaWRhdGUnKVxuICBwcm90ZWN0ZWQgZW5kVmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxuICBwcm90ZWN0ZWQgYmVmb3JlRm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcbiAgQE9wdGlvbignZm9jdXMnKVxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXG4gIEBPcHRpb24oJ2NoYW5nZScpXG4gIHByb3RlY3RlZCBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xuICAvLyAtLS0gc2VsZlxuICBAT3B0aW9uKCdiZWZvcmVLZXlVcCcpXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUtleVVwJylcbiAgcHJvdGVjdGVkIGJlZm9yZUtleVVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdrZXlVcCcpXG4gIEBPdXRwdXQoJ3BoeEtleVVwJylcbiAgcHJvdGVjdGVkIGtleVVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVLZXlEb3duJylcbiAgQE91dHB1dCgncGh4QmVmb3JlS2V5RG93bicpXG4gIHByb3RlY3RlZCBiZWZvcmVLZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdrZXlEb3duJylcbiAgQE91dHB1dCgncGh4S2V5RG93bicpXG4gIHByb3RlY3RlZCBrZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgb3JpZ2luYWxWYWx1ZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2lzU2V0T3JpZ2luYWw6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZm9ybWF0dGVyRmFjdG9yeTogRm9ybWF0dGVyRmFjdG9yeSwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGZvcm1hdHRlckZhY3RvcnksIG5lZWRGb2N1c1NlcnZpY2UpO1xuXG4gICAgdGhpcy5iZWZvcmVLZXlVcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMua2V5VXBFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUtleURvd25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmtleURvd25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5jaGVja1R5cGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2ZXJ0T3JpZ2luYWxUb0RhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtYXR0ZWREYXRhID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gbnVsbCB8fCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdGhpcy50eXBlICE9PSAnc3RyaW5nJyB8fCB0aGlzLnR5cGUgPT09ICcnKSB7XG4gICAgICB0aGlzLnR5cGUgPSAndGV4dCc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT09ICd0ZXh0J1xuICAgICAgJiYgdGhpcy50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9PSAncGFzc3dvcmQnXG4gICAgICAmJiB0aGlzLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBPbmx5IGFsbG93IHRvIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgIC8vIElmIG5vdCwgdXNlIGRlZmF1bHQgdmFsdWUgYXMgXCJ0ZXh0XCIuXG4gICAgICB0aGlzLnR5cGUgPSAndGV4dCdcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XG4gICAgLy8hIGRvIHN0aGluZ1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmKSB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcnJpZGUgUHJldmVudERlZmF1bHRcbiAgcHVibGljIHNldElucHV0VmFsdWUoaW5wdXRWYWw6IGFueSwgJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBvbGRWYWx1ZTogYW55ID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlQ2hhbmdlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIC8vIFNldCBpbnB1dCB2YWx1ZSBpbnRvIGRhdGEgb2JqZWN0LlxuICAgICAgdGhpcy5fc2V0VmFsdWVUb0RhdGEoaW5wdXRWYWwpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUNoYW5nZUV2ZW50KG9sZFZhbHVlLCBpbnB1dFZhbCwgdHJ1ZSwgJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KG9sZFZhbHVlLCBpbnB1dFZhbCwgdHJ1ZSwgJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9QcmV2ZW50ZWRcbiAgICAgIGlmKCRldmVudCAhPT0gbnVsbCAmJiAkZXZlbnQgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICg8YW55PiRldmVudC50YXJnZXQpLnZhbHVlID0gKG9sZFZhbHVlICE9PSBudWxsICYmIG9sZFZhbHVlICE9PSB1bmRlZmluZWQpID8gb2xkVmFsdWUgOiBcIlwiO1xuICAgICAgfVxuICAgIH0sICdpbnB1dFZhbHVlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvS2V5VXAoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvS2V5RG93bigkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUtleVVwRXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGxldCBpbnB1dFRleHQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5wdXRUZXh0ID0gKDxhbnk+JGV2ZW50LnRhcmdldCkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHZhbHVlOiBpbnB1dFRleHRcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfS0VZX1VQX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgdGhpcy5iZWZvcmVLZXlVcEV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRLZXlVcEV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgaW5wdXRUZXh0OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlucHV0VGV4dCA9ICg8YW55PiRldmVudC50YXJnZXQpLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cblxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICB2YWx1ZTogaW5wdXRUZXh0XG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoS0VZX1VQX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgdGhpcy5rZXlVcEV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVLZXlEb3duRXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGxldCBpbnB1dFRleHQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5wdXRUZXh0ID0gKDxhbnk+JGV2ZW50LnRhcmdldCkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHZhbHVlOiBpbnB1dFRleHRcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfS0VZX0RPV05fRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmJlZm9yZUtleURvd25FdmVudC5lbWl0KGV2KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0S2V5RG93bkV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgaW5wdXRUZXh0OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlucHV0VGV4dCA9ICg8YW55PiRldmVudC50YXJnZXQpLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cblxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICB2YWx1ZTogaW5wdXRUZXh0XG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoS0VZX0RPV05fRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmtleURvd25FdmVudC5lbWl0KGV2KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleVVwKCRldmVudDogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVLZXlVcEV2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmRvS2V5VXAoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICAgIHRoaXMuZW1pdEJlZm9yZUtleVVwRXZlbnQoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCwgcmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XG4gICAgICB0aGlzLmVtaXRLZXlVcEV2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG5cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleURvd24oJGV2ZW50OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUtleURvd25FdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5kb0tleURvd24oJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICAgIHRoaXMuZW1pdEJlZm9yZUtleURvd25FdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdEtleURvd25FdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQoJGV2ZW50OiBFdmVudCkge1xuICAgIGxldCBpbnB1dFRleHQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5wdXRUZXh0ID0gKDxhbnk+JGV2ZW50LnRhcmdldCkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRGb3JtYXR0ZWREYXRhKGlucHV0VGV4dCwgJGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2Uuc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcywgJGV2ZW50KTtcbiAgfVxuXG