UNPKG

@catull/igniteui-angular

Version:

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

407 lines 33.7 kB
import { __decorate, __metadata, __param } from "tslib"; import { IGX_DROPDOWN_BASE } from './drop-down.common'; import { Directive, Input, HostBinding, HostListener, ElementRef, Optional, Inject, DoCheck, Output, EventEmitter } from '@angular/core'; import { IgxSelectionAPIService } from '../core/selection'; import { DeprecateProperty, showMessage } from '../core/deprecateDecorators'; import { IgxDropDownGroupComponent } from './drop-down-group.component'; var NEXT_ID = 0; var warningShown = false; /** * An abstract class defining a drop-down item: * With properties / styles for selection, highlight, height * Bindable property for passing data (`value: any`) * Parent component (has to be used under a parent with type `IDropDownBase`) * Method for handling click on Host() */ var IgxDropDownItemBaseDirective = /** @class */ (function () { function IgxDropDownItemBaseDirective(dropDown, elementRef, group, selection) { this.dropDown = dropDown; this.elementRef = elementRef; this.group = group; this.selection = selection; /** * @hidden */ this._focused = false; this._selected = false; this._index = null; this._disabled = false; /** * Sets/gets the `id` of the item. * ```html * <igx-drop-down-item [id] = 'igx-drop-down-item-0'></igx-drop-down-item> * ``` * ```typescript * let itemId = this.item.id; * ``` * @memberof IgxSelectItemComponent */ this.id = "igx-drop-down-item-" + NEXT_ID++; /** *@hidden */ this.selectedChange = new EventEmitter(); /** * Gets/sets the `role` attribute of the item. Default is 'option'. * * ```html * <igx-drop-down-item [role]="customRole"></igx-drop-down-item> * ``` */ this.role = 'option'; } Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "hasIndex", { get: function () { return this._index !== null && this._index !== undefined; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemID", { /** * @hidden @internal */ get: function () { return this; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "index", { /** * The data index of the dropdown item. * * ```typescript * // get the data index of the selected dropdown item * let selectedItemIndex = this.dropdown.selectedItem.index * ``` */ get: function () { if (this._index === null) { warningShown = showMessage('IgxDropDownItemBaseDirective: Automatic index is deprecated.' + 'Bind in the template instead using `<igx-drop-down-item [index]="i"` instead.`', warningShown); return this.itemIndex; } return this._index; }, set: function (value) { this._index = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemStyle", { /** * @hidden @internal */ get: function () { return !this.isHeader; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemStyleCosy", { /** * @hidden @internal */ get: function () { return this.dropDown.displayDensity === 'cosy' && !this.isHeader; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemStyleCompact", { /** * @hidden @internal */ get: function () { return this.dropDown.displayDensity === 'compact' && !this.isHeader; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "selected", { /** * Sets/Gets if the item is the currently selected one in the dropdown * * ```typescript * let mySelectedItem = this.dropdown.selectedItem; * let isMyItemSelected = mySelectedItem.selected; // true * ``` * * Two-way data binding * ```html * <igx-drop-down-item [(selected)]='model.isSelected'></igx-drop-down-item> * ``` */ get: function () { return this._selected; }, set: function (value) { if (this.isHeader) { return; } this._selected = value; this.selectedChange.emit(this._selected); }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "isSelected", { /** * @hidden @internal */ get: function () { return this.selected; }, /** * @hidden @internal */ set: function (value) { this.selected = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "focused", { /** * Sets/gets if the given item is focused * ```typescript * let mySelectedItem = this.dropdown.selectedItem; * let isMyItemFocused = mySelectedItem.focused; * ``` */ get: function () { return (!this.isHeader && !this.disabled) && this._focused; }, /** * ```html * <igx-drop-down-item *ngFor="let item of items" focused={{!item.focused}}> * <div> * {{item.field}} * </div> * </igx-drop-down-item> * ``` */ set: function (value) { this._focused = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "isFocused", { /** * @hidden @internal */ get: function () { return this.focused; }, /** * @hidden @internal */ set: function (value) { this.focused = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "headerClassCosy", { /** * @hidden @internal */ get: function () { return this.isHeader && this.dropDown.displayDensity === 'cosy'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "headerClassCompact", { /** * @hidden @internal */ get: function () { return this.isHeader && this.dropDown.displayDensity === 'compact'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "disabled", { /** * Sets/gets if the given item is disabled * * ```typescript * // get * let mySelectedItem = this.dropdown.selectedItem; * let myItemIsDisabled = mySelectedItem.disabled; * ``` * * ```html * <igx-drop-down-item *ngFor="let item of items" disabled={{!item.disabled}}> * <div> * {{item.field}} * </div> * </igx-drop-down-item> * ``` * **NOTE:** Drop-down items inside of a disabled `IgxDropDownGroup` will always count as disabled */ get: function () { return this.group ? this.group.disabled || this._disabled : this._disabled; }, set: function (value) { this._disabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "itemIndex", { /** * Gets item index * @hidden @internal */ get: function () { return this.dropDown.items.indexOf(this); }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "elementHeight", { /** * Gets item element height * @hidden @internal */ get: function () { return this.elementRef.nativeElement.clientHeight; }, enumerable: true, configurable: true }); Object.defineProperty(IgxDropDownItemBaseDirective.prototype, "element", { /** * Get item html element * @hidden @internal */ get: function () { return this.elementRef; }, enumerable: true, configurable: true }); IgxDropDownItemBaseDirective.prototype.ngDoCheck = function () { if (this._selected) { var dropDownSelectedItem = this.dropDown.selectedItem; if (!dropDownSelectedItem) { this.dropDown.selectItem(this); } else if (this.hasIndex ? this._index !== dropDownSelectedItem.index || this.value !== dropDownSelectedItem.value : this !== dropDownSelectedItem) { this.dropDown.selectItem(this); } } }; IgxDropDownItemBaseDirective.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [IGX_DROPDOWN_BASE,] }] }, { type: ElementRef }, { type: IgxDropDownGroupComponent, decorators: [{ type: Optional }] }, { type: IgxSelectionAPIService, decorators: [{ type: Optional }, { type: Inject, args: [IgxSelectionAPIService,] }] } ]; }; __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxDropDownItemBaseDirective.prototype, "id", void 0); __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Object]) ], IgxDropDownItemBaseDirective.prototype, "index", null); __decorate([ Input(), __metadata("design:type", Object) ], IgxDropDownItemBaseDirective.prototype, "value", void 0); __decorate([ HostBinding('class.igx-drop-down__item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxDropDownItemBaseDirective.prototype, "itemStyle", null); __decorate([ HostBinding('class.igx-drop-down__item--cosy'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxDropDownItemBaseDirective.prototype, "itemStyleCosy", null); __decorate([ HostBinding('class.igx-drop-down__item--compact'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxDropDownItemBaseDirective.prototype, "itemStyleCompact", null); __decorate([ Input(), HostBinding('attr.aria-selected'), HostBinding('class.igx-drop-down__item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxDropDownItemBaseDirective.prototype, "selected", null); __decorate([ Output(), __metadata("design:type", Object) ], IgxDropDownItemBaseDirective.prototype, "selectedChange", void 0); __decorate([ Input(), DeprecateProperty("IgxDropDownItemBaseDirective `isSelected` property is deprecated.\n" + "Use `selected` instead."), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxDropDownItemBaseDirective.prototype, "isSelected", null); __decorate([ HostBinding('class.igx-drop-down__item--focused'), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxDropDownItemBaseDirective.prototype, "focused", null); __decorate([ DeprecateProperty("IgxDropDownItemBaseDirective `isFocused` property is depracated.\n" + "Use `focused` instead."), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxDropDownItemBaseDirective.prototype, "isFocused", null); __decorate([ Input(), HostBinding('class.igx-drop-down__header'), __metadata("design:type", Boolean) ], IgxDropDownItemBaseDirective.prototype, "isHeader", void 0); __decorate([ HostBinding('class.igx-drop-down__header--cosy'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxDropDownItemBaseDirective.prototype, "headerClassCosy", null); __decorate([ HostBinding('class.igx-drop-down__header--compact'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxDropDownItemBaseDirective.prototype, "headerClassCompact", null); __decorate([ Input(), HostBinding('attr.aria-disabled'), HostBinding('class.igx-drop-down__item--disabled'), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxDropDownItemBaseDirective.prototype, "disabled", null); __decorate([ Input(), HostBinding('attr.role'), __metadata("design:type", Object) ], IgxDropDownItemBaseDirective.prototype, "role", void 0); IgxDropDownItemBaseDirective = __decorate([ Directive({ selector: '[igxDropDownItemBase]' }), __param(0, Inject(IGX_DROPDOWN_BASE)), __param(2, Optional()), __param(3, Optional()), __param(3, Inject(IgxSelectionAPIService)), __metadata("design:paramtypes", [Object, ElementRef, IgxDropDownGroupComponent, IgxSelectionAPIService]) ], IgxDropDownItemBaseDirective); return IgxDropDownItemBaseDirective; }()); export { IgxDropDownItemBaseDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLWl0ZW0uYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZHJvcC1kb3duL2Ryb3AtZG93bi1pdGVtLmJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBRXpCOzs7Ozs7R0FNRztBQUlIO0lBcVNJLHNDQUN5QyxRQUF1QixFQUNsRCxVQUFzQixFQUNWLEtBQWdDLEVBQ0EsU0FBa0M7UUFIbkQsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUNsRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ1YsVUFBSyxHQUFMLEtBQUssQ0FBMkI7UUFDQSxjQUFTLEdBQVQsU0FBUyxDQUF5QjtRQXhTNUY7O1dBRUc7UUFDTyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFLNUI7Ozs7Ozs7OztXQVNHO1FBR0ksT0FBRSxHQUFHLHdCQUFzQixPQUFPLEVBQUksQ0FBQztRQXlHOUM7O1dB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LENBQUMsNkJBQTZCLENBQUM7O2tFQUNsQjtJQU16QjtRQURDLFdBQVcsQ0FBQyxtQ0FBbUMsQ0FBQzs7O3VFQUdoRDtJQU1EO1FBREMsV0FBVyxDQUFDLHNDQUFzQyxDQUFDOzs7MEVBR25EO0lBdUJEO1FBSEMsS0FBSyxFQUFFO1FBQ1AsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1FBQ2pDLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQzs7O2dFQUdsRDtJQWVEO1FBRkMsS0FBSyxFQUFFO1FBQ1AsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7OERBQ0Y7SUEzUWQsNEJBQTRCO1FBSHhDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSx1QkFBdUI7U0FDcEMsQ0FBQztRQXVTTyxXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBRXpCLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtpREFGckIsVUFBVTtZQUNILHlCQUF5QjtZQUNZLHNCQUFzQjtPQXpTbkYsNEJBQTRCLENBd1R4QztJQUFELG1DQUFDO0NBQUEsQUF4VEQsSUF3VEM7U0F4VFksNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURyb3BEb3duQmFzZSwgSUdYX0RST1BET1dOX0JBU0UgfSBmcm9tICcuL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT3B0aW9uYWwsIEluamVjdCwgRG9DaGVjaywgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneFNlbGVjdGlvbkFQSVNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBEZXByZWNhdGVQcm9wZXJ0eSwgc2hvd01lc3NhZ2UgfSBmcm9tICcuLi9jb3JlL2RlcHJlY2F0ZURlY29yYXRvcnMnO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vZHJvcC1kb3duLWdyb3VwLmNvbXBvbmVudCc7XG5cbmxldCBORVhUX0lEID0gMDtcbmxldCB3YXJuaW5nU2hvd24gPSBmYWxzZTtcblxuLyoqXG4gKiBBbiBhYnN0cmFjdCBjbGFzcyBkZWZpbmluZyBhIGRyb3AtZG93biBpdGVtOlxuICogV2l0aCBwcm9wZXJ0aWVzIC8gc3R5bGVzIGZvciBzZWxlY3Rpb24sIGhpZ2hsaWdodCwgaGVpZ2h0XG4gKiBCaW5kYWJsZSBwcm9wZXJ0eSBmb3IgcGFzc2luZyBkYXRhIChgdmFsdWU6IGFueWApXG4gKiBQYXJlbnQgY29tcG9uZW50IChoYXMgdG8gYmUgdXNlZCB1bmRlciBhIHBhcmVudCB3aXRoIHR5cGUgYElEcm9wRG93bkJhc2VgKVxuICogTWV0aG9kIGZvciBoYW5kbGluZyBjbGljayBvbiBIb3N0KClcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4RHJvcERvd25JdGVtQmFzZV0nXG59KVxuZXhwb3J0IGNsYXNzIElneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBEb0NoZWNrIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zZWxlY3RlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfaW5kZXggPSBudWxsO1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgZ2V0IGhhc0luZGV4KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXggIT09IG51bGwgJiYgdGhpcy5faW5kZXggIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBpZGAgb2YgdGhlIGl0ZW0uXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZHJvcC1kb3duLWl0ZW0gW2lkXSA9ICdpZ3gtZHJvcC1kb3duLWl0ZW0tMCc+PC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtSWQgPSAgdGhpcy5pdGVtLmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hTZWxlY3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtZHJvcC1kb3duLWl0ZW0tJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtSUQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGluZGV4IG9mIHRoZSBkcm9wZG93biBpdGVtLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldCB0aGUgZGF0YSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgZHJvcGRvd24gaXRlbVxuICAgICAqIGxldCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtLmluZGV4XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLl9pbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgd2FybmluZ1Nob3duID0gc2hvd01lc3NhZ2UoXG4gICAgICAgICAgICAgICAgJ0lneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmU6IEF1dG9tYXRpYyBpbmRleCBpcyBkZXByZWNhdGVkLicgK1xuICAgICAgICAgICAgICAgICdCaW5kIGluIHRoZSB0ZW1wbGF0ZSBpbnN0ZWFkIHVzaW5nIGA8aWd4LWRyb3AtZG93bi1pdGVtIFtpbmRleF09XCJpXCJgIGluc3RlYWQuYCcsXG4gICAgICAgICAgICAgICAgd2FybmluZ1Nob3duKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1JbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBpbmRleCh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9pbmRleCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGl0ZW0gaWYgdGhlIGl0ZW0gaXMgZGF0YWJvdW5kXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gdXNhZ2UgaW4gSWd4RHJvcERvd25JdGVtQ29tcG9uZW50XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15U2VsZWN0ZWRJdGVtVmFsdWUgPSB0aGlzLmRyb3Bkb3duLnNlbGVjdGVkSXRlbS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIHNldFxuICAgICAqIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqIG15U2VsZWN0ZWRJdGVtLnZhbHVlID0geyBpZDogMTIzLCBuYW1lOiAnRXhhbXBsZSBOYW1lJyB9XG4gICAgICpcbiAgICAgKiAvLyB1c2FnZSBpbiBJZ3hDb21ib0l0ZW1Db21wb25lbnRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1WYWx1ZSA9IHRoaXMuY29tYm8uaXRlbXNbMF0udmFsdWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmFsdWU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19pdGVtJylcbiAgICBnZXQgaXRlbVN0eWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNIZWFkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgaXRlbVN0eWxlQ29zeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcERvd24uZGlzcGxheURlbnNpdHkgPT09ICdjb3N5JyAmJiAhdGhpcy5pc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWRyb3AtZG93bl9faXRlbS0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBpdGVtU3R5bGVDb21wYWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wRG93bi5kaXNwbGF5RGVuc2l0eSA9PT0gJ2NvbXBhY3QnICYmICF0aGlzLmlzSGVhZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvR2V0cyBpZiB0aGUgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9uZSBpbiB0aGUgZHJvcGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBpc015SXRlbVNlbGVjdGVkID0gbXlTZWxlY3RlZEl0ZW0uc2VsZWN0ZWQ7IC8vIHRydWVcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFR3by13YXkgZGF0YSBiaW5kaW5nXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZHJvcC1kb3duLWl0ZW0gWyhzZWxlY3RlZCldPSdtb2RlbC5pc1NlbGVjdGVkJz48L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBARGVwcmVjYXRlUHJvcGVydHkoYElneERyb3BEb3duSXRlbUJhc2VEaXJlY3RpdmUgXFxgaXNTZWxlY3RlZFxcYCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLlxcbmAgK1xuICAgICAgICBgVXNlIFxcYHNlbGVjdGVkXFxgIGluc3RlYWQuYClcbiAgICBnZXQgaXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzZXQgaXNTZWxlY3RlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGZvY3VzZWRcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqICBsZXQgaXNNeUl0ZW1Gb2N1c2VkID0gbXlTZWxlY3RlZEl0ZW0uZm9jdXNlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLWZvY3VzZWQnKVxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKCF0aGlzLmlzSGVhZGVyICYmICF0aGlzLmRpc2FibGVkKSAmJiB0aGlzLl9mb2N1c2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1kcm9wLWRvd24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiIGZvY3VzZWQ9e3shaXRlbS5mb2N1c2VkfX0+XG4gICAgICogICAgICA8ZGl2PlxuICAgICAqICAgICAgICAgIHt7aXRlbS5maWVsZH19XG4gICAgICogICAgICA8L2Rpdj5cbiAgICAgKiAgPC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IGZvY3VzZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KGBJZ3hEcm9wRG93bkl0ZW1CYXNlRGlyZWN0aXZlIFxcYGlzRm9jdXNlZFxcYCBwcm9wZXJ0eSBpcyBkZXByYWNhdGVkLlxcbmAgK1xuICAgICAgICBgVXNlIFxcYGZvY3VzZWRcXGAgaW5zdGVhZC5gKVxuICAgIGdldCBpc0ZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgc2V0IGlzRm9jdXNlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgaGVhZGVyXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAvLyBnZXRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBpc015SXRlbUhlYWRlciA9IG15U2VsZWN0ZWRJdGVtLmlzSGVhZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8IS0tc2V0LS0+XG4gICAgICogIDxpZ3gtZHJvcGRvd24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAqICAgICAgPGRpdiAqbmdJZj1cIml0ZW1zLmluZGV4T2YoaXRlbSkgPT09IDU7IHRoZW4gaXRlbS5pc0hlYWRlciA9IHRydWVcIj5cbiAgICAgKiAgICAgICAgICB7e2l0ZW0uZmllbGR9fVxuKiAgICAgICAgICAgPC9kaXY+XG4gICAgICogIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19oZWFkZXInKVxuICAgIHB1YmxpYyBpc0hlYWRlcjogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19oZWFkZXItLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2xhc3NDb3N5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0hlYWRlciAmJiB0aGlzLmRyb3BEb3duLmRpc3BsYXlEZW5zaXR5ID09PSAnY29zeSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2hlYWRlci0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBoZWFkZXJDbGFzc0NvbXBhY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGVhZGVyICYmIHRoaXMuZHJvcERvd24uZGlzcGxheURlbnNpdHkgPT09ICdjb21wYWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgZGlzYWJsZWRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgLy8gZ2V0XG4gICAgICogIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqICBsZXQgbXlJdGVtSXNEaXNhYmxlZCA9IG15U2VsZWN0ZWRJdGVtLmRpc2FibGVkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWRyb3AtZG93bi1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCIgZGlzYWJsZWQ9e3shaXRlbS5kaXNhYmxlZH19PlxuICAgICAqICAgICAgPGRpdj5cbiAgICAgKiAgICAgICAgICB7e2l0ZW0uZmllbGR9fVxuICAgICAqICAgICAgPC9kaXY+XG4gICAgICogIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqICoqTk9URToqKiBEcm9wLWRvd24gaXRlbXMgaW5zaWRlIG9mIGEgZGlzYWJsZWQgYElneERyb3BEb3duR3JvdXBgIHdpbGwgYWx3YXlzIGNvdW50IGFzIGRpc2FibGVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19pdGVtLS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAgPyB0aGlzLmdyb3VwLmRpc2FibGVkIHx8IHRoaXMuX2Rpc2FibGVkIDogdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgaXRlbS4gRGVmYXVsdCBpcyAnb3B0aW9uJy5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1kcm9wLWRvd24taXRlbSBbcm9sZV09XCJjdXN0b21Sb2xlXCI+PC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIHJvbGUgPSAnb3B0aW9uJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgaXRlbSBpbmRleFxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcERvd24uaXRlbXMuaW5kZXhPZih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGl0ZW0gZWxlbWVudCBoZWlnaHRcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZWxlbWVudEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpdGVtIGh0bWwgZWxlbWVudFxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbGVtZW50KCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9EUk9QRE9XTl9CQVNFKSBwcm90ZWN0ZWQgZHJvcERvd246IElEcm9wRG93bkJhc2UsXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgZ3JvdXA6IElneERyb3BEb3duR3JvdXBDb21wb25lbnQsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4U2VsZWN0aW9uQVBJU2VydmljZSkgcHJvdGVjdGVkIHNlbGVjdGlvbj86IElneFNlbGVjdGlvbkFQSVNlcnZpY2VcbiAgICApIHsgfVxuXG4gICAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3BEb3duU2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wRG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICAgICAgICBpZiAoIWRyb3BEb3duU2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRG93bi5zZWxlY3RJdGVtKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc0luZGV4XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9pbmRleCAhPT0gZHJvcERvd25TZWxlY3RlZEl0ZW0uaW5kZXggfHwgdGhpcy52YWx1ZSAhPT0gZHJvcERvd25TZWxlY3RlZEl0ZW0udmFsdWUgOlxuICAgICAgICAgICAgICAgIHRoaXMgIT09IGRyb3BEb3duU2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRG93bi5zZWxlY3RJdGVtKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19