UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

313 lines 24 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { ComponentFactoryResolver, Directive, ElementRef, Inject, Input, } from '@angular/core'; import { filter, takeWhile } from 'rxjs/operators'; import { createContainer, NbAdjustment, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, } from '../cdk'; import { NbContextMenuComponent } from './context-menu.component'; import { NbMenuService } from '../menu/menu.service'; import { NB_DOCUMENT } from '../../theme.options'; /* * Full featured context menu directive. * * @stacked-example(Showcase, context-menu/context-menu-showcase.component) * * Just pass menu items array: * * ```html * <button [nbContextMenu]="items"></button> * ... * items = [{ title: 'Profile' }, { title: 'Log out' }]; * ``` * ### Installation * * Import `NbContextMenuModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbContextMenuModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * If you want to handle context menu clicks you have to pass `nbContextMenuTag` * param and register to events using NbMenuService. * `NbContextMenu` renders plain `NbMenu` inside, so * you have to work with it just like with `NbMenu` component: * * @stacked-example(Menu item click, context-menu/context-menu-click.component) * * Context menu has different placements, such as: top, bottom, left and right * which can be used as following: * * ```html * <button [nbContextMenu]="items" nbContextMenuPlacement="right"></button> * ``` * * ```ts * items = [{ title: 'Profile' }, { title: 'Log out' }]; * ``` * * By default context menu will try to adjust itself to maximally fit viewport * and provide the best user experience. It will try to change position of the context menu. * If you wanna disable this behaviour just set it falsy value. * * ```html * <button [nbContextMenu]="items" nbContextMenuAdjustment="counterclockwise"></button> * ``` * * ```ts * items = [{ title: 'Profile' }, { title: 'Log out' }]; * ``` * */ export class NbContextMenuDirective { /** * @param {?} document * @param {?} menuService * @param {?} hostRef * @param {?} positionBuilder * @param {?} overlay * @param {?} componentFactoryResolver */ constructor(document, menuService, hostRef, positionBuilder, overlay, componentFactoryResolver) { this.document = document; this.menuService = menuService; this.hostRef = hostRef; this.positionBuilder = positionBuilder; this.overlay = overlay; this.componentFactoryResolver = componentFactoryResolver; /* * Position will be calculated relatively host element based on the position. * Can be top, right, bottom and left. * */ this.position = NbPosition.BOTTOM; /* * Container position will be changes automatically based on this strategy if container can't fit view port. * Set this property to any falsy value if you want to disable automatically adjustment. * Available values: clockwise, counterclockwise. * */ this.adjustment = NbAdjustment.CLOCKWISE; this.alive = true; this.items = []; } /* * Basic menu items, will be passed to the internal NbMenuComponent. * */ /** * @param {?} items * @return {?} */ set setItems(items) { this.validateItems(items); this.items = items; } ; /** * @return {?} */ ngAfterViewInit() { this.positionStrategy = this.createPositionStrategy(); this.ref = this.overlay.create({ positionStrategy: this.positionStrategy, scrollStrategy: this.overlay.scrollStrategies.reposition(), }); this.triggerStrategy = this.createTriggerStrategy(); this.subscribeOnTriggers(); this.subscribeOnPositionChange(); this.subscribeOnItemClick(); } /** * @return {?} */ ngOnDestroy() { this.alive = false; this.hide(); } /** * @return {?} */ show() { this.container = createContainer(this.ref, NbContextMenuComponent, { position: this.position, items: this.items, tag: this.tag, }, this.componentFactoryResolver); } /** * @return {?} */ hide() { this.ref.detach(); this.container = null; } /** * @return {?} */ toggle() { if (this.ref && this.ref.hasAttached()) { this.hide(); } else { this.show(); } } /** * @protected * @return {?} */ createPositionStrategy() { return this.positionBuilder .connectedTo(this.hostRef) .position(this.position) .adjustment(this.adjustment); } /** * @protected * @return {?} */ createTriggerStrategy() { return new NbTriggerStrategyBuilder() .document(this.document) .trigger(NbTrigger.CLICK) .host(this.hostRef.nativeElement) .container(() => this.container) .build(); } /** * @protected * @return {?} */ subscribeOnPositionChange() { this.positionStrategy.positionChange .pipe(takeWhile(() => this.alive)) .subscribe((position) => patch(this.container, { position })); } /** * @protected * @return {?} */ subscribeOnTriggers() { this.triggerStrategy.show$.pipe(takeWhile(() => this.alive)).subscribe(() => this.show()); this.triggerStrategy.hide$.pipe(takeWhile(() => this.alive)).subscribe(() => this.hide()); } /* * NbMenuComponent will crash if don't pass menu items to it. * So, we just validating them and throw custom obvious error. * */ /** * @private * @param {?} items * @return {?} */ validateItems(items) { if (!items || !items.length) { throw Error(`List of menu items expected, but given: ${items}`); } } /** * @private * @return {?} */ subscribeOnItemClick() { this.menuService.onItemClick() .pipe(takeWhile(() => this.alive), filter(({ tag }) => tag === this.tag)) .subscribe(() => this.hide()); } } NbContextMenuDirective.decorators = [ { type: Directive, args: [{ selector: '[nbContextMenu]' },] } ]; /** @nocollapse */ NbContextMenuDirective.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: NbMenuService }, { type: ElementRef }, { type: NbPositionBuilderService }, { type: NbOverlayService }, { type: ComponentFactoryResolver } ]; NbContextMenuDirective.propDecorators = { position: [{ type: Input, args: ['nbContextMenuPlacement',] }], adjustment: [{ type: Input, args: ['nbContextMenuAdjustment',] }], tag: [{ type: Input, args: ['nbContextMenuTag',] }], setItems: [{ type: Input, args: ['nbContextMenu',] }] }; if (false) { /** @type {?} */ NbContextMenuDirective.prototype.position; /** @type {?} */ NbContextMenuDirective.prototype.adjustment; /** @type {?} */ NbContextMenuDirective.prototype.tag; /** * @type {?} * @protected */ NbContextMenuDirective.prototype.ref; /** * @type {?} * @protected */ NbContextMenuDirective.prototype.container; /** * @type {?} * @protected */ NbContextMenuDirective.prototype.positionStrategy; /** * @type {?} * @protected */ NbContextMenuDirective.prototype.triggerStrategy; /** * @type {?} * @protected */ NbContextMenuDirective.prototype.alive; /** * @type {?} * @private */ NbContextMenuDirective.prototype.items; /** * @type {?} * @protected */ NbContextMenuDirective.prototype.document; /** * @type {?} * @private */ NbContextMenuDirective.prototype.menuService; /** * @type {?} * @private */ NbContextMenuDirective.prototype.hostRef; /** * @type {?} * @private */ NbContextMenuDirective.prototype.positionBuilder; /** * @type {?} * @private */ NbContextMenuDirective.prototype.overlay; /** * @type {?} * @private */ NbContextMenuDirective.prototype.componentFactoryResolver; /* Skipping unhandled member: ;*/ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFFTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGVBQWUsRUFFZixZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix3QkFBd0IsRUFDeEIsU0FBUyxFQUVULHdCQUF3QixFQUN4QixLQUFLLEdBQ04sTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkRsRCxNQUFNLE9BQU8sc0JBQXNCOzs7Ozs7Ozs7SUF1Q2pDLFlBQTJDLFFBQVEsRUFDL0IsV0FBMEIsRUFDMUIsT0FBbUIsRUFDbkIsZUFBeUMsRUFDekMsT0FBeUIsRUFDekIsd0JBQWtEO1FBTDNCLGFBQVEsR0FBUixRQUFRLENBQUE7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7UUFDekMsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDekIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjs7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TSxTQUFDLFdBQVc7WUFuR1osYUFBYTtZQXJCaEMsVUFBVTtZQWNWLHdCQUF3QjtZQUZ4QixnQkFBZ0I7WUFmaEIsd0JBQXdCOzs7dUJBMEZ2QixLQUFLLFNBQUMsd0JBQXdCO3lCQVE5QixLQUFLLFNBQUMseUJBQXlCO2tCQU0vQixLQUFLLFNBQUMsa0JBQWtCO3VCQU14QixLQUFLLFNBQUMsZUFBZTs7OztJQXBCdEIsMENBQ3lDOztJQU96Qyw0Q0FDa0Q7O0lBS2xELHFDQUNZOzs7OztJQVdaLHFDQUE0Qjs7Ozs7SUFDNUIsMkNBQXVDOzs7OztJQUN2QyxrREFBa0U7Ozs7O0lBQ2xFLGlEQUE2Qzs7Ozs7SUFDN0MsdUNBQWdDOzs7OztJQUNoQyx1Q0FBaUM7Ozs7O0lBRXJCLDBDQUF1Qzs7Ozs7SUFDdkMsNkNBQWtDOzs7OztJQUNsQyx5Q0FBMkI7Ozs7O0lBQzNCLGlEQUFpRDs7Ozs7SUFDakQseUNBQWlDOzs7OztJQUNqQywwREFBMEQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIGNyZWF0ZUNvbnRhaW5lcixcclxuICBOYkFkanVzdGFibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE5iQWRqdXN0bWVudCxcclxuICBOYk92ZXJsYXlSZWYsXHJcbiAgTmJPdmVybGF5U2VydmljZSxcclxuICBOYlBvc2l0aW9uLFxyXG4gIE5iUG9zaXRpb25CdWlsZGVyU2VydmljZSxcclxuICBOYlRyaWdnZXIsXHJcbiAgTmJUcmlnZ2VyU3RyYXRlZ3ksXHJcbiAgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyLFxyXG4gIHBhdGNoLFxyXG59IGZyb20gJy4uL2Nkayc7XHJcbmltcG9ydCB7IE5iQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHQtbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYk1lbnVJdGVtLCBOYk1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vbWVudS9tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5cclxuLypcclxuICogRnVsbCBmZWF0dXJlZCBjb250ZXh0IG1lbnUgZGlyZWN0aXZlLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCBjb250ZXh0LW1lbnUvY29udGV4dC1tZW51LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogSnVzdCBwYXNzIG1lbnUgaXRlbXMgYXJyYXk6XHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJDb250ZXh0TWVudV09XCJpdGVtc1wiPjwvYnV0dG9uPlxyXG4gKiAuLi5cclxuICogaXRlbXMgPSBbeyB0aXRsZTogJ1Byb2ZpbGUnIH0sIHsgdGl0bGU6ICdMb2cgb3V0JyB9XTtcclxuICogYGBgXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYkNvbnRleHRNZW51TW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlLlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJDb250ZXh0TWVudU1vZHVsZSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgUGFnZU1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBJZiB5b3Ugd2FudCB0byBoYW5kbGUgY29udGV4dCBtZW51IGNsaWNrcyB5b3UgaGF2ZSB0byBwYXNzIGBuYkNvbnRleHRNZW51VGFnYFxyXG4gKiBwYXJhbSBhbmQgcmVnaXN0ZXIgdG8gZXZlbnRzIHVzaW5nIE5iTWVudVNlcnZpY2UuXHJcbiAqIGBOYkNvbnRleHRNZW51YCByZW5kZXJzIHBsYWluIGBOYk1lbnVgIGluc2lkZSwgc29cclxuICogeW91IGhhdmUgdG8gd29yayB3aXRoIGl0IGp1c3QgbGlrZSB3aXRoIGBOYk1lbnVgIGNvbXBvbmVudDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShNZW51IGl0ZW0gY2xpY2ssIGNvbnRleHQtbWVudS9jb250ZXh0LW1lbnUtY2xpY2suY29tcG9uZW50KVxyXG4gKlxyXG4gKiBDb250ZXh0IG1lbnUgaGFzIGRpZmZlcmVudCBwbGFjZW1lbnRzLCBzdWNoIGFzOiB0b3AsIGJvdHRvbSwgbGVmdCBhbmQgcmlnaHRcclxuICogd2hpY2ggY2FuIGJlIHVzZWQgYXMgZm9sbG93aW5nOlxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqIDxidXR0b24gW25iQ29udGV4dE1lbnVdPVwiaXRlbXNcIiBuYkNvbnRleHRNZW51UGxhY2VtZW50PVwicmlnaHRcIj48L2J1dHRvbj5cclxuICogYGBgXHJcbiAqXHJcbiAqIGBgYHRzXHJcbiAqIGl0ZW1zID0gW3sgdGl0bGU6ICdQcm9maWxlJyB9LCB7IHRpdGxlOiAnTG9nIG91dCcgfV07XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBCeSBkZWZhdWx0IGNvbnRleHQgbWVudSB3aWxsIHRyeSB0byBhZGp1c3QgaXRzZWxmIHRvIG1heGltYWxseSBmaXQgdmlld3BvcnRcclxuICogYW5kIHByb3ZpZGUgdGhlIGJlc3QgdXNlciBleHBlcmllbmNlLiBJdCB3aWxsIHRyeSB0byBjaGFuZ2UgcG9zaXRpb24gb2YgdGhlIGNvbnRleHQgbWVudS5cclxuICogSWYgeW91IHdhbm5hIGRpc2FibGUgdGhpcyBiZWhhdmlvdXIganVzdCBzZXQgaXQgZmFsc3kgdmFsdWUuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGJ1dHRvbiBbbmJDb250ZXh0TWVudV09XCJpdGVtc1wiIG5iQ29udGV4dE1lbnVBZGp1c3RtZW50PVwiY291bnRlcmNsb2Nrd2lzZVwiPjwvYnV0dG9uPlxyXG4gKiBgYGBcclxuICpcclxuICogYGBgdHNcclxuICogaXRlbXMgPSBbeyB0aXRsZTogJ1Byb2ZpbGUnIH0sIHsgdGl0bGU6ICdMb2cgb3V0JyB9XTtcclxuICogYGBgXHJcbiAqICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYkNvbnRleHRNZW51XScgfSlcclxuZXhwb3J0IGNsYXNzIE5iQ29udGV4dE1lbnVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAvKlxyXG4gICAqIFBvc2l0aW9uIHdpbGwgYmUgY2FsY3VsYXRlZCByZWxhdGl2ZWx5IGhvc3QgZWxlbWVudCBiYXNlZCBvbiB0aGUgcG9zaXRpb24uXHJcbiAgICogQ2FuIGJlIHRvcCwgcmlnaHQsIGJvdHRvbSBhbmQgbGVmdC5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgnbmJDb250ZXh0TWVudVBsYWNlbWVudCcpXHJcbiAgcG9zaXRpb246IE5iUG9zaXRpb24gPSBOYlBvc2l0aW9uLkJPVFRPTTtcclxuXHJcbiAgLypcclxuICAgKiBDb250YWluZXIgcG9zaXRpb24gd2lsbCBiZSBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhpcyBzdHJhdGVneSBpZiBjb250YWluZXIgY2FuJ3QgZml0IHZpZXcgcG9ydC5cclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhbnkgZmFsc3kgdmFsdWUgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBhdXRvbWF0aWNhbGx5IGFkanVzdG1lbnQuXHJcbiAgICogQXZhaWxhYmxlIHZhbHVlczogY2xvY2t3aXNlLCBjb3VudGVyY2xvY2t3aXNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51QWRqdXN0bWVudCcpXHJcbiAgYWRqdXN0bWVudDogTmJBZGp1c3RtZW50ID0gTmJBZGp1c3RtZW50LkNMT0NLV0lTRTtcclxuXHJcbiAgLypcclxuICAgKiBTZXQgTmJNZW51IHRhZywgd2hpY2ggaGVscHMgaWRlbnRpZnkgbWVudSB3aGVuIHdvcmtpbmcgd2l0aCBOYk1lbnVTZXJ2aWNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51VGFnJylcclxuICB0YWc6IHN0cmluZztcclxuXHJcbiAgLypcclxuICAgKiBCYXNpYyBtZW51IGl0ZW1zLCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgaW50ZXJuYWwgTmJNZW51Q29tcG9uZW50LlxyXG4gICAqICovXHJcbiAgQElucHV0KCduYkNvbnRleHRNZW51JylcclxuICBzZXQgc2V0SXRlbXMoaXRlbXM6IE5iTWVudUl0ZW1bXSkge1xyXG4gICAgdGhpcy52YWxpZGF0ZUl0ZW1zKGl0ZW1zKTtcclxuICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgcmVmOiBOYk92ZXJsYXlSZWY7XHJcbiAgcHJvdGVjdGVkIGNvbnRhaW5lcjogQ29tcG9uZW50UmVmPGFueT47XHJcbiAgcHJvdGVjdGVkIHBvc2l0aW9uU3RyYXRlZ3k6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIHRyaWdnZXJTdHJhdGVneTogTmJUcmlnZ2VyU3RyYXRlZ3k7XHJcbiAgcHJvdGVjdGVkIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGl0ZW1zOiBOYk1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChOQl9ET0NVTUVOVCkgcHJvdGVjdGVkIGRvY3VtZW50LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgbWVudVNlcnZpY2U6IE5iTWVudVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBob3N0UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcG9zaXRpb25CdWlsZGVyOiBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneSA9IHRoaXMuY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpO1xyXG4gICAgdGhpcy5yZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5wb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneSA9IHRoaXMuY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVPblRyaWdnZXJzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZU9uUG9zaXRpb25DaGFuZ2UoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlT25JdGVtQ2xpY2soKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjcmVhdGVDb250YWluZXIodGhpcy5yZWYsIE5iQ29udGV4dE1lbnVDb21wb25lbnQsIHtcclxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXHJcbiAgICAgIGl0ZW1zOiB0aGlzLml0ZW1zLFxyXG4gICAgICB0YWc6IHRoaXMudGFnLFxyXG4gICAgfSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMucmVmLmRldGFjaCgpO1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMucmVmICYmIHRoaXMucmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCk6IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25CdWlsZGVyXHJcbiAgICAgIC5jb25uZWN0ZWRUbyh0aGlzLmhvc3RSZWYpXHJcbiAgICAgIC5wb3NpdGlvbih0aGlzLnBvc2l0aW9uKVxyXG4gICAgICAuYWRqdXN0bWVudCh0aGlzLmFkanVzdG1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICByZXR1cm4gbmV3IE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcigpXHJcbiAgICAgIC5kb2N1bWVudCh0aGlzLmRvY3VtZW50KVxyXG4gICAgICAudHJpZ2dlcihOYlRyaWdnZXIuQ0xJQ0spXHJcbiAgICAgIC5ob3N0KHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KVxyXG4gICAgICAuY29udGFpbmVyKCgpID0+IHRoaXMuY29udGFpbmVyKVxyXG4gICAgICAuYnVpbGQoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlXHJcbiAgICAgIC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSlcclxuICAgICAgLnN1YnNjcmliZSgocG9zaXRpb246IE5iUG9zaXRpb24pID0+IHBhdGNoKHRoaXMuY29udGFpbmVyLCB7IHBvc2l0aW9uIH0pKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdWJzY3JpYmVPblRyaWdnZXJzKCkge1xyXG4gICAgdGhpcy50cmlnZ2VyU3RyYXRlZ3kuc2hvdyQucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnNob3coKSk7XHJcbiAgICB0aGlzLnRyaWdnZXJTdHJhdGVneS5oaWRlJC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogTmJNZW51Q29tcG9uZW50IHdpbGwgY3Jhc2ggaWYgZG9uJ3QgcGFzcyBtZW51IGl0ZW1zIHRvIGl0LlxyXG4gICAqIFNvLCB3ZSBqdXN0IHZhbGlkYXRpbmcgdGhlbSBhbmQgdGhyb3cgY3VzdG9tIG9idmlvdXMgZXJyb3IuXHJcbiAgICogKi9cclxuICBwcml2YXRlIHZhbGlkYXRlSXRlbXMoaXRlbXM6IE5iTWVudUl0ZW1bXSkge1xyXG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IEVycm9yKGBMaXN0IG9mIG1lbnUgaXRlbXMgZXhwZWN0ZWQsIGJ1dCBnaXZlbjogJHtpdGVtc31gKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVPbkl0ZW1DbGljaygpIHtcclxuICAgIHRoaXMubWVudVNlcnZpY2Uub25JdGVtQ2xpY2soKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSksXHJcbiAgICAgICAgZmlsdGVyKCh7IHRhZyB9KSA9PiB0YWcgPT09IHRoaXMudGFnKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcclxuICB9XHJcbn1cclxuIl19