UNPKG

@catull/igniteui-angular

Version:

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

361 lines 37.4 kB
import { __decorate, __extends, __metadata, __param } from "tslib"; import { Directive, Input, Self, Optional, Inject, HostBinding, Output, EventEmitter, NgModule, ElementRef, HostListener, ChangeDetectorRef, OnDestroy } from '@angular/core'; import { NgModel, FormControlName } from '@angular/forms'; import { CommonModule } from '@angular/common'; import { Subject } from 'rxjs'; import { first, takeUntil } from 'rxjs/operators'; import { AbsoluteScrollStrategy, AutoPositionStrategy } from '../../services/index'; import { IgxDropDownModule, IgxDropDownComponent, IgxDropDownItemNavigationDirective } from '../../drop-down/index'; import { IgxInputGroupComponent } from '../../input-group/index'; /** * **Ignite UI for Angular Autocomplete** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/autocomplete.html) * * The igxAutocomplete directive provides a way to enhance a text input * by showing a drop down of suggested options, provided by the developer. * * Example: * ```html * <input type="text" [igxAutocomplete]="townsPanel" /> * <igx-drop-down #townsPanel> * <igx-drop-down-item *ngFor="let town of towns | startsWith:townSelected" [value]="town"> * {{town}} * </igx-drop-down-item> * </igx-drop-down> * ``` */ var IgxAutocompleteDirective = /** @class */ (function (_super) { __extends(IgxAutocompleteDirective, _super); function IgxAutocompleteDirective(ngModel, formControl, group, elementRef, cdr) { var _this = _super.call(this, null) || this; _this.ngModel = ngModel; _this.formControl = formControl; _this.group = group; _this.elementRef = elementRef; _this.cdr = cdr; _this.defaultSettings = { modal: false, scrollStrategy: new AbsoluteScrollStrategy(), positionStrategy: new AutoPositionStrategy({ target: _this.parentElement }), excludePositionTarget: true }; _this.dropDownOpened$ = new Subject(); /** * Enables/disables autocomplete component * * ```typescript * // get * let disabled = this.autocomplete.disabled; * ``` * ```html * <!--set--> * <input type="text" [igxAutocomplete]="townsPanel" [igxAutocompleteDisabled]="disabled"/> * ``` * ```typescript * // set * public disabled = true; * ``` */ _this.disabled = false; /** * Emitted after item from the drop down is selected * * ```html * <input igxInput [igxAutocomplete]="townsPanel" (onItemSelected)='itemSelected($event)' /> * ``` */ _this.onItemSelected = new EventEmitter(); /** @hidden @internal */ _this.autofill = 'off'; /** @hidden @internal */ _this.role = 'combobox'; _this.select = function (value) { if (!value.newSelection) { return; } value.cancel = true; // Disable selection in the drop down, because in autocomplete we do not save selection. var newValue = value.newSelection.value; var args = { value: newValue, cancel: false }; _this.onItemSelected.emit(args); if (args.cancel) { return; } _this.close(); _this.nativeElement.focus(); // Update model after the input is re-focused, in order to have proper valid styling. // Otherwise when item is selected using mouse (and input is blurred), then valid style will be removed. _this.model ? _this.model.control.setValue(newValue) : _this.nativeElement.value = newValue; }; _this.highlightFirstItem = function () { if (_this.target.focusedItem) { _this.target.focusedItem.focused = false; _this.target.focusedItem = null; } _this.target.navigateFirst(); _this.cdr.detectChanges(); }; return _this; } Object.defineProperty(IgxAutocompleteDirective.prototype, "model", { get: function () { return this.ngModel || this.formControl; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "nativeElement", { /** @hidden @internal */ get: function () { return this.elementRef.nativeElement; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "parentElement", { /** @hidden @internal */ get: function () { return this.group ? this.group.element.nativeElement : this.nativeElement; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "settings", { get: function () { var settings = Object.assign({}, this.defaultSettings, this.autocompleteSettings); if (!settings.positionStrategy.settings.target) { var positionStrategyClone = settings.positionStrategy.clone(); positionStrategyClone.settings.target = this.parentElement; settings.positionStrategy = positionStrategyClone; } return settings; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "ariaExpanded", { /** @hidden @internal */ get: function () { return !this.collapsed; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "hasPopUp", { /** @hidden @internal */ get: function () { return 'listbox'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "ariaOwns", { /** @hidden @internal */ get: function () { return this.target.listId; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "ariaActiveDescendant", { /** @hidden @internal */ get: function () { return !this.target.collapsed && this.target.focusedItem ? this.target.focusedItem.id : null; }, enumerable: true, configurable: true }); Object.defineProperty(IgxAutocompleteDirective.prototype, "ariaAutocomplete", { /** @hidden @internal */ get: function () { return 'list'; }, enumerable: true, configurable: true }); /** @hidden @internal */ IgxAutocompleteDirective.prototype.onInput = function () { this.open(); }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.onArrowDown = function (event) { event.preventDefault(); this.open(); }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.onTab = function () { this.close(); }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.handleKeyDown = function (event) { if (!this.collapsed) { switch (event.key.toLowerCase()) { case 'space': case 'spacebar': case ' ': case 'home': case 'end': return; default: _super.prototype.handleKeyDown.call(this, event); } } }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.onArrowDownKeyDown = function () { _super.prototype.onArrowDownKeyDown.call(this); }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.onArrowUpKeyDown = function () { _super.prototype.onArrowUpKeyDown.call(this); }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.onEndKeyDown = function () { _super.prototype.onEndKeyDown.call(this); }; /** @hidden @internal */ IgxAutocompleteDirective.prototype.onHomeKeyDown = function () { _super.prototype.onHomeKeyDown.call(this); }; /** * Closes autocomplete drop down */ IgxAutocompleteDirective.prototype.close = function () { if (this.collapsed) { return; } this.target.close(); this.dropDownOpened$.next(); }; /** * Opens autocomplete drop down */ IgxAutocompleteDirective.prototype.open = function () { if (this.disabled || !this.collapsed) { return; } this.target.width = this.parentElement.clientWidth + 'px'; this.target.open(this.settings); this.target.onSelection.pipe(takeUntil(this.dropDownOpened$)).subscribe(this.select); this.target.onOpened.pipe(first()).subscribe(this.highlightFirstItem); this.target.children.changes.pipe(takeUntil(this.dropDownOpened$)).subscribe(this.highlightFirstItem); }; Object.defineProperty(IgxAutocompleteDirective.prototype, "collapsed", { get: function () { return this.target ? this.target.collapsed : true; }, enumerable: true, configurable: true }); /** @hidden */ IgxAutocompleteDirective.prototype.ngOnDestroy = function () { this.dropDownOpened$.complete(); }; IgxAutocompleteDirective.ctorParameters = function () { return [ { type: NgModel, decorators: [{ type: Self }, { type: Optional }, { type: Inject, args: [NgModel,] }] }, { type: FormControlName, decorators: [{ type: Self }, { type: Optional }, { type: Inject, args: [FormControlName,] }] }, { type: IgxInputGroupComponent, decorators: [{ type: Optional }] }, { type: ElementRef }, { type: ChangeDetectorRef } ]; }; __decorate([ Input('igxAutocomplete'), __metadata("design:type", IgxDropDownComponent) ], IgxAutocompleteDirective.prototype, "target", void 0); __decorate([ Input('igxAutocompleteDisabled'), __metadata("design:type", Object) ], IgxAutocompleteDirective.prototype, "disabled", void 0); __decorate([ Input('igxAutocompleteSettings'), __metadata("design:type", Object) ], IgxAutocompleteDirective.prototype, "autocompleteSettings", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxAutocompleteDirective.prototype, "onItemSelected", void 0); __decorate([ HostBinding('attr.autocomplete'), __metadata("design:type", Object) ], IgxAutocompleteDirective.prototype, "autofill", void 0); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object) ], IgxAutocompleteDirective.prototype, "role", void 0); __decorate([ HostBinding('attr.aria-expanded'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxAutocompleteDirective.prototype, "ariaExpanded", null); __decorate([ HostBinding('attr.aria-haspopup'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxAutocompleteDirective.prototype, "hasPopUp", null); __decorate([ HostBinding('attr.aria-owns'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxAutocompleteDirective.prototype, "ariaOwns", null); __decorate([ HostBinding('attr.aria-activedescendant'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxAutocompleteDirective.prototype, "ariaActiveDescendant", null); __decorate([ HostBinding('attr.aria-autocomplete'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxAutocompleteDirective.prototype, "ariaAutocomplete", null); __decorate([ HostListener('input'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxAutocompleteDirective.prototype, "onInput", null); __decorate([ HostListener('keydown.ArrowDown', ['$event']), HostListener('keydown.Alt.ArrowDown', ['$event']), HostListener('keydown.ArrowUp', ['$event']), HostListener('keydown.Alt.ArrowUp', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Event]), __metadata("design:returntype", void 0) ], IgxAutocompleteDirective.prototype, "onArrowDown", null); __decorate([ HostListener('keydown.Tab'), HostListener('keydown.Shift.Tab'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], IgxAutocompleteDirective.prototype, "onTab", null); IgxAutocompleteDirective = __decorate([ Directive({ selector: '[igxAutocomplete]' }), __param(0, Self()), __param(0, Optional()), __param(0, Inject(NgModel)), __param(1, Self()), __param(1, Optional()), __param(1, Inject(FormControlName)), __param(2, Optional()), __metadata("design:paramtypes", [NgModel, FormControlName, IgxInputGroupComponent, ElementRef, ChangeDetectorRef]) ], IgxAutocompleteDirective); return IgxAutocompleteDirective; }(IgxDropDownItemNavigationDirective)); export { IgxAutocompleteDirective }; /** @hidden */ var IgxAutocompleteModule = /** @class */ (function () { function IgxAutocompleteModule() { } IgxAutocompleteModule = __decorate([ NgModule({ imports: [IgxDropDownModule, CommonModule], declarations: [IgxAutocompleteDirective], exports: [IgxAutocompleteDirective] }) ], IgxAutocompleteModule); return IgxAutocompleteModule; }()); export { IgxAutocompleteModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlcy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQzNFLFFBQVEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFtQixzQkFBc0IsRUFBc0Msb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6SSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQXVCLGtDQUFrQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekksT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUF1QmpFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBSUg7SUFBOEMsNENBQWtDO0lBRTVFLGtDQUEyRCxPQUFnQixFQUNSLFdBQTRCLEVBQzdELEtBQTZCLEVBQ3pDLFVBQXNCLEVBQ3RCLEdBQXNCO1FBSjVDLFlBS0ksa0JBQU0sSUFBSSxDQUFDLFNBQ2Q7UUFOMEQsYUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNSLGlCQUFXLEdBQVgsV0FBVyxDQUFp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QUFFLG1CQUFtQjtTQUNoQyxDQUFDO1FBR2UsV0FBQSxJQUFJLEVBQUUsQ0FBQSxFQUFFLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxXQUFBLElBQUksRUFBRSxDQUFBLEVBQUUsV0FBQSxRQUFRLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQzNDLFdBQUEsUUFBUSxFQUFFLENBQUE7eUNBRjZDLE9BQU87WUFDSyxlQUFlO1lBQ3RELHNCQUFzQjtZQUM3QixVQUFVO1lBQ2pCLGlCQUFpQjtPQU5uQyx3QkFBd0IsQ0E2UXBDO0lBQUQsK0JBQUM7Q0FBQSxBQTdRRCxDQUE4QyxrQ0FBa0MsR0E2US9FO1NBN1FZLHdCQUF3QjtBQStRckMsY0FBYztBQU1kO0lBQUE7SUFBcUMsQ0FBQztJQUF6QixxQkFBcUI7UUFMakMsUUFBUSxDQUFDO1lBQ04sT0FBTyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDO1lBQzFDLFlBQVksRUFBRSxDQUFDLHdCQUF3QixDQUFDO1lBQ3hDLE9BQU8sRUFBRSxDQUFDLHdCQUF3QixDQUFDO1NBQ3RDLENBQUM7T0FDVyxxQkFBcUIsQ0FBSTtJQUFELDRCQUFDO0NBQUEsQUFBdEMsSUFBc0M7U0FBekIscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsIElucHV0LCBTZWxmLCBPcHRpb25hbCwgSW5qZWN0LCBIb3N0QmluZGluZywgT3V0cHV0LCBFdmVudEVtaXR0ZXIsXG4gICAgTmdNb2R1bGUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdNb2RlbCwgRm9ybUNvbnRyb2xOYW1lIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpcnN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDYW5jZWxhYmxlRXZlbnRBcmdzLCBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgT3ZlcmxheVNldHRpbmdzLCBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBJU2Nyb2xsU3RyYXRlZ3ksIElQb3NpdGlvblN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2luZGV4JztcbmltcG9ydCB7IElneERyb3BEb3duTW9kdWxlLCBJZ3hEcm9wRG93bkNvbXBvbmVudCwgSVNlbGVjdGlvbkV2ZW50QXJncywgSWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2Ryb3AtZG93bi9pbmRleCc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW5wdXQtZ3JvdXAvaW5kZXgnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4uL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgdGhhdCBlbmNhcHN1bGF0ZXMgb25JdGVtU2VsZWN0aW9uIGV2ZW50IGFyZ3VtZW50cyAtIG5ldyB2YWx1ZSBhbmQgY2FuY2VsIHNlbGVjdGlvbi5cbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvY29tcGxldGVJdGVtU2VsZWN0aW9uRXZlbnRBcmdzIGV4dGVuZHMgQ2FuY2VsYWJsZUV2ZW50QXJncywgSUJhc2VFdmVudEFyZ3Mge1xuICAgIC8qKlxuICAgICAqIE5ldyB2YWx1ZSBzZWxlY3RlZCBmcm9tIHRoZSBkcm9wIGRvd25cbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9jb21wbGV0ZU92ZXJsYXlTZXR0aW5ncyB7XG4gICAgLyoqIFBvc2l0aW9uIHN0cmF0ZWd5IHRvIHVzZSB3aXRoIHRoaXMgc2V0dGluZ3MgKi9cbiAgICBwb3NpdGlvblN0cmF0ZWd5PzogSVBvc2l0aW9uU3RyYXRlZ3k7XG4gICAgLyoqIFNjcm9sbCBzdHJhdGVneSB0byB1c2Ugd2l0aCB0aGlzIHNldHRpbmdzICovXG4gICAgc2Nyb2xsU3RyYXRlZ3k/OiBJU2Nyb2xsU3RyYXRlZ3k7XG4gICAgLyoqIFNldCB0aGUgb3V0bGV0IGNvbnRhaW5lciB0byBhdHRhY2ggdGhlIG92ZXJsYXkgdG8gKi9cbiAgICBvdXRsZXQ/OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZjtcbn1cblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBBdXRvY29tcGxldGUqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlLmh0bWwpXG4gKlxuICogVGhlIGlneEF1dG9jb21wbGV0ZSBkaXJlY3RpdmUgcHJvdmlkZXMgYSB3YXkgdG8gZW5oYW5jZSBhIHRleHQgaW5wdXRcbiAqIGJ5IHNob3dpbmcgYSBkcm9wIGRvd24gb2Ygc3VnZ2VzdGVkIG9wdGlvbnMsIHByb3ZpZGVkIGJ5IHRoZSBkZXZlbG9wZXIuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtpZ3hBdXRvY29tcGxldGVdPVwidG93bnNQYW5lbFwiIC8+XG4gKiA8aWd4LWRyb3AtZG93biAjdG93bnNQYW5lbD5cbiAqICAgICA8aWd4LWRyb3AtZG93bi1pdGVtICpuZ0Zvcj1cImxldCB0b3duIG9mIHRvd25zIHwgc3RhcnRzV2l0aDp0b3duU2VsZWN0ZWRcIiBbdmFsdWVdPVwidG93blwiPlxuICogICAgICAgICB7e3Rvd259fVxuICogICAgIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICogPC9pZ3gtZHJvcC1kb3duPlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneEF1dG9jb21wbGV0ZV0nXG59KVxuZXhwb3J0IGNsYXNzIElneEF1dG9jb21wbGV0ZURpcmVjdGl2ZSBleHRlbmRzIElneERyb3BEb3duSXRlbU5hdmlnYXRpb25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgY29uc3RydWN0b3IoQFNlbGYoKSBAT3B0aW9uYWwoKSBASW5qZWN0KE5nTW9kZWwpIHByb3RlY3RlZCBuZ01vZGVsOiBOZ01vZGVsLFxuICAgICAgICAgICAgICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgQEluamVjdChGb3JtQ29udHJvbE5hbWUpIHByb3RlY3RlZCBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2xOYW1lLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBncm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICBzdXBlcihudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlZmF1bHRTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koeyB0YXJnZXQ6IHRoaXMucGFyZW50RWxlbWVudCB9KSxcbiAgICAgICAgZXhjbHVkZVBvc2l0aW9uVGFyZ2V0OiB0cnVlXG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBpZDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBkcm9wRG93bk9wZW5lZCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHByb3RlY3RlZCBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nTW9kZWwgfHwgdGhpcy5mb3JtQ29udHJvbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MSW5wdXRFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIGdldCBwYXJlbnRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAgPyB0aGlzLmdyb3VwLmVsZW1lbnQubmF0aXZlRWxlbWVudCA6IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBzZXR0aW5ncygpOiBPdmVybGF5U2V0dGluZ3Mge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzLCB0aGlzLmF1dG9jb21wbGV0ZVNldHRpbmdzKTtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLnRhcmdldCkge1xuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneUNsb25lOiBJUG9zaXRpb25TdHJhdGVneSA9IHNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuY2xvbmUoKTtcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3lDbG9uZS5zZXR0aW5ncy50YXJnZXQgPSB0aGlzLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBzZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5ID0gcG9zaXRpb25TdHJhdGVneUNsb25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXR0aW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0YXJnZXQgb2YgdGhlIGF1dG9jb21wbGV0ZSBkaXJlY3RpdmVcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCAtLT5cbiAgICAgKiA8aW5wdXQgW2lneEF1dG9jb21wbGV0ZV09XCJkcm9wZG93blwiIC8+XG4gICAgICogLi4uXG4gICAgICogPGlneC1kcm9wLWRvd24gI2Ryb3Bkb3duPlxuICAgICAqIC4uLlxuICAgICAqIDwvaWd4LWRyb3AtZG93bj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneEF1dG9jb21wbGV0ZScpXG4gICAgcHVibGljIHRhcmdldDogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL2Rpc2FibGVzIGF1dG9jb21wbGV0ZSBjb21wb25lbnRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgZGlzYWJsZWQgPSB0aGlzLmF1dG9jb21wbGV0ZS5kaXNhYmxlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtpZ3hBdXRvY29tcGxldGVdPVwidG93bnNQYW5lbFwiIFtpZ3hBdXRvY29tcGxldGVEaXNhYmxlZF09XCJkaXNhYmxlZFwiLz5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gc2V0XG4gICAgICogcHVibGljIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneEF1dG9jb21wbGV0ZURpc2FibGVkJylcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgb3ZlcmxheSBzZXR0aW5ncyBmb3IgdGhlIGF1dG9jb21wbGV0ZSBkcm9wIGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgc2V0dGluZ3MgPSB0aGlzLmF1dG9jb21wbGV0ZS5hdXRvY29tcGxldGVTZXR0aW5ncztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtpZ3hBdXRvY29tcGxldGVdPVwidG93bnNQYW5lbFwiIFtpZ3hBdXRvY29tcGxldGVTZXR0aW5nc109XCJzZXR0aW5nc1wiLz5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gc2V0XG4gICAgICogdGhpcy5zZXR0aW5ncyA9IHtcbiAgICAgKiAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3koe1xuICAgICAqICAgICAgY2xvc2VBbmltYXRpb246IG51bGwsXG4gICAgICogICAgICBvcGVuQW5pbWF0aW9uOiBudWxsXG4gICAgICogIH0pXG4gICAgICogfTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoJ2lneEF1dG9jb21wbGV0ZVNldHRpbmdzJylcbiAgICBhdXRvY29tcGxldGVTZXR0aW5nczogQXV0b2NvbXBsZXRlT3ZlcmxheVNldHRpbmdzO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBpdGVtIGZyb20gdGhlIGRyb3AgZG93biBpcyBzZWxlY3RlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dCBpZ3hJbnB1dCBbaWd4QXV0b2NvbXBsZXRlXT1cInRvd25zUGFuZWxcIiAob25JdGVtU2VsZWN0ZWQpPSdpdGVtU2VsZWN0ZWQoJGV2ZW50KScgLz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBvbkl0ZW1TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QXV0b2NvbXBsZXRlSXRlbVNlbGVjdGlvbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hdXRvY29tcGxldGUnKVxuICAgIHB1YmxpYyBhdXRvZmlsbCA9ICdvZmYnO1xuXG4gICAgLyoqIEBoaWRkZW4gIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgcm9sZSA9ICdjb21ib2JveCc7XG5cbiAgICAvKiogQGhpZGRlbiAgQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICAgIHB1YmxpYyBnZXQgYXJpYUV4cGFuZGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpXG4gICAgcHVibGljIGdldCBoYXNQb3BVcCgpIHtcbiAgICAgICAgcmV0dXJuICdsaXN0Ym94JztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAgQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtb3ducycpXG4gICAgcHVibGljIGdldCBhcmlhT3ducygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0Lmxpc3RJZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAgQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudCcpXG4gICAgcHVibGljIGdldCBhcmlhQWN0aXZlRGVzY2VuZGFudCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRhcmdldC5jb2xsYXBzZWQgJiYgdGhpcy50YXJnZXQuZm9jdXNlZEl0ZW0gPyB0aGlzLnRhcmdldC5mb2N1c2VkSXRlbS5pZCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWF1dG9jb21wbGV0ZScpXG4gICAgcHVibGljIGdldCBhcmlhQXV0b2NvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gJ2xpc3QnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdpbnB1dCcpXG4gICAgb25JbnB1dCgpIHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dEb3duJywgWyckZXZlbnQnXSlcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLkFsdC5BcnJvd0Rvd24nLCBbJyRldmVudCddKVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dVcCcsIFsnJGV2ZW50J10pXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5BbHQuQXJyb3dVcCcsIFsnJGV2ZW50J10pXG4gICAgb25BcnJvd0Rvd24oZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLlRhYicpXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5TaGlmdC5UYWInKVxuICAgIG9uVGFiKCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gIEBpbnRlcm5hbCAqL1xuICAgIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZWJhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgY2FzZSAnaG9tZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZUtleURvd24oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gIEBpbnRlcm5hbCAqL1xuICAgIG9uQXJyb3dEb3duS2V5RG93bigpIHtcbiAgICAgICAgc3VwZXIub25BcnJvd0Rvd25LZXlEb3duKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gIEBpbnRlcm5hbCAqL1xuICAgIG9uQXJyb3dVcEtleURvd24oKSB7XG4gICAgICAgIHN1cGVyLm9uQXJyb3dVcEtleURvd24oKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAgQGludGVybmFsICovXG4gICAgb25FbmRLZXlEb3duKCkge1xuICAgICAgICBzdXBlci5vbkVuZEtleURvd24oKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAgQGludGVybmFsICovXG4gICAgb25Ib21lS2V5RG93bigpIHtcbiAgICAgICAgc3VwZXIub25Ib21lS2V5RG93bigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyBhdXRvY29tcGxldGUgZHJvcCBkb3duXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhcmdldC5jbG9zZSgpO1xuICAgICAgICB0aGlzLmRyb3BEb3duT3BlbmVkJC5uZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYXV0b2NvbXBsZXRlIGRyb3AgZG93blxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhcmdldC53aWR0aCA9IHRoaXMucGFyZW50RWxlbWVudC5jbGllbnRXaWR0aCArICdweCc7XG4gICAgICAgIHRoaXMudGFyZ2V0Lm9wZW4odGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMudGFyZ2V0Lm9uU2VsZWN0aW9uLnBpcGUodGFrZVVudGlsKHRoaXMuZHJvcERvd25PcGVuZWQkKSkuc3Vic2NyaWJlKHRoaXMuc2VsZWN0KTtcbiAgICAgICAgdGhpcy50YXJnZXQub25PcGVuZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUodGhpcy5oaWdobGlnaHRGaXJzdEl0ZW0pO1xuICAgICAgICB0aGlzLnRhcmdldC5jaGlsZHJlbi5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZHJvcERvd25PcGVuZWQkKSkuc3Vic2NyaWJlKHRoaXMuaGlnaGxpZ2h0Rmlyc3RJdGVtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhcmdldCA/IHRoaXMudGFyZ2V0LmNvbGxhcHNlZCA6IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3QgPSAodmFsdWU6IElTZWxlY3Rpb25FdmVudEFyZ3MpID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZS5uZXdTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5jYW5jZWwgPSB0cnVlOyAvLyBEaXNhYmxlIHNlbGVjdGlvbiBpbiB0aGUgZHJvcCBkb3duLCBiZWNhdXNlIGluIGF1dG9jb21wbGV0ZSB3ZSBkbyBub3Qgc2F2ZSBzZWxlY3Rpb24uXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUubmV3U2VsZWN0aW9uLnZhbHVlO1xuICAgICAgICBjb25zdCBhcmdzOiBBdXRvY29tcGxldGVJdGVtU2VsZWN0aW9uRXZlbnRBcmdzID0geyB2YWx1ZTogbmV3VmFsdWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBtb2RlbCBhZnRlciB0aGUgaW5wdXQgaXMgcmUtZm9jdXNlZCwgaW4gb3JkZXIgdG8gaGF2ZSBwcm9wZXIgdmFsaWQgc3R5bGluZy5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHdoZW4gaXRlbSBpcyBzZWxlY3RlZCB1c2luZyBtb3VzZSAoYW5kIGlucHV0IGlzIGJsdXJyZWQpLCB0aGVuIHZhbGlkIHN0eWxlIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgICAgdGhpcy5tb2RlbCA/IHRoaXMubW9kZWwuY29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSkgOiB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZ2hsaWdodEZpcnN0SXRlbSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0LmZvY3VzZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5mb2N1c2VkSXRlbS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5mb2N1c2VkSXRlbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YXJnZXQubmF2aWdhdGVGaXJzdCgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZHJvcERvd25PcGVuZWQkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuXG4vKiogQGhpZGRlbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbSWd4RHJvcERvd25Nb2R1bGUsIENvbW1vbk1vZHVsZV0sXG4gICAgZGVjbGFyYXRpb25zOiBbSWd4QXV0b2NvbXBsZXRlRGlyZWN0aXZlXSxcbiAgICBleHBvcnRzOiBbSWd4QXV0b2NvbXBsZXRlRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hBdXRvY29tcGxldGVNb2R1bGUgeyB9XG4iXX0=