@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
452 lines • 50.8 kB
JavaScript
import { __decorate, __extends, __metadata, __param } from "tslib";
import { IgxInputDirective, IgxInputState } from './../directives/input/input.directive';
import { Component, ContentChildren, forwardRef, QueryList, ViewChild, Input, ContentChild, AfterContentInit, HostBinding, Directive, TemplateRef, ElementRef, ChangeDetectorRef, Optional, Injector, OnInit, AfterViewInit, OnDestroy, Inject, Type } from '@angular/core';
import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';
import { IgxInputGroupComponent } from '../input-group/input-group.component';
import { IgxDropDownComponent } from './../drop-down/drop-down.component';
import { IgxSelectItemComponent } from './select-item.component';
import { SelectPositioningStrategy } from './select-positioning-strategy';
import { AbsoluteScrollStrategy } from '../services/index';
import { IGX_DROPDOWN_BASE } from '../drop-down/drop-down.common';
import { IgxLabelDirective } from '../directives/label/label.directive';
import { IgxSelectionAPIService } from '../core/selection';
import { DisplayDensityToken } from '../core/density';
/** @hidden @internal */
var IgxSelectToggleIconDirective = /** @class */ (function () {
function IgxSelectToggleIconDirective() {
}
IgxSelectToggleIconDirective = __decorate([
Directive({
selector: '[igxSelectToggleIcon]'
})
], IgxSelectToggleIconDirective);
return IgxSelectToggleIconDirective;
}());
export { IgxSelectToggleIconDirective };
/** @hidden @internal */
var IgxSelectHeaderDirective = /** @class */ (function () {
function IgxSelectHeaderDirective() {
}
IgxSelectHeaderDirective = __decorate([
Directive({
selector: '[igxSelectHeader]'
})
], IgxSelectHeaderDirective);
return IgxSelectHeaderDirective;
}());
export { IgxSelectHeaderDirective };
/** @hidden @internal */
var IgxSelectFooterDirective = /** @class */ (function () {
function IgxSelectFooterDirective() {
}
IgxSelectFooterDirective = __decorate([
Directive({
selector: '[igxSelectFooter]'
})
], IgxSelectFooterDirective);
return IgxSelectFooterDirective;
}());
export { IgxSelectFooterDirective };
var noop = function () { };
var ɵ0 = noop;
/**
* **Ignite UI for Angular Select** -
* [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/select.html)
*
* The `igxSelect` provides an input with dropdown list allowing selection of a single item.
*
* Example:
* ```html
* <igx-select #select1 [placeholder]="'Pick One'">
* <label igxLabel>Select Label</label>
* <igx-select-item *ngFor="let item of items" [value]="item.field">
* {{ item.field }}
* </igx-select-item>
* </igx-select>
* ```
*/
var IgxSelectComponent = /** @class */ (function (_super) {
__extends(IgxSelectComponent, _super);
function IgxSelectComponent(elementRef, cdr, selection, _displayDensityOptions, _injector) {
var _this = _super.call(this, elementRef, cdr, selection, _displayDensityOptions) || this;
_this.elementRef = elementRef;
_this.cdr = cdr;
_this.selection = selection;
_this._displayDensityOptions = _displayDensityOptions;
_this._injector = _injector;
_this.ngControl = null;
/** @hidden @internal do not use the drop-down container class */
_this.cssClass = false;
/** @hidden @internal */
_this.allowItemsFocus = false;
/**
* An @Input property that disables the `IgxSelectComponent`.
* ```html
* <igx-select [disabled]="'true'"></igx-select>
* ```
*/
_this.disabled = false;
/** @hidden @internal */
_this.maxHeight = '256px';
/**
* An @Input property that sets how the select will be styled.
* The allowed values are `line`, `box` and `border`. The default is `line`.
* ```html
*<igx-select [type]="'box'"></igx-select>
* ```
*/
_this.type = 'line';
/**
* The custom template, if any, that should be used when rendering the select TOGGLE(open/close) button
*
* ```typescript
* // Set in typescript
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
* myComponent.select.toggleIconTemplate = myCustomTemplate;
* ```
* ```html
* <!-- Set in markup -->
* <igx-select #select>
* ...
* <ng-template igxSelectToggleIcon let-collapsed>
* <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
* </ng-template>
* </igx-select>
* ```
*/
_this.toggleIconTemplate = null;
/**
* The custom template, if any, that should be used when rendering the HEADER for the select items list
*
* ```typescript
* // Set in typescript
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
* myComponent.select.headerTemplate = myCustomTemplate;
* ```
* ```html
* <!-- Set in markup -->
* <igx-select #select>
* ...
* <ng-template igxSelectHeader>
* <div class="select__header">
* This is a custom header
* </div>
* </ng-template>
* </igx-select>
* ```
*/
_this.headerTemplate = null;
/**
* The custom template, if any, that should be used when rendering the FOOTER for the select items list
*
* ```typescript
* // Set in typescript
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
* myComponent.select.footerTemplate = myCustomTemplate;
* ```
* ```html
* <!-- Set in markup -->
* <igx-select #select>
* ...
* <ng-template igxSelectFooter>
* <div class="select__footer">
* This is a custom footer
* </div>
* </ng-template>
* </igx-select>
* ```
*/
_this.footerTemplate = null;
/** @hidden @internal */
_this._onChangeCallback = noop;
/** @hidden @internal */
_this.writeValue = function (value) {
_this.value = value;
};
return _this;
}
IgxSelectComponent_1 = IgxSelectComponent;
Object.defineProperty(IgxSelectComponent.prototype, "value", {
/**
* An @Input property that gets/sets the component value.
*
* ```typescript
* // get
* let selectValue = this.select.value;
* ```
*
* ```typescript
* // set
* this.select.value = 'London';
* ```
* ```html
* <igx-select [value]="value"></igx-select>
* ```
*/
get: function () {
return this._value;
},
set: function (v) {
var _this = this;
if (this._value === v) {
return;
}
this._value = v;
this.setSelection(this.items.find(function (x) { return x.value === _this.value; }));
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxSelectComponent.prototype, "selectionValue", {
/** @hidden @internal */
get: function () {
var selectedItem = this.selectedItem;
return selectedItem ? selectedItem.itemText : '';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxSelectComponent.prototype, "selectedItem", {
/** @hidden @internal */
get: function () {
return this.selection.first_item(this.id);
},
enumerable: true,
configurable: true
});
/** @hidden @internal */
IgxSelectComponent.prototype.registerOnChange = function (fn) {
this._onChangeCallback = fn;
};
/** @hidden @internal */
IgxSelectComponent.prototype.registerOnTouched = function (fn) { };
/** @hidden @internal */
IgxSelectComponent.prototype.setDisabledState = function (isDisabled) {
this.disabled = isDisabled;
};
/** @hidden @internal */
IgxSelectComponent.prototype.getEditElement = function () {
return this.input.nativeElement;
};
/** @hidden @internal */
IgxSelectComponent.prototype.selectItem = function (newSelection, event) {
var oldSelection = this.selectedItem;
if (event) {
this.toggleDirective.close();
}
if (newSelection === null || newSelection === oldSelection || newSelection.disabled || newSelection.isHeader) {
return;
}
var args = { oldSelection: oldSelection, newSelection: newSelection, cancel: false };
this.onSelection.emit(args);
if (args.cancel) {
return;
}
this.setSelection(newSelection);
this._value = newSelection.value;
this.cdr.detectChanges();
this._onChangeCallback(this.value);
};
/** @hidden @internal */
IgxSelectComponent.prototype.getFirstItemElement = function () {
return this.children.first.element.nativeElement;
};
/**
* Opens the select
*
* ```typescript
* this.select.open();
* ```
*/
IgxSelectComponent.prototype.open = function (overlaySettings) {
if (this.disabled || this.items.length === 0) {
return;
}
if (!this.selectedItem) {
this.navigateFirst();
}
_super.prototype.open.call(this, Object.assign({}, this._overlayDefaults, this.overlaySettings, overlaySettings));
};
/** @hidden @internal */
IgxSelectComponent.prototype.ngAfterContentInit = function () {
var _this = this;
this._overlayDefaults = {
modal: false,
closeOnOutsideClick: false,
positionStrategy: new SelectPositioningStrategy(this, { target: this.getEditElement() }),
scrollStrategy: new AbsoluteScrollStrategy(),
excludePositionTarget: true
};
this.children.changes.subscribe(function () {
_this.setSelection(_this.items.find(function (x) { return x.value === _this.value; }));
_this.cdr.detectChanges();
});
Promise.resolve().then(function () { return _this.children.notifyOnChanges(); });
};
/** @hidden @internal */
IgxSelectComponent.prototype.onToggleOpening = function (event) {
this.onOpening.emit(event);
if (event.cancel) {
return;
}
this.scrollToItem(this.selectedItem);
};
IgxSelectComponent.prototype.navigate = function (direction, currentIndex) {
if (this.collapsed && this.selectedItem) {
this.navigateItem(this.selectedItem.itemIndex);
}
_super.prototype.navigate.call(this, direction, currentIndex);
};
IgxSelectComponent.prototype.manageRequiredAsterisk = function () {
if (this.ngControl && this.ngControl.control.validator) {
// Run the validation with empty object to check if required is enabled.
var error = this.ngControl.control.validator({});
this.inputGroup.isRequired = error && error.required;
this.cdr.markForCheck();
}
};
IgxSelectComponent.prototype.setSelection = function (item) {
if (item && item.value !== undefined && item.value !== null) {
this.selection.set(this.id, new Set([item]));
}
else {
this.selection.clear(this.id);
}
};
/** @hidden @internal */
IgxSelectComponent.prototype.onBlur = function () {
if (this.ngControl && !this.ngControl.valid) {
this.input.valid = IgxInputState.INVALID;
}
else {
this.input.valid = IgxInputState.INITIAL;
}
if (!this.collapsed) {
this.toggleDirective.close();
}
};
IgxSelectComponent.prototype.onStatusChanged = function () {
if ((this.ngControl.control.touched || this.ngControl.control.dirty) &&
(this.ngControl.control.validator || this.ngControl.control.asyncValidator)) {
if (this.inputGroup.isFocused) {
this.input.valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
}
else {
this.input.valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
}
}
this.manageRequiredAsterisk();
};
/**
* @hidden @internal
*/
IgxSelectComponent.prototype.ngOnInit = function () {
this.ngControl = this._injector.get(NgControl, null);
};
/**
* @hidden @internal
*/
IgxSelectComponent.prototype.ngAfterViewInit = function () {
if (this.ngControl) {
this._statusChanges$ = this.ngControl.statusChanges.subscribe(this.onStatusChanged.bind(this));
this.manageRequiredAsterisk();
}
this.cdr.detectChanges();
};
/**
* @hidden @internal
*/
IgxSelectComponent.prototype.ngOnDestroy = function () {
this.selection.clear(this.id);
if (this._statusChanges$) {
this._statusChanges$.unsubscribe();
}
};
/**
* @hidden @internal
* Prevent input blur - closing the items container on Header/Footer Template click.
*/
IgxSelectComponent.prototype.mousedownHandler = function (event) {
event.preventDefault();
};
var IgxSelectComponent_1;
IgxSelectComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: IgxSelectionAPIService },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] },
{ type: Injector }
]; };
__decorate([
ViewChild('inputGroup', { read: IgxInputGroupComponent, static: true }),
__metadata("design:type", IgxInputGroupComponent)
], IgxSelectComponent.prototype, "inputGroup", void 0);
__decorate([
ViewChild('input', { read: IgxInputDirective, static: true }),
__metadata("design:type", IgxInputDirective)
], IgxSelectComponent.prototype, "input", void 0);
__decorate([
ContentChildren(forwardRef(function () { return IgxSelectItemComponent; }), { descendants: true }),
__metadata("design:type", QueryList)
], IgxSelectComponent.prototype, "children", void 0);
__decorate([
ContentChild(forwardRef(function () { return IgxLabelDirective; }), { static: true }),
__metadata("design:type", IgxLabelDirective)
], IgxSelectComponent.prototype, "label", void 0);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxSelectComponent.prototype, "value", null);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSelectComponent.prototype, "placeholder", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSelectComponent.prototype, "disabled", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSelectComponent.prototype, "overlaySettings", void 0);
__decorate([
HostBinding('style.maxHeight'),
__metadata("design:type", Object)
], IgxSelectComponent.prototype, "maxHeight", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxSelectComponent.prototype, "type", void 0);
__decorate([
ContentChild(IgxSelectToggleIconDirective, { read: TemplateRef }),
__metadata("design:type", TemplateRef)
], IgxSelectComponent.prototype, "toggleIconTemplate", void 0);
__decorate([
ContentChild(IgxSelectHeaderDirective, { read: TemplateRef, static: false }),
__metadata("design:type", TemplateRef)
], IgxSelectComponent.prototype, "headerTemplate", void 0);
__decorate([
ContentChild(IgxSelectFooterDirective, { read: TemplateRef, static: false }),
__metadata("design:type", TemplateRef)
], IgxSelectComponent.prototype, "footerTemplate", void 0);
IgxSelectComponent = IgxSelectComponent_1 = __decorate([
Component({
selector: 'igx-select',
template: "<igx-input-group #inputGroup class=\"input-group\" [disabled]=\"disabled\" (click)=\"toggle()\" [type]=\"type\" [displayDensity]=\"displayDensity\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n </ng-container>\n <input #input class=\"input\" type=\"text\" igxInput [igxSelectItemNavigation]=\"this\"\n readonly=\"true\"\n [attr.placeholder]=\"this.placeholder\"\n [value]=\"this.selectionValue\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-labelledby]=\"this.label ? this.label.id : ''\"\n [attr.aria-expanded]=\"!this.collapsed\"\n [attr.aria-owns]=\"this.listId\"\n [attr.aria-activedescendant]=\"!this.collapsed ? this.focusedItem?.id : null\"\n (blur)=\"onBlur()\"\n />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </ng-container>\n <igx-suffix>\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\" fontSet=\"material\">{{ collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}</igx-icon>\n </igx-suffix>\n</igx-input-group>\n<div igxToggle class=\"igx-drop-down-wrapper\" (mousedown)=\"mousedownHandler($event);\" (onOpening)=\"onToggleOpening($event)\"\n (onOpened)=\"onToggleOpened()\" (onClosing)=\"onToggleClosing($event)\" (onClosed)=\"onToggleClosed()\">\n\n <div *ngIf=\"headerTemplate\" class=\"igx-drop-down-wrapper__header\">\n <ng-content *ngTemplateOutlet=\"headerTemplate\"></ng-content>\n </div>\n\n <div #scrollContainer class=\"igx-drop-down__list--select\" [style.maxHeight]=\"maxHeight\" [attr.id]=\"this.listId\" role=\"listbox\">\n <ng-content select=\"igx-select-item, igx-select-item-group\">\n </ng-content>\n </div>\n\n <div *ngIf=\"footerTemplate\" class=\"igx-drop-down-wrapper__footer\">\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n</div>\n",
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: IgxSelectComponent_1, multi: true },
{ provide: IGX_DROPDOWN_BASE, useExisting: IgxSelectComponent_1 }
],
styles: ["\n :host {\n display: block;\n }\n "]
}),
__param(3, Optional()), __param(3, Inject(DisplayDensityToken)),
__metadata("design:paramtypes", [ElementRef,
ChangeDetectorRef,
IgxSelectionAPIService, Object, Injector])
], IgxSelectComponent);
return IgxSelectComponent;
}(IgxDropDownComponent));
export { IgxSelectComponent };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RixPQUFPLEVBQ0gsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUNqRixnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUM5RixRQUFRLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFFM0QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxTQUFTLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFJckcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUUsT0FBTyxFQUFtQixzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBaUMsTUFBTSwrQkFBK0IsQ0FBQztBQUVqRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUd4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQTBCLE1BQU0saUJBQWlC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QUU7OytEQUN5QjtJQUlqQztRQURDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQzs7eURBQ0o7SUFhM0I7UUFEQyxLQUFLLEVBQUU7O29EQUNhO0lBcUJyQjtRQURDLFlBQVksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztrQ0FDdkMsV0FBVztrRUFBYTtJQXVCbkQ7UUFEQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztrQ0FDdEQsV0FBVzs4REFBYTtJQXVCL0M7UUFEQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztrQ0FDdEQsV0FBVzs4REFBYTtJQW5LdEMsa0JBQWtCO1FBWjlCLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLHV6RUFBc0M7WUFDdEMsU0FBUyxFQUFFO2dCQUNQLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxvQkFBa0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO2dCQUM1RSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsb0JBQWtCLEVBQUU7YUFBQztxQkFDM0QsaUVBSVI7U0FDSixDQUFDO1FBc0xPLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO3lDQUpsQixVQUFVO1lBQ2pCLGlCQUFpQjtZQUNYLHNCQUFzQixVQUd4QixRQUFRO09BdEx0QixrQkFBa0IsQ0E2VzlCO0lBQUQseUJBQUM7Q0FBQSxBQTdXRCxDQUF3QyxvQkFBb0IsR0E2VzNEO1NBN1dZLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElneElucHV0RGlyZWN0aXZlLCBJZ3hJbnB1dFN0YXRlIH0gZnJvbSAnLi8uLi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBmb3J3YXJkUmVmLCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgSW5wdXQsIENvbnRlbnRDaGlsZCxcbiAgICBBZnRlckNvbnRlbnRJbml0LCBIb3N0QmluZGluZywgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiwgRWxlbWVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9wdGlvbmFsLFxuICAgIEluamVjdG9yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgSW5qZWN0LCBUeXBlXG5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbCwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9kcm9wLWRvd24vaW5kZXgnO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2lucHV0LWdyb3VwL2lucHV0LWdyb3VwLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IElneERyb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnLi8uLi9kcm9wLWRvd24vZHJvcC1kb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9zZWxlY3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VsZWN0UG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4vc2VsZWN0LXBvc2l0aW9uaW5nLXN0cmF0ZWd5JztcblxuaW1wb3J0IHsgT3ZlcmxheVNldHRpbmdzLCBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvaW5kZXgnO1xuaW1wb3J0IHsgSUdYX0RST1BET1dOX0JBU0UsIElTZWxlY3Rpb25FdmVudEFyZ3MsIE5hdmlnYXRlIH0gZnJvbSAnLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgQ2FuY2VsYWJsZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4TGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2xhYmVsL2xhYmVsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hTZWxlY3RCYXNlIH0gZnJvbSAnLi9zZWxlY3QuY29tbW9uJztcbmltcG9ydCB7IEVkaXRvclByb3ZpZGVyIH0gZnJvbSAnLi4vY29yZS9lZGl0LXByb3ZpZGVyJztcbmltcG9ydCB7IElneFNlbGVjdGlvbkFQSVNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eVRva2VuLCBJRGlzcGxheURlbnNpdHlPcHRpb25zIH0gZnJvbSAnLi4vY29yZS9kZW5zaXR5JztcblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hTZWxlY3RUb2dnbGVJY29uXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4U2VsZWN0VG9nZ2xlSWNvbkRpcmVjdGl2ZSB7XG59XG5cbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4U2VsZWN0SGVhZGVyXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4U2VsZWN0SGVhZGVyRGlyZWN0aXZlIHtcbn1cblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hTZWxlY3RGb290ZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hTZWxlY3RGb290ZXJEaXJlY3RpdmUge1xufVxuXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuXG4vKipcbiAqICoqSWduaXRlIFVJIGZvciBBbmd1bGFyIFNlbGVjdCoqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy9zZWxlY3QuaHRtbClcbiAqXG4gKiBUaGUgYGlneFNlbGVjdGAgcHJvdmlkZXMgYW4gaW5wdXQgd2l0aCBkcm9wZG93biBsaXN0IGFsbG93aW5nIHNlbGVjdGlvbiBvZiBhIHNpbmdsZSBpdGVtLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8aWd4LXNlbGVjdCAjc2VsZWN0MSBbcGxhY2Vob2xkZXJdPVwiJ1BpY2sgT25lJ1wiPlxuICogICA8bGFiZWwgaWd4TGFiZWw+U2VsZWN0IExhYmVsPC9sYWJlbD5cbiAqICAgPGlneC1zZWxlY3QtaXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiIFt2YWx1ZV09XCJpdGVtLmZpZWxkXCI+XG4gKiAgICAge3sgaXRlbS5maWVsZCB9fVxuICogICA8L2lneC1zZWxlY3QtaXRlbT5cbiAqIDwvaWd4LXNlbGVjdD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4U2VsZWN0Q29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9EUk9QRE9XTl9CQVNFLCB1c2VFeGlzdGluZzogSWd4U2VsZWN0Q29tcG9uZW50IH1dLFxuICAgIHN0eWxlczogW2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICBgXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBJZ3hEcm9wRG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIElneFNlbGVjdEJhc2UsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEFmdGVyQ29udGVudEluaXQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBFZGl0b3JQcm92aWRlciB7XG5cbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sID0gbnVsbDtcbiAgICBwcml2YXRlIF9zdGF0dXNDaGFuZ2VzJDogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgX292ZXJsYXlEZWZhdWx0czogT3ZlcmxheVNldHRpbmdzO1xuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgZG8gbm90IHVzZSB0aGUgZHJvcC1kb3duIGNvbnRhaW5lciBjbGFzcyAqL1xuICAgIHB1YmxpYyBjc3NDbGFzcyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cCcsIHsgcmVhZDogSWd4SW5wdXRHcm91cENvbXBvbmVudCwgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHJlYWQ6IElneElucHV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSkgcHVibGljIGlucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50KSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjaGlsZHJlbjogUXVlcnlMaXN0PElneFNlbGVjdEl0ZW1Db21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZChmb3J3YXJkUmVmKCgpID0+IElneExhYmVsRGlyZWN0aXZlKSwgeyBzdGF0aWM6IHRydWUgfSkgbGFiZWw6IElneExhYmVsRGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGFsbG93SXRlbXNGb2N1cyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhlaWdodDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZ2V0cy9zZXRzIHRoZSBjb21wb25lbnQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IHNlbGVjdFZhbHVlID0gdGhpcy5zZWxlY3QudmFsdWU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gc2V0XG4gICAgICogdGhpcy5zZWxlY3QudmFsdWUgPSAnTG9uZG9uJztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1zZWxlY3QgW3ZhbHVlXT1cInZhbHVlXCI+PC9pZ3gtc2VsZWN0PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gdikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24odGhpcy5pdGVtcy5maW5kKHggPT4geC52YWx1ZSA9PT0gdGhpcy52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGlucHV0IHBsYWNlaG9sZGVyLlxuICAgICAqXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyO1xuXG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBkaXNhYmxlcyB0aGUgYElneFNlbGVjdENvbXBvbmVudGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2VsZWN0IFtkaXNhYmxlZF09XCIndHJ1ZSdcIj48L2lneC1zZWxlY3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGN1c3RvbSBPdmVybGF5U2V0dGluZ3MgYElneFNlbGVjdENvbXBvbmVudGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtc2VsZWN0IFtvdmVybGF5U2V0dGluZ3NdID0gXCJjdXN0b21PdmVybGF5U2V0dGluZ3NcIj48L2lneC1zZWxlY3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWF4SGVpZ2h0JylcbiAgICBwdWJsaWMgbWF4SGVpZ2h0ID0gJzI1NnB4JztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyB3aWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBob3cgdGhlIHNlbGVjdCB3aWxsIGJlIHN0eWxlZC5cbiAgICAgKiBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlIGBsaW5lYCwgYGJveGAgYW5kIGBib3JkZXJgLiBUaGUgZGVmYXVsdCBpcyBgbGluZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqPGlneC1zZWxlY3QgW3R5cGVdPVwiJ2JveCdcIj48L2lneC1zZWxlY3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdHlwZSA9ICdsaW5lJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgc2VsZWN0IFRPR0dMRShvcGVuL2Nsb3NlKSBidXR0b25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5zZWxlY3QudG9nZ2xlSWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LXNlbGVjdCAjc2VsZWN0PlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4U2VsZWN0VG9nZ2xlSWNvbiBsZXQtY29sbGFwc2VkPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj57eyBjb2xsYXBzZWQgPyAncmVtb3ZlX2NpcmNsZScgOiAncmVtb3ZlX2NpcmNsZV9vdXRsaW5lJ319PC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LXNlbGVjdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNlbGVjdFRvZ2dsZUljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdG9nZ2xlSWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgSEVBREVSIGZvciB0aGUgc2VsZWN0IGl0ZW1zIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5zZWxlY3QuaGVhZGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtc2VsZWN0ICNzZWxlY3Q+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hTZWxlY3RIZWFkZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdF9faGVhZGVyXCI+XG4gICAgICogICAgICAgICAgICAgIFRoaXMgaXMgYSBjdXN0b20gaGVhZGVyXG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1zZWxlY3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTZWxlY3RIZWFkZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBGT09URVIgZm9yIHRoZSBzZWxlY3QgaXRlbXMgbGlzdFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LnNlbGVjdC5mb290ZXJUZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1zZWxlY3QgI3NlbGVjdD5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneFNlbGVjdEZvb3Rlcj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0X19mb290ZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBmb290ZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LXNlbGVjdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNlbGVjdEZvb3RlckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBmb290ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvblZhbHVlKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA/IHNlbGVjdGVkSXRlbS5pdGVtVGV4dCA6ICcnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRJdGVtKCk6IElneFNlbGVjdEl0ZW1Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZmlyc3RfaXRlbSh0aGlzLmlkKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgc2VsZWN0aW9uOiBJZ3hTZWxlY3Rpb25BUElTZXJ2aWNlLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBjZHIsIHNlbGVjdGlvbiwgX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXRFZGl0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHNlbGVjdEl0ZW0obmV3U2VsZWN0aW9uOiBJZ3hEcm9wRG93bkl0ZW1CYXNlRGlyZWN0aXZlLCBldmVudD8pIHtcbiAgICAgICAgY29uc3Qgb2xkU2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW07XG5cbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURpcmVjdGl2ZS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTZWxlY3Rpb24gPT09IG51bGwgfHwgbmV3U2VsZWN0aW9uID09PSBvbGRTZWxlY3Rpb24gfHwgbmV3U2VsZWN0aW9uLmRpc2FibGVkIHx8IG5ld1NlbGVjdGlvbi5pc0hlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJnczogSVNlbGVjdGlvbkV2ZW50QXJncyA9IHsgb2xkU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24sIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbi5lbWl0KGFyZ3MpO1xuXG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdTZWxlY3Rpb24udmFsdWU7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0Rmlyc3RJdGVtRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmZpcnN0LmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgc2VsZWN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5zZWxlY3Qub3BlbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKG92ZXJsYXlTZXR0aW5ncz86IE92ZXJsYXlTZXR0aW5ncykge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVGaXJzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIub3BlbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9vdmVybGF5RGVmYXVsdHMsIHRoaXMub3ZlcmxheVNldHRpbmdzLCBvdmVybGF5U2V0dGluZ3MpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlEZWZhdWx0cyA9IHtcbiAgICAgICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IFNlbGVjdFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcywgeyB0YXJnZXQ6IHRoaXMuZ2V0RWRpdEVsZW1lbnQoKSB9KSxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICAgICAgZXhjbHVkZVBvc2l0aW9uVGFyZ2V0OiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24odGhpcy5pdGVtcy5maW5kKHggPT4geC52YWx1ZSA9PT0gdGhpcy52YWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmNoaWxkcmVuLm5vdGlmeU9uQ2hhbmdlcygpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgb25Ub2dnbGVPcGVuaW5nKGV2ZW50OiBDYW5jZWxhYmxlRXZlbnRBcmdzKSB7XG4gICAgICAgIHRoaXMub25PcGVuaW5nLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxUb0l0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZShkaXJlY3Rpb246IE5hdmlnYXRlLCBjdXJyZW50SW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkICYmIHRoaXMuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbSh0aGlzLnNlbGVjdGVkSXRlbS5pdGVtSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5hdmlnYXRlKGRpcmVjdGlvbiwgY3VycmVudEluZGV4KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAvLyBSdW4gdGhlIHZhbGlkYXRpb24gd2l0aCBlbXB0eSBvYmplY3QgdG8gY2hlY2sgaWYgcmVxdWlyZWQgaXMgZW5hYmxlZC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3Ioe30gYXMgQWJzdHJhY3RDb250cm9sKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQ7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHNldFNlbGVjdGlvbihpdGVtOiBJZ3hEcm9wRG93bkl0ZW1CYXNlRGlyZWN0aXZlKSB7XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpdGVtLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXQodGhpcy5pZCwgbmV3IFNldChbaXRlbV0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKHRoaXMuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmICF0aGlzLm5nQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgIHRoaXMuaW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0LnZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlyZWN0aXZlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25TdGF0dXNDaGFuZ2VkKCkge1xuICAgICAgICBpZiAoKHRoaXMubmdDb250cm9sLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmRpcnR5KSAmJlxuICAgICAgICAgICAgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwLmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQudmFsaWQgPSB0aGlzLm5nQ29udHJvbC52YWxpZCA/IElneElucHV0U3RhdGUuVkFMSUQgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQudmFsaWQgPSB0aGlzLm5nQ29udHJvbC52YWxpZCA/IElneElucHV0U3RhdGUuSU5JVElBTCA6IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hbmFnZVJlcXVpcmVkQXN0ZXJpc2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubmdDb250cm9sID0gdGhpcy5faW5qZWN0b3IuZ2V0PE5nQ29udHJvbD4oTmdDb250cm9sLCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQgPSB0aGlzLm5nQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1Yn