UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

536 lines 45 kB
import { __decorate, __extends, __metadata, __param } from "tslib"; import { CommonModule } from '@angular/common'; import { Component, ContentChild, ContentChildren, ElementRef, HostBinding, HostListener, Input, NgModule, QueryList, Inject, Optional } from '@angular/core'; import { IgxHintDirective } from '../directives/hint/hint.directive'; import { IgxInputDirective, IgxInputState } from '../directives/input/input.directive'; import { IgxLabelDirective } from '../directives/label/label.directive'; import { IgxPrefixModule } from '../directives/prefix/prefix.directive'; import { IgxSuffixModule } from '../directives/suffix/suffix.directive'; import { DisplayDensity, DisplayDensityToken, DisplayDensityBase } from '../core/displayDensity'; import { IgxInputGroupBase } from './input-group.common'; var NEXT_ID = 0; var IgxInputGroupType; (function (IgxInputGroupType) { IgxInputGroupType[IgxInputGroupType["LINE"] = 0] = "LINE"; IgxInputGroupType[IgxInputGroupType["BOX"] = 1] = "BOX"; IgxInputGroupType[IgxInputGroupType["BORDER"] = 2] = "BORDER"; IgxInputGroupType[IgxInputGroupType["FLUENT"] = 3] = "FLUENT"; IgxInputGroupType[IgxInputGroupType["SEARCH"] = 4] = "SEARCH"; IgxInputGroupType[IgxInputGroupType["FLUENT_SEARCH"] = 5] = "FLUENT_SEARCH"; })(IgxInputGroupType || (IgxInputGroupType = {})); var IgxInputGroupComponent = /** @class */ (function (_super) { __extends(IgxInputGroupComponent, _super); function IgxInputGroupComponent(_element, _displayDensityOptions) { var _this = _super.call(this, _displayDensityOptions) || this; _this._element = _element; _this._displayDensityOptions = _displayDensityOptions; _this._type = IgxInputGroupType.LINE; _this._filled = false; _this._supressInputAutofocus = false; /** * An @Input property that sets the value of `id` attribute. If not provided it will be automatically generated. * ```html * <igx-input-group [id]="'igx-input-group-55'"></igx-input-group> * ``` */ _this.id = "igx-input-group-" + NEXT_ID++; /** * Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`. * By default applied the class is applied. *```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ *this.inputGroup.defaultClass = false; *``` *} */ _this.defaultClass = true; /** * @hidden */ _this.hasPlaceholder = false; /** * @hidden */ _this.isRequired = false; /** * @hidden */ _this.isFocused = false; /** * @hidden */ _this.isBox = false; /** * @hidden */ _this.isBorder = false; /** * @hidden */ _this.isSearch = false; /** * @hidden */ _this.isFluentSearch = false; /** * @hidden */ _this.isFluent = false; /** * An @Input property that disables the `IgxInputGroupComponent`. * ```html * <igx-input-group [disabled]="'true'"></igx-input-group> * ``` */ _this.disabled = false; /** * @hidden */ _this.hasWarning = false; _this.element = _element; return _this; } IgxInputGroupComponent_1 = IgxInputGroupComponent; Object.defineProperty(IgxInputGroupComponent.prototype, "validClass", { /** * @hidden */ get: function () { return this.input.valid === IgxInputState.VALID; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "invalidClass", { /** * @hidden */ get: function () { return this.input.valid === IgxInputState.INVALID; }, enumerable: true, configurable: true }); /** *@hidden */ IgxInputGroupComponent.prototype.onClick = function (event) { if (!this._supressInputAutofocus) { this.input.focus(); } }; Object.defineProperty(IgxInputGroupComponent.prototype, "type", { /** * Returns the type of the `IgxInputGroupComponent`. How the input is styled. * Values are `line` - 0, `box` - 1, `border` - 2, `fluent` - 3 `fluentSearch` - 4 and `search` - 5. The default is `line`. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputType = this.inputGroup.type; *} * ``` */ get: function () { return this._type.toString(); }, /** * An @Input property that sets how the input will be styled. * The allowed values are `line`, `box`, `border`, `fluent`, `search` and `fluentSearch`. The default is `line`. * ```html *<igx-input-group [type]="'search'"> * ``` */ set: function (value) { var type = IgxInputGroupType[value.toUpperCase()]; if (type !== undefined) { this.isBox = this.isFluent = this.isFluentSearch = this.isBorder = this.isSearch = false; switch (type) { case IgxInputGroupType.BOX: this.isBox = true; break; case IgxInputGroupType.BORDER: this.isBorder = true; break; case IgxInputGroupType.FLUENT: this.isFluent = true; break; case IgxInputGroupType.FLUENT_SEARCH: this.isFluentSearch = true; break; case IgxInputGroupType.SEARCH: this.isSearch = true; break; default: break; } this._type = type; } }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "supressInputAutofocus", { /** * Returns whether the input element of the input group will be automatically focused on click. * ```typescript * let supressInputAutofocus = this.inputGroup.supressInputAutofocus; * ``` */ get: function () { return this._supressInputAutofocus; }, /** * Sets whether the input element of the input group will be automatically focused on click. * ```html * <igx-input-group [supressInputAutofocus]="true"></igx-input-group> * ``` */ set: function (value) { this._supressInputAutofocus = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isFilled", { /** *@hidden */ get: function () { return this._filled || (this.input && this.input.value); }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityCosy", { /** *@hidden */ get: function () { return this.displayDensity === DisplayDensity.cosy; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityComfortable", { /** *@hidden */ get: function () { return this.displayDensity === DisplayDensity.comfortable; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityCompact", { /** *@hidden */ get: function () { return this.displayDensity === DisplayDensity.compact; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "hasHints", { /** * Returns whether the `IgxInputGroupComponent` has hints. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputHints = this.inputGroup.hasHints; *} * ``` */ get: function () { return this.hints.length > 0; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "hasBorder", { /** * Returns whether the `IgxInputGroupComponent` has border. * ```typescript *@ViewChild("MyInputGroup") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let inputBroder = this.inputGroup.hasBorder; *} * ``` */ get: function () { return this._type === IgxInputGroupType.LINE || this._type === IgxInputGroupType.BOX; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeLine", { /** * Returns whether the `IgxInputGroupComponent` type is line. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeLine = this.inputGroup.isTypeLine; *} * ``` */ get: function () { return this._type === IgxInputGroupType.LINE; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeBox", { /** * Returns whether the `IgxInputGroupComponent` type is box. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeBox = this.inputGroup.isTypeBox; *} *``` */ get: function () { return this._type === IgxInputGroupType.BOX; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeBorder", { /** * Returns whether the `IgxInputGroupComponent` type is border. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeBorder = this.inputGroup.isTypeBorder; *} * ``` */ get: function () { return this._type === IgxInputGroupType.BORDER; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeFluent", { /** * Returns whether the `IgxInputGroupComponent` type is Fluent. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeFluent = this.inputGroup.isTypeFluent; *} * ``` */ get: function () { return this._type === IgxInputGroupType.FLUENT; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeSearch", { /** * Returns whether the `IgxInputGroupComponent` type is search. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeSearch = this.inputGroup.isTypeSearch; *} * ``` */ get: function () { return this._type === IgxInputGroupType.SEARCH; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeFluentSearch", { /** * Returns whether the `IgxInputGroupComponent` type is fluentSearch. * ```typescript *@ViewChild("MyInputGroup1") *public inputGroup: IgxInputGroupComponent; *ngAfterViewInit(){ * let isTypeFluentSearch = this.inputGroup.isTypeFluentSearch; *} * ``` */ get: function () { return this._type === IgxInputGroupType.FLUENT_SEARCH; }, enumerable: true, configurable: true }); Object.defineProperty(IgxInputGroupComponent.prototype, "filled", { get: function () { return this._filled; }, set: function (val) { this._filled = val; }, enumerable: true, configurable: true }); var IgxInputGroupComponent_1; IgxInputGroupComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] } ]; }; __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "id", void 0); __decorate([ HostBinding('class.igx-input-group'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "defaultClass", void 0); __decorate([ HostBinding('class.igx-input-group--placeholder'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "hasPlaceholder", void 0); __decorate([ HostBinding('class.igx-input-group--required'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isRequired", void 0); __decorate([ HostBinding('class.igx-input-group--focused'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isFocused", void 0); __decorate([ HostBinding('class.igx-input-group--box'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isBox", void 0); __decorate([ HostBinding('class.igx-input-group--border'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isBorder", void 0); __decorate([ HostBinding('class.igx-input-group--search'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isSearch", void 0); __decorate([ HostBinding('class.igx-input-group--fluent-search'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isFluentSearch", void 0); __decorate([ HostBinding('class.igx-input-group--fluent'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "isFluent", void 0); __decorate([ HostBinding('class.igx-input-group--disabled'), Input(), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "disabled", void 0); __decorate([ HostBinding('class.igx-input-group--valid'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "validClass", null); __decorate([ HostBinding('class.igx-input-group--invalid'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "invalidClass", null); __decorate([ HostBinding('class.igx-input-group--warning'), __metadata("design:type", Object) ], IgxInputGroupComponent.prototype, "hasWarning", void 0); __decorate([ ContentChildren(IgxHintDirective, { read: IgxHintDirective }), __metadata("design:type", QueryList) ], IgxInputGroupComponent.prototype, "hints", void 0); __decorate([ ContentChild(IgxInputDirective, { read: IgxInputDirective, static: true }), __metadata("design:type", IgxInputDirective) ], IgxInputGroupComponent.prototype, "input", void 0); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxInputGroupComponent.prototype, "onClick", null); __decorate([ Input('type'), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxInputGroupComponent.prototype, "type", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxInputGroupComponent.prototype, "supressInputAutofocus", null); __decorate([ HostBinding('class.igx-input-group--filled'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isFilled", null); __decorate([ HostBinding('class.igx-input-group--cosy'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isDisplayDensityCosy", null); __decorate([ HostBinding('class.igx-input-group--comfortable'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isDisplayDensityComfortable", null); __decorate([ HostBinding('class.igx-input-group--compact'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxInputGroupComponent.prototype, "isDisplayDensityCompact", null); IgxInputGroupComponent = IgxInputGroupComponent_1 = __decorate([ Component({ selector: 'igx-input-group', template: "<div class=\"igx-input-group__wrapper\" *ngIf=\"isTypeBox; else bundle\">\n <ng-container *ngTemplateOutlet=\"bundle\"></ng-container>\n</div>\n\n<div class=\"igx-input-group__hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n</div>\n\n<ng-template #material>\n <ng-content select=\"[igxLabel]\"></ng-content>\n</ng-template>\n\n<ng-template #bundle>\n\n<!-- <ng-content *ngIf=\"isTypeFluent\" select=\"[igxLabel]\"></ng-content>-->\n <ng-container *ngIf=\"isTypeFluent\">\n <ng-container *ngTemplateOutlet=\"material\"></ng-container>\n </ng-container>\n\n <div class=\"igx-input-group__bundle\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n <div class=\"igx-input-group__bundle-main\">\n\n <ng-container *ngIf=\"!isTypeFluent\">\n <ng-container *ngTemplateOutlet=\"material\"></ng-container>\n </ng-container>\n<!-- <ng-content *ngIf=\"!isTypeFluent\" select=\"[igxLabel]\"></ng-content>-->\n\n <ng-content select=\"[igxInput]\"></ng-content>\n </div>\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </div>\n <div class=\"igx-input-group__border\" *ngIf=\"hasBorder\"></div>\n</ng-template>\n", providers: [{ provide: IgxInputGroupBase, useExisting: IgxInputGroupComponent_1 }] }), __param(1, Optional()), __param(1, Inject(DisplayDensityToken)), __metadata("design:paramtypes", [ElementRef, Object]) ], IgxInputGroupComponent); return IgxInputGroupComponent; }(DisplayDensityBase)); export { IgxInputGroupComponent }; /** * @hidden */ var IgxInputGroupModule = /** @class */ (function () { function IgxInputGroupModule() { } IgxInputGroupModule = __decorate([ NgModule({ declarations: [ IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective ], exports: [ IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective, IgxPrefixModule, IgxSuffixModule ], imports: [ CommonModule, IgxPrefixModule, IgxSuffixModule ] }) ], IgxInputGroupModule); return IgxInputGroupModule; }()); export { IgxInputGroupModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFzQixlQUFlLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRixPQUFPLEVBQXNCLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxjQUFjLEVBQTBCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBRWhCLElBQUssaUJBT0o7QUFQRCxXQUFLLGlCQUFpQjtJQUNsQix5REFBSSxDQUFBO0lBQ0osdURBQUcsQ0FBQTtJQUNILDZEQUFNLENBQUE7SUFDTiw2REFBTSxDQUFBO0lBQ04sNkRBQU0sQ0FBQTtJQUNOLDJFQUFhLENBQUE7QUFDakIsQ0FBQyxFQVBJLGlCQUFpQixLQUFqQixpQkFBaUIsUUFPckI7QUFP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LENBQUk7SUFBRCwwQkFBQztDQUFBLEFBQXBDLElBQW9DO1NBQXZCLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE5nTW9kdWxlLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBJbmplY3QsXG4gICAgT3B0aW9uYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hIaW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9oaW50L2hpbnQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0RGlyZWN0aXZlLCBJZ3hJbnB1dFN0YXRlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9pbnB1dC9pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4TGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2xhYmVsL2xhYmVsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUsIElneFByZWZpeE1vZHVsZX0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hTdWZmaXhEaXJlY3RpdmUsIElneFN1ZmZpeE1vZHVsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvc3VmZml4L3N1ZmZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHksIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSB9IGZyb20gJy4uL2NvcmUvZGlzcGxheURlbnNpdHknO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cEJhc2UgfSBmcm9tICcuL2lucHV0LWdyb3VwLmNvbW1vbic7XG5cbmxldCBORVhUX0lEID0gMDtcblxuZW51bSBJZ3hJbnB1dEdyb3VwVHlwZSB7XG4gICAgTElORSxcbiAgICBCT1gsXG4gICAgQk9SREVSLFxuICAgIEZMVUVOVCxcbiAgICBTRUFSQ0gsXG4gICAgRkxVRU5UX1NFQVJDSCxcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtaW5wdXQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnaW5wdXQtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogSWd4SW5wdXRHcm91cEJhc2UsIHVzZUV4aXN0aW5nOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH1dXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0R3JvdXBDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBJZ3hJbnB1dEdyb3VwQmFzZSB7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IElneElucHV0R3JvdXBUeXBlLkxJTkU7XG4gICAgcHJpdmF0ZSBfZmlsbGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3VwcmVzc0lucHV0QXV0b2ZvY3VzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBFbGVtZW50UmVmIHByb3BlcnR5IG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuXG4gICAgICovXG4gICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiBgaWRgIGF0dHJpYnV0ZS4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaW5wdXQtZ3JvdXAgW2lkXT1cIidpZ3gtaW5wdXQtZ3JvdXAtNTUnXCI+PC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtaW5wdXQtZ3JvdXAtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB0aGUgYXV0b2dlbmVyYXRlZCBjbGFzcyBvZiB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLlxuICAgICAqIEJ5IGRlZmF1bHQgYXBwbGllZCB0aGUgY2xhc3MgaXMgYXBwbGllZC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICp0aGlzLmlucHV0R3JvdXAuZGVmYXVsdENsYXNzID0gZmFsc2U7XG4gICAgICpgYGBcbiAgICAgKn1cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cCcpXG4gICAgcHVibGljIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXBsYWNlaG9sZGVyJylcbiAgICBwdWJsaWMgaGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tcmVxdWlyZWQnKVxuICAgIHB1YmxpYyBpc1JlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWZvY3VzZWQnKVxuICAgIHB1YmxpYyBpc0ZvY3VzZWQgPSBmYWxzZTtcblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1ib3gnKVxuICAgIHB1YmxpYyBpc0JveCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1ib3JkZXInKVxuICAgIHB1YmxpYyBpc0JvcmRlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1zZWFyY2gnKVxuICAgIHB1YmxpYyBpc1NlYXJjaCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1mbHVlbnQtc2VhcmNoJylcbiAgICBwdWJsaWMgaXNGbHVlbnRTZWFyY2ggPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tZmx1ZW50JylcbiAgICBwdWJsaWMgaXNGbHVlbnQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGRpc2FibGVzIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaW5wdXQtZ3JvdXAgW2Rpc2FibGVkXT1cIid0cnVlJ1wiPjwvaWd4LWlucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1kaXNhYmxlZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tdmFsaWQnKVxuICAgIHB1YmxpYyBnZXQgdmFsaWRDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQudmFsaWQgPT09IElneElucHV0U3RhdGUuVkFMSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1pbnZhbGlkJylcbiAgICBwdWJsaWMgZ2V0IGludmFsaWRDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQudmFsaWQgPT09IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXdhcm5pbmcnKVxuICAgIHB1YmxpYyBoYXNXYXJuaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hIaW50RGlyZWN0aXZlLCB7IHJlYWQ6IElneEhpbnREaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgaGludHM6IFF1ZXJ5TGlzdDxJZ3hIaW50RGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneElucHV0RGlyZWN0aXZlLCB7IHJlYWQ6IElneElucHV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fc3VwcmVzc0lucHV0QXV0b2ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGhvdyB0aGUgaW5wdXQgd2lsbCBiZSBzdHlsZWQuXG4gICAgICogVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSBgbGluZWAsIGBib3hgLCBgYm9yZGVyYCwgYGZsdWVudGAsIGBzZWFyY2hgIGFuZCBgZmx1ZW50U2VhcmNoYC4gVGhlIGRlZmF1bHQgaXMgYGxpbmVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKjxpZ3gtaW5wdXQtZ3JvdXAgW3R5cGVdPVwiJ3NlYXJjaCdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ3R5cGUnKVxuICAgIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdHlwZTogSWd4SW5wdXRHcm91cFR5cGUgPSAoSWd4SW5wdXRHcm91cFR5cGUgYXMgYW55KVt2YWx1ZS50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc0JveCA9IHRoaXMuaXNGbHVlbnQgPSB0aGlzLmlzRmx1ZW50U2VhcmNoID0gdGhpcy5pc0JvcmRlciA9IHRoaXMuaXNTZWFyY2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuQk9YOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm94ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1JERVI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb3JkZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLkZMVUVOVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0ZsdWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuRkxVRU5UX1NFQVJDSDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0ZsdWVudFNlYXJjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuU0VBUkNIOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2VhcmNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbnB1dCBlbGVtZW50IG9mIHRoZSBpbnB1dCBncm91cCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZm9jdXNlZCBvbiBjbGljay5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IHRoaXMuaW5wdXRHcm91cC5zdXByZXNzSW5wdXRBdXRvZm9jdXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGlucHV0IGVsZW1lbnQgb2YgdGhlIGlucHV0IGdyb3VwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmb2N1c2VkIG9uIGNsaWNrLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWlucHV0LWdyb3VwIFtzdXByZXNzSW5wdXRBdXRvZm9jdXNdPVwidHJ1ZVwiPjwvaWd4LWlucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc3VwcmVzc0lucHV0QXV0b2ZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1maWxsZWQnKVxuICAgIGdldCBpc0ZpbGxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxlZCB8fCAodGhpcy5pbnB1dCAmJiB0aGlzLmlucHV0LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29zeScpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb3N5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29zeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29tZm9ydGFibGUnKVxuICAgIGdldCBpc0Rpc3BsYXlEZW5zaXR5Q29tZm9ydGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29tcGFjdCcpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb21wYWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tcGFjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuIEhvdyB0aGUgaW5wdXQgaXMgc3R5bGVkLlxuICAgICAqIFZhbHVlcyBhcmUgYGxpbmVgIC0gMCwgYGJveGAgLSAxLCBgYm9yZGVyYCAtIDIsICBgZmx1ZW50YCAtIDMgYGZsdWVudFNlYXJjaGAgLSA0IGFuZCBgc2VhcmNoYCAtIDUuIFRoZSBkZWZhdWx0IGlzIGBsaW5lYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpbnB1dFR5cGUgPSB0aGlzLmlucHV0R3JvdXAudHlwZTtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByaXZhdGUgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucykge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgaGFzIGhpbnRzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlucHV0SGludHMgPSB0aGlzLmlucHV0R3JvdXAuaGFzSGludHM7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGhhc0hpbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaW50cy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIGhhcyBib3JkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cFwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaW5wdXRCcm9kZXIgPSB0aGlzLmlucHV0R3JvdXAuaGFzQm9yZGVyO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBoYXNCb3JkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5MSU5FIHx8XG4gICAgICAgICAgICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBsaW5lLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVMaW5lID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZUxpbmU7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1R5cGVMaW5lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkxJTkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBib3guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUJveCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVCb3g7XG4gICAgICp9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlQm94KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuQk9YO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIHR5cGUgaXMgYm9yZGVyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVCb3JkZXIgPSB0aGlzLmlucHV0R3JvdXAuaXNUeXBlQm9yZGVyO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc1R5cGVCb3JkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1JERVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBGbHVlbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUZsdWVudCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVGbHVlbnQ7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZUZsdWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkZMVUVOVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCB0eXBlIGlzIHNlYXJjaC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwMVwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaXNUeXBlU2VhcmNoID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZVNlYXJjaDtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlU2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLlNFQVJDSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YCB0eXBlIGlzIGZsdWVudFNlYXJjaC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwMVwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaXNUeXBlRmx1ZW50U2VhcmNoID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZUZsdWVudFNlYXJjaDtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlRmx1ZW50U2VhcmNoKCkge1xuICAgICAgICByZXR1cm4gIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkZMVUVOVF9TRUFSQ0g7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxlZDtcbiAgICB9XG5cbiAgICBzZXQgZmlsbGVkKHZhbCkge1xuICAgICAgICB0aGlzLl9maWxsZWQgPSB2YWw7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgSWd4SW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgSWd4SGludERpcmVjdGl2ZSxcbiAgICAgICAgSWd4SW5wdXREaXJlY3RpdmUsXG4gICAgICAgIElneExhYmVsRGlyZWN0aXZlXG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIElneElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgICAgIElneEhpbnREaXJlY3RpdmUsXG4gICAgICAgIElneElucHV0RGlyZWN0aXZlLFxuICAgICAgICBJZ3hMYWJlbERpcmVjdGl2ZSxcbiAgICAgICAgSWd4UHJlZml4TW9kdWxlLFxuICAgICAgICBJZ3hTdWZmaXhNb2R1bGVcbiAgICBdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBJZ3hQcmVmaXhNb2R1bGUsXG4gICAgICAgIElneFN1ZmZpeE1vZHVsZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4SW5wdXRHcm91cE1vZHVsZSB7IH1cbiJdfQ==