UNPKG

igniteui-angular

Version:

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

381 lines • 25.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Input, HostBinding, Output, EventEmitter } from '@angular/core'; import { Navigate } from './drop-down.common'; import { DropDownActionKey } from './drop-down.common'; /** @type {?} */ let NEXT_ID = 0; /** * An abstract class, defining a drop-down component, with: * Properties for display styles and classes * A collection items of type `IgxDropDownItemBase` * Properties and methods for navigating (highlighting/focusing) items from the collection * Properties and methods for selecting items from the collection * @abstract */ export class IgxDropDownBase { /** * @param {?} elementRef * @param {?} cdr */ constructor(elementRef, cdr) { this.elementRef = elementRef; this.cdr = cdr; this._focusedItem = null; this._id = `igx-drop-down-${NEXT_ID++}`; /** * Emitted when item selection is changing, before the selection completes * * ```html * <igx-drop-down (onSelection)='handleSelection()'></igx-drop-down> * ``` */ this.onSelection = new EventEmitter(); /** * Gets/Sets the drop down's container max height. * * ```typescript * // get * let maxHeight = this.dropdown.maxHeight; * ``` * ```html * <!--set--> * <igx-drop-down [maxHeight]='200px'></igx-drop-down> * ``` */ this.maxHeight = null; /** * @hidden \@internal */ this.cssClass = true; } /** * Get dropdown's html element of it scroll container * @protected * @return {?} */ get scrollContainer() { return this.element; } /** * Get all non-header items * * ```typescript * let myDropDownItems = this.dropdown.items; * ``` * @return {?} */ get items() { /** @type {?} */ const items = []; if (this.children !== undefined) { for (const child of this.children.toArray()) { if (!child.isHeader) { items.push(child); } } } return items; } /** * Get all header items * * ```typescript * let myDropDownHeaderItems = this.dropdown.headers; * ``` * @return {?} */ get headers() { /** @type {?} */ const headers = []; if (this.children !== undefined) { for (const child of this.children.toArray()) { if (child.isHeader) { headers.push(child); } } } return headers; } /** * Get dropdown html element * * ```typescript * let myDropDownElement = this.dropdown.element; * ``` * @return {?} */ get element() { return this.elementRef.nativeElement; } /** * Keydown Handler * @param {?} key * @param {?=} event * @return {?} */ onItemActionKey(key, event) { switch (key) { case DropDownActionKey.ENTER: case DropDownActionKey.SPACE: this.selectItem(this.focusedItem, event); break; case DropDownActionKey.ESCAPE: } } /** * Emits onSelection with the target item & event * @hidden \@internal * @param {?=} newSelection the item selected * @param {?=} event the event that triggered the call * @return {?} */ selectItem(newSelection, event) { this.onSelection.emit({ newSelection, oldSelection: null, cancel: false }); } /** * @hidden \@internal * @return {?} */ get focusedItem() { return this._focusedItem; } /** * @hidden \@internal * @param {?} item * @return {?} */ set focusedItem(item) { this._focusedItem = item; } /** * @protected * @param {?} direction * @param {?=} currentIndex * @return {?} */ navigate(direction, currentIndex) { /** @type {?} */ let index = -1; if (this._focusedItem) { index = currentIndex ? currentIndex : this._focusedItem.itemIndex; } /** @type {?} */ const newIndex = this.getNearestSiblingFocusableItemIndex(index, direction); this.navigateItem(newIndex); } /** * @protected * @param {?} startIndex * @param {?} direction * @return {?} */ getNearestSiblingFocusableItemIndex(startIndex, direction) { /** @type {?} */ let index = startIndex; /** @type {?} */ const items = this.items; while (items[index + direction] && items[index + direction].disabled) { index += direction; } index += direction; if (index >= 0 && index < items.length) { return index; } else { return -1; } } /** * Navigates to the item on the specified index * @param {?} newIndex number - the index of the item in the `items` collection * @return {?} */ navigateItem(newIndex) { if (newIndex !== -1) { /** @type {?} */ const oldItem = this._focusedItem; /** @type {?} */ const newItem = this.items[newIndex]; if (oldItem) { oldItem.focused = false; } this._focusedItem = newItem; this.scrollToHiddenItem(newItem); this._focusedItem.focused = true; } } /** * @hidden \@internal * @return {?} */ navigateFirst() { this.navigate(Navigate.Down, -1); } /** * @hidden \@internal * @return {?} */ navigateLast() { this.navigate(Navigate.Up, this.items.length); } /** * @hidden \@internal * @return {?} */ navigateNext() { this.navigate(Navigate.Down); } /** * @hidden \@internal * @return {?} */ navigatePrev() { this.navigate(Navigate.Up); } /** * @protected * @param {?} newItem * @return {?} */ scrollToHiddenItem(newItem) { /** @type {?} */ const elementRect = newItem.element.nativeElement.getBoundingClientRect(); /** @type {?} */ const parentRect = this.scrollContainer.getBoundingClientRect(); if (parentRect.top > elementRect.top) { this.scrollContainer.scrollTop -= (parentRect.top - elementRect.top); } if (parentRect.bottom < elementRect.bottom) { this.scrollContainer.scrollTop += (elementRect.bottom - parentRect.bottom); } } } IgxDropDownBase.propDecorators = { onSelection: [{ type: Output }], width: [{ type: Input }], height: [{ type: Input }], id: [{ type: Input }], maxHeight: [{ type: Input }, { type: HostBinding, args: ['style.maxHeight',] }], cssClass: [{ type: HostBinding, args: ['class.igx-drop-down',] }] }; if (false) { /** * @type {?} * @protected */ IgxDropDownBase.prototype._width; /** * @type {?} * @protected */ IgxDropDownBase.prototype._height; /** * @type {?} * @protected */ IgxDropDownBase.prototype._focusedItem; /** * @type {?} * @protected */ IgxDropDownBase.prototype._id; /** * @hidden * \@internal * @type {?} */ IgxDropDownBase.prototype.children; /** * Emitted when item selection is changing, before the selection completes * * ```html * <igx-drop-down (onSelection)='handleSelection()'></igx-drop-down> * ``` * @type {?} */ IgxDropDownBase.prototype.onSelection; /** * Gets/Sets the width of the drop down * * ```typescript * // get * let myDropDownCurrentWidth = this.dropdown.width; * ``` * ```html * <!--set--> * <igx-drop-down [width]='160px'></igx-drop-down> * ``` * @type {?} */ IgxDropDownBase.prototype.width; /** * Gets/Sets the height of the drop down * * ```typescript * // get * let myDropDownCurrentHeight = this.dropdown.height; * ``` * ```html * <!--set--> * <igx-drop-down [height]='400px'></igx-drop-down> * ``` * @type {?} */ IgxDropDownBase.prototype.height; /** * Gets/Sets the drop down's id * * ```typescript * // get * let myDropDownCurrentId = this.dropdown.id; * ``` * ```html * <!--set--> * <igx-drop-down [id]='newDropDownId'></igx-drop-down> * ``` * @type {?} */ IgxDropDownBase.prototype.id; /** * Gets/Sets the drop down's container max height. * * ```typescript * // get * let maxHeight = this.dropdown.maxHeight; * ``` * ```html * <!--set--> * <igx-drop-down [maxHeight]='200px'></igx-drop-down> * ``` * @type {?} */ IgxDropDownBase.prototype.maxHeight; /** * @hidden \@internal * @type {?} */ IgxDropDownBase.prototype.cssClass; /** * Gets if the dropdown is collapsed * @type {?} */ IgxDropDownBase.prototype.collapsed; /** * @type {?} * @protected */ IgxDropDownBase.prototype.elementRef; /** * @type {?} * @protected */ IgxDropDownBase.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLmJhc2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2Ryb3AtZG93bi9kcm9wLWRvd24uYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILEtBQUssRUFBRSxXQUFXLEVBQXlCLE1BQU0sRUFBRSxZQUFZLEVBQ2xFLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQXVCLE1BQU0sb0JBQW9CLENBQUM7QUFFbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0lBR25ELE9BQU8sR0FBRyxDQUFDOzs7Ozs7Ozs7QUFTZixNQUFNLE9BQWdCLGVBQWU7Ozs7O0lBd0pqQyxZQUNjLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2SjFCLGlCQUFZLEdBQVEsSUFBSSxDQUFDO1FBQ3pCLFFBQUcsR0FBRyxpQkFBaUIsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Ozs7Ozs7UUF1QnRDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7UUE2RHRELGNBQVMsR0FBRyxJQUFJLENBQUM7Ozs7UUFNakIsYUFBUSxHQUFHLElBQUksQ0FBQztJQTREaUIsQ0FBQzs7Ozs7O0lBakp6QyxJQUFjLGVBQWU7UUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7Ozs7Ozs7OztJQTRGRCxJQUFXLEtBQUs7O2NBQ04sS0FBSyxHQUEwQixFQUFFO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFD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QUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5RTtJQUNMLENBQUM7OzswQkF4UEEsTUFBTTtvQkFlTixLQUFLO3FCQWVMLEtBQUs7aUJBZUwsS0FBSzt3QkFlTCxLQUFLLFlBQ0wsV0FBVyxTQUFDLGlCQUFpQjt1QkFNN0IsV0FBVyxTQUFDLHFCQUFxQjs7Ozs7OztJQTVGbEMsaUNBQWlCOzs7OztJQUNqQixrQ0FBa0I7Ozs7O0lBQ2xCLHVDQUFtQzs7Ozs7SUFDbkMsOEJBQTZDOzs7Ozs7SUFhN0MsbUNBQWdEOzs7Ozs7Ozs7SUFTaEQsc0NBQzZEOzs7Ozs7Ozs7Ozs7OztJQWM3RCxnQ0FDcUI7Ozs7Ozs7Ozs7Ozs7O0lBY3JCLGlDQUNzQjs7Ozs7Ozs7Ozs7Ozs7SUFjdEIsNkJBQ2tCOzs7Ozs7Ozs7Ozs7OztJQWNsQixvQ0FFd0I7Ozs7O0lBS3hCLG1DQUN1Qjs7Ozs7SUF3RHZCLG9DQUFtQzs7Ozs7SUFHL0IscUNBQWdDOzs7OztJQUNoQyw4QkFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIElucHV0LCBIb3N0QmluZGluZywgRWxlbWVudFJlZiwgUXVlcnlMaXN0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5hdmlnYXRlLCBJU2VsZWN0aW9uRXZlbnRBcmdzIH0gZnJvbSAnLi9kcm9wLWRvd24uY29tbW9uJztcbmltcG9ydCB7IElEcm9wRG93bkxpc3QgfSBmcm9tICcuL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgRHJvcERvd25BY3Rpb25LZXkgfSBmcm9tICcuL2Ryb3AtZG93bi5jb21tb24nO1xuaW1wb3J0IHsgSWd4RHJvcERvd25JdGVtQmFzZSB9IGZyb20gJy4vZHJvcC1kb3duLWl0ZW0uYmFzZSc7XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiBBbiBhYnN0cmFjdCBjbGFzcywgZGVmaW5pbmcgYSBkcm9wLWRvd24gY29tcG9uZW50LCB3aXRoOlxuICogUHJvcGVydGllcyBmb3IgZGlzcGxheSBzdHlsZXMgYW5kIGNsYXNzZXNcbiAqIEEgY29sbGVjdGlvbiBpdGVtcyBvZiB0eXBlIGBJZ3hEcm9wRG93bkl0ZW1CYXNlYFxuICogUHJvcGVydGllcyBhbmQgbWV0aG9kcyBmb3IgbmF2aWdhdGluZyAoaGlnaGxpZ2h0aW5nL2ZvY3VzaW5nKSBpdGVtcyBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gKiBQcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGZvciBzZWxlY3RpbmcgaXRlbXMgZnJvbSB0aGUgY29sbGVjdGlvblxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4RHJvcERvd25CYXNlIGltcGxlbWVudHMgSURyb3BEb3duTGlzdCB7XG4gICAgcHJvdGVjdGVkIF93aWR0aDtcbiAgICBwcm90ZWN0ZWQgX2hlaWdodDtcbiAgICBwcm90ZWN0ZWQgX2ZvY3VzZWRJdGVtOiBhbnkgPSBudWxsO1xuICAgIHByb3RlY3RlZCBfaWQgPSBgaWd4LWRyb3AtZG93bi0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGRyb3Bkb3duJ3MgaHRtbCBlbGVtZW50IG9mIGl0IHNjcm9sbCBjb250YWluZXJcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHNjcm9sbENvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4RHJvcERvd25JdGVtQmFzZT47XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gaXRlbSBzZWxlY3Rpb24gaXMgY2hhbmdpbmcsIGJlZm9yZSB0aGUgc2VsZWN0aW9uIGNvbXBsZXRlc1xuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZHJvcC1kb3duIChvblNlbGVjdGlvbik9J2hhbmRsZVNlbGVjdGlvbigpJz48L2lneC1kcm9wLWRvd24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEdldHMvU2V0cyB0aGUgd2lkdGggb2YgdGhlIGRyb3AgZG93blxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteURyb3BEb3duQ3VycmVudFdpZHRoID0gdGhpcy5kcm9wZG93bi53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtZHJvcC1kb3duIFt3aWR0aF09JzE2MHB4Jz48L2lneC1kcm9wLWRvd24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBkcm9wIGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlEcm9wRG93bkN1cnJlbnRIZWlnaHQgPSB0aGlzLmRyb3Bkb3duLmhlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtZHJvcC1kb3duIFtoZWlnaHRdPSc0MDBweCc+PC9pZ3gtZHJvcC1kb3duPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlaWdodDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkcm9wIGRvd24ncyBpZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteURyb3BEb3duQ3VycmVudElkID0gdGhpcy5kcm9wZG93bi5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtZHJvcC1kb3duIFtpZF09J25ld0Ryb3BEb3duSWQnPjwvaWd4LWRyb3AtZG93bj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkcm9wIGRvd24ncyBjb250YWluZXIgbWF4IGhlaWdodC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbWF4SGVpZ2h0ID0gdGhpcy5kcm9wZG93bi5tYXhIZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWRyb3AtZG93biBbbWF4SGVpZ2h0XT0nMjAwcHgnPjwvaWd4LWRyb3AtZG93bj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUubWF4SGVpZ2h0JylcbiAgICBwdWJsaWMgbWF4SGVpZ2h0ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBub24taGVhZGVyIGl0ZW1zXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IG15RHJvcERvd25JdGVtcyA9IHRoaXMuZHJvcGRvd24uaXRlbXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtcygpOiBJZ3hEcm9wRG93bkl0ZW1CYXNlW10ge1xuICAgICAgICBjb25zdCBpdGVtczogSWd4RHJvcERvd25JdGVtQmFzZVtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbi50b0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGhlYWRlciBpdGVtc1xuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBteURyb3BEb3duSGVhZGVySXRlbXMgPSB0aGlzLmRyb3Bkb3duLmhlYWRlcnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJzKCk6IElneERyb3BEb3duSXRlbUJhc2VbXSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IElneERyb3BEb3duSXRlbUJhc2VbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4udG9BcnJheSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRyb3Bkb3duIGh0bWwgZWxlbWVudFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBteURyb3BEb3duRWxlbWVudCA9IHRoaXMuZHJvcGRvd24uZWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGlmIHRoZSBkcm9wZG93biBpcyBjb2xsYXBzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgY29sbGFwc2VkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgICAvKiogS2V5ZG93biBIYW5kbGVyICovXG4gICAgcHVibGljIG9uSXRlbUFjdGlvbktleShrZXk6IERyb3BEb3duQWN0aW9uS2V5LCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlIERyb3BEb3duQWN0aW9uS2V5LkVOVEVSOlxuICAgICAgICAgICAgY2FzZSBEcm9wRG93bkFjdGlvbktleS5TUEFDRTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5mb2N1c2VkSXRlbSwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEcm9wRG93bkFjdGlvbktleS5FU0NBUEU6XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBvblNlbGVjdGlvbiB3aXRoIHRoZSB0YXJnZXQgaXRlbSAmIGV2ZW50XG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBAcGFyYW0gbmV3U2VsZWN0aW9uIHRoZSBpdGVtIHNlbGVjdGVkXG4gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY2FsbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKG5ld1NlbGVjdGlvbj86IElneERyb3BEb3duSXRlbUJhc2UsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbi5lbWl0KHtcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvY3VzZWRJdGVtKCk6IElneERyb3BEb3duSXRlbUJhc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNlZEl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGZvY3VzZWRJdGVtKGl0ZW06IElneERyb3BEb3duSXRlbUJhc2UpIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZEl0ZW0gPSBpdGVtO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZShkaXJlY3Rpb246IE5hdmlnYXRlLCBjdXJyZW50SW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkSXRlbSkge1xuICAgICAgICAgICAgaW5kZXggPSBjdXJyZW50SW5kZXggPyBjdXJyZW50SW5kZXggOiB0aGlzLl9mb2N1c2VkSXRlbS5pdGVtSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmdldE5lYXJlc3RTaWJsaW5nRm9jdXNhYmxlSXRlbUluZGV4KGluZGV4LCBkaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLm5hdmlnYXRlSXRlbShuZXdJbmRleCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE5lYXJlc3RTaWJsaW5nRm9jdXNhYmxlSXRlbUluZGV4KHN0YXJ0SW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiBOYXZpZ2F0ZSk6IG51bWJlciB7XG4gICAgICAgIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAgICAgd2hpbGUgKGl0ZW1zW2luZGV4ICsgZGlyZWN0aW9uXSAmJiBpdGVtc1tpbmRleCArIGRpcmVjdGlvbl0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byB0aGUgaXRlbSBvbiB0aGUgc3BlY2lmaWVkIGluZGV4XG4gICAgICogQHBhcmFtIG5ld0luZGV4IG51bWJlciAtIHRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgYGl0ZW1zYCBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlSXRlbShuZXdJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChuZXdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZEl0ZW0gPSB0aGlzLl9mb2N1c2VkSXRlbTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB0aGlzLml0ZW1zW25ld0luZGV4XTtcbiAgICAgICAgICAgIGlmIChvbGRJdGVtKSB7XG4gICAgICAgICAgICAgICAgb2xkSXRlbS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9mb2N1c2VkSXRlbSA9IG5ld0l0ZW07XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvSGlkZGVuSXRlbShuZXdJdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJdGVtLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVGaXJzdCgpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZShOYXZpZ2F0ZS5Eb3duLCAtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVMYXN0KCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRlKE5hdmlnYXRlLlVwLCB0aGlzLml0ZW1zLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVOZXh0KCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRlKE5hdmlnYXRlLkRvd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlUHJldigpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZShOYXZpZ2F0ZS5VcCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvSGlkZGVuSXRlbShuZXdJdGVtOiBJZ3hEcm9wRG93bkl0ZW1CYXNlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gbmV3SXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKHBhcmVudFJlY3QudG9wID4gZWxlbWVudFJlY3QudG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgLT0gKHBhcmVudFJlY3QudG9wIC0gZWxlbWVudFJlY3QudG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnRSZWN0LmJvdHRvbSA8IGVsZW1lbnRSZWN0LmJvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wICs9IChlbGVtZW50UmVjdC5ib3R0b20gLSBwYXJlbnRSZWN0LmJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=