@perfectmemory/ngx-contextmenu
Version:
A context menu component for Angular
1 lines • 145 kB
Source Map (JSON)
{"version":3,"file":"perfectmemory-ngx-contextmenu.mjs","sources":["../tmp-esm2022/lib/helper/evaluate.js","../tmp-esm2022/lib/directives/context-menu-item/context-menu-item.directive.js","../tmp-esm2022/lib/directives/context-menu-content-item/context-menu-content-item.directive.js","../tmp-esm2022/lib/services/context-menu-overlays/context-menu-overlays.service.js","../tmp-esm2022/lib/components/context-menu-content/context-menu-content.component.js","../tmp-esm2022/lib/components/context-menu/context-menu.component.helpers.js","../tmp-esm2022/lib/components/context-menu/context-menu.component.js","../tmp-esm2022/lib/directives/context-menu/context-menu.directive.js","../tmp-esm2022/lib/ngx-contextmenu.module.js","../tmp-esm2022/lib/services/context-menu/context-menu.service.js","../tmp-esm2022/index.js","../tmp-esm2022/perfectmemory-ngx-contextmenu.js"],"sourcesContent":["export const evaluateIfFunction = (value, item) => {\n if (value instanceof Function) {\n return value(item);\n }\n return !!value;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1jb250ZXh0bWVudS9zcmMvbGliL2hlbHBlci9ldmFsdWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUNoQyxLQUFxRCxFQUNyRCxJQUFRLEVBQ0MsRUFBRTtJQUNYLElBQUksS0FBSyxZQUFZLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGV2YWx1YXRlSWZGdW5jdGlvbiA9IDxUPihcbiAgdmFsdWU6IGJvb2xlYW4gfCAoKHZhbHVlPzogVCkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQsXG4gIGl0ZW0/OiBUXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gdmFsdWUoaXRlbSk7XG4gIH1cbiAgcmV0dXJuICEhdmFsdWU7XG59O1xuIl19","import { Directive, EventEmitter, Input, Optional, Output, TemplateRef, } from '@angular/core';\nimport { evaluateIfFunction } from '../../helper/evaluate';\nimport * as i0 from \"@angular/core\";\nexport class ContextMenuItemDirective {\n /**\n * Is this menu item disabled\n */\n set disabled(disabled) {\n this.#disabled = disabled;\n }\n get disabled() {\n return (this.passive ||\n this.divider ||\n evaluateIfFunction(this.#disabled, this.value));\n }\n #disabled;\n constructor(template) {\n this.template = template;\n /**\n * True to make this menu item a divider\n */\n this.divider = false;\n /**\n * Is this menu item passive (for title)\n */\n this.passive = false;\n /**\n * Is this menu item visible\n */\n this.visible = true;\n /**\n * Emits event and item\n */\n this.execute = new EventEmitter();\n this.#disabled = false;\n }\n /**\n * @internal\n */\n triggerExecute(event, value) {\n if (evaluateIfFunction(this.#disabled, value)) {\n return;\n }\n this.execute.emit({ event, value });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuItemDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }\n static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.0.3\", type: ContextMenuItemDirective, isStandalone: false, selector: \"[contextMenuItem]\", inputs: { subMenu: \"subMenu\", divider: \"divider\", disabled: \"disabled\", passive: \"passive\", visible: \"visible\" }, outputs: { execute: \"execute\" }, ngImport: i0 }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuItemDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[contextMenuItem]',\n standalone: false,\n }]\n }], ctorParameters: () => [{ type: i0.TemplateRef, decorators: [{\n type: Optional\n }] }], propDecorators: { subMenu: [{\n type: Input\n }], divider: [{\n type: Input\n }], disabled: [{\n type: Input\n }], passive: [{\n type: Input\n }], visible: [{\n type: Input\n }], execute: [{\n type: Output\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LWl0ZW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtY29udGV4dG1lbnUvc3JjL2xpYi9kaXJlY3RpdmVzL2NvbnRleHQtbWVudS1pdGVtL2NvbnRleHQtbWVudS1pdGVtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBTTNELE1BQU0sT0FBTyx3QkFBd0I7SUFhbkM7O09BRUc7SUFDSCxJQUNXLFFBQVEsQ0FBQyxRQUE0QztRQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxPQUFPO1lBQ1osa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQy9DLENBQUM7SUFDSixDQUFDO0lBNEJELFNBQVMsQ0FBNkM7SUFFdEQsWUFFUyxRQUF3QztRQUF4QyxhQUFRLEdBQVIsUUFBUSxDQUFnQztRQXBEakQ7O1dBRUc7UUFFSSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBa0J2Qjs7V0FFRztRQUVJLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFdkI7O1dBRUc7UUFFSSxZQUFPLEdBQXVDLElBQUksQ0FBQztRQUUxRDs7V0FFRztRQUVJLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFHN0IsQ0FBQztRQU9MLGNBQVMsR0FBdUMsS0FBSyxDQUFDO0lBS25ELENBQUM7SUFFSjs7T0FFRztJQUNJLGNBQWMsQ0FBQyxLQUFpQyxFQUFFLEtBQVM7UUFDaEUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7OEdBdkVVLHdCQUF3QjtrR0FBeEIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQUpwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs7MEJBMkRJLFFBQVE7eUNBckRKLE9BQU87c0JBRGIsS0FBSztnQkFPQyxPQUFPO3NCQURiLEtBQUs7Z0JBT0ssUUFBUTtzQkFEbEIsS0FBSztnQkFpQkMsT0FBTztzQkFEYixLQUFLO2dCQU9DLE9BQU87c0JBRGIsS0FBSztnQkFPQyxPQUFPO3NCQURiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IGV2YWx1YXRlSWZGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2hlbHBlci9ldmFsdWF0ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjb250ZXh0TWVudUl0ZW1dJyxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51SXRlbURpcmVjdGl2ZTxUPiB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBzdWJNZW51IGNvbXBvbmVudCByZWZcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdWJNZW51PzogQ29udGV4dE1lbnVDb21wb25lbnQ8VD47XG5cbiAgLyoqXG4gICAqIFRydWUgdG8gbWFrZSB0aGlzIG1lbnUgaXRlbSBhIGRpdmlkZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXZpZGVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIElzIHRoaXMgbWVudSBpdGVtIGRpc2FibGVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuIHwgKCh2YWx1ZT86IFQpID0+IGJvb2xlYW4pKSB7XG4gICAgdGhpcy4jZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucGFzc2l2ZSB8fFxuICAgICAgdGhpcy5kaXZpZGVyIHx8XG4gICAgICBldmFsdWF0ZUlmRnVuY3Rpb24odGhpcy4jZGlzYWJsZWQsIHRoaXMudmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGlzIG1lbnUgaXRlbSBwYXNzaXZlIChmb3IgdGl0bGUpXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcGFzc2l2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIG1lbnUgaXRlbSB2aXNpYmxlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdmlzaWJsZTogYm9vbGVhbiB8ICgodmFsdWU/OiBUKSA9PiBib29sZWFuKSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IGFuZCBpdGVtXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGV4ZWN1dGUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ7XG4gICAgdmFsdWU/OiBUO1xuICB9PigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyB2YWx1ZT86IFQ7XG5cbiAgI2Rpc2FibGVkOiBib29sZWFuIHwgKCh2YWx1ZT86IFQpID0+IGJvb2xlYW4pID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKClcbiAgICBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0PzogVCB9PlxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHRyaWdnZXJFeGVjdXRlKGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCwgdmFsdWU/OiBUKTogdm9pZCB7XG4gICAgaWYgKGV2YWx1YXRlSWZGdW5jdGlvbih0aGlzLiNkaXNhYmxlZCwgdmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5leGVjdXRlLmVtaXQoeyBldmVudCwgdmFsdWUgfSk7XG4gIH1cbn1cbiJdfQ==","import { Directive, ElementRef, Input } from '@angular/core';\nimport { evaluateIfFunction } from '../../helper/evaluate';\nimport { ContextMenuItemDirective } from '../context-menu-item/context-menu-item.directive';\nimport * as i0 from \"@angular/core\";\nexport class ContextMenuContentItemDirective {\n get nativeElement() {\n return this.elementRef.nativeElement;\n }\n constructor(elementRef) {\n this.elementRef = elementRef;\n }\n /**\n * @implements FocusableOption\n */\n focus(origin) {\n this.elementRef.nativeElement.focus();\n }\n /**\n * @implements FocusableOption\n */\n get disabled() {\n return evaluateIfFunction(this.contextMenuContentItem?.disabled, this.contextMenuContentItem?.value);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuContentItemDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }\n static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.0.3\", type: ContextMenuContentItemDirective, isStandalone: false, selector: \"[contextMenuContentItem]\", inputs: { contextMenuContentItem: \"contextMenuContentItem\" }, host: { classAttribute: \"ngx-context-menu-item\" }, exportAs: [\"contextMenuContentItem\"], ngImport: i0 }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuContentItemDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[contextMenuContentItem]',\n exportAs: 'contextMenuContentItem',\n host: {\n class: 'ngx-context-menu-item',\n },\n standalone: false,\n }]\n }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { contextMenuContentItem: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LWNvbnRlbnQtaXRlbS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1jb250ZXh0bWVudS9zcmMvbGliL2RpcmVjdGl2ZXMvY29udGV4dC1tZW51LWNvbnRlbnQtaXRlbS9jb250ZXh0LW1lbnUtY29udGVudC1pdGVtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7O0FBVTVGLE1BQU0sT0FBTywrQkFBK0I7SUFJMUMsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELFlBQW9CLFVBQW1DO1FBQW5DLGVBQVUsR0FBVixVQUFVLENBQXlCO0lBQUcsQ0FBQztJQUUzRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxNQUFnQztRQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxrQkFBa0IsQ0FDdkIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFFBQVEsRUFDckMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FDbkMsQ0FBQztJQUNKLENBQUM7OEdBekJVLCtCQUErQjtrR0FBL0IsK0JBQStCOzsyRkFBL0IsK0JBQStCO2tCQVIzQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLElBQUksRUFBRTt3QkFDSixLQUFLLEVBQUUsdUJBQXVCO3FCQUMvQjtvQkFDRCxVQUFVLEVBQUUsS0FBSztpQkFDbEI7K0VBR1Esc0JBQXNCO3NCQUQ1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNPcmlnaW4sIEZvY3VzYWJsZU9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV2YWx1YXRlSWZGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2hlbHBlci9ldmFsdWF0ZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi9jb250ZXh0LW1lbnUtaXRlbS9jb250ZXh0LW1lbnUtaXRlbS5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY29udGV4dE1lbnVDb250ZW50SXRlbV0nLFxuICBleHBvcnRBczogJ2NvbnRleHRNZW51Q29udGVudEl0ZW0nLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICduZ3gtY29udGV4dC1tZW51LWl0ZW0nLFxuICB9LFxuICBzdGFuZGFsb25lOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVDb250ZW50SXRlbURpcmVjdGl2ZTxUPiBpbXBsZW1lbnRzIEZvY3VzYWJsZU9wdGlvbiB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb250ZXh0TWVudUNvbnRlbnRJdGVtPzogQ29udGV4dE1lbnVJdGVtRGlyZWN0aXZlPFQ+O1xuXG4gIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIC8qKlxuICAgKiBAaW1wbGVtZW50cyBGb2N1c2FibGVPcHRpb25cbiAgICovXG4gIHB1YmxpYyBmb2N1cyhvcmlnaW4/OiBGb2N1c09yaWdpbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQGltcGxlbWVudHMgRm9jdXNhYmxlT3B0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBldmFsdWF0ZUlmRnVuY3Rpb24oXG4gICAgICB0aGlzLmNvbnRleHRNZW51Q29udGVudEl0ZW0/LmRpc2FibGVkLFxuICAgICAgdGhpcy5jb250ZXh0TWVudUNvbnRlbnRJdGVtPy52YWx1ZVxuICAgICk7XG4gIH1cbn1cbiJdfQ==","import { EventEmitter, Injectable } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class ContextMenuOverlaysService {\n constructor() {\n /**\n * Emits when all context menus are closed\n */\n this.allClosed = new EventEmitter();\n this.stack = [];\n }\n /**\n * Add an item to the stack\n */\n push(value) {\n this.stack.push(value);\n }\n /**\n * Clear the whole stack\n */\n closeAll() {\n this.stack.forEach((item) => this.dispose(item));\n this.stack = [];\n this.allClosed.emit();\n }\n isEmpty() {\n return this.stack.length === 0;\n }\n dispose(overlayRef) {\n overlayRef.detach();\n overlayRef.dispose();\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuOverlaysService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuOverlaysService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuOverlaysService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LW92ZXJsYXlzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1jb250ZXh0bWVudS9zcmMvbGliL3NlcnZpY2VzL2NvbnRleHQtbWVudS1vdmVybGF5cy9jb250ZXh0LW1lbnUtb3ZlcmxheXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLekQsTUFBTSxPQUFPLDBCQUEwQjtJQUh2QztRQUlFOztXQUVHO1FBQ0ksY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFcEMsVUFBSyxHQUFpQixFQUFFLENBQUM7S0EwQmxDO0lBeEJDOztPQUVHO0lBQ0ksSUFBSSxDQUFDLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVE7UUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sT0FBTyxDQUFDLFVBQXNCO1FBQ3BDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs4R0EvQlUsMEJBQTBCO2tIQUExQiwwQkFBMEIsY0FGekIsTUFBTTs7MkZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51T3ZlcmxheXNTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYWxsIGNvbnRleHQgbWVudXMgYXJlIGNsb3NlZFxuICAgKi9cbiAgcHVibGljIGFsbENsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIHN0YWNrOiBPdmVybGF5UmVmW10gPSBbXTtcblxuICAvKipcbiAgICogQWRkIGFuIGl0ZW0gdG8gdGhlIHN0YWNrXG4gICAqL1xuICBwdWJsaWMgcHVzaCh2YWx1ZTogT3ZlcmxheVJlZikge1xuICAgIHRoaXMuc3RhY2sucHVzaCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHdob2xlIHN0YWNrXG4gICAqL1xuICBwdWJsaWMgY2xvc2VBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFjay5mb3JFYWNoKChpdGVtKSA9PiB0aGlzLmRpc3Bvc2UoaXRlbSkpO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLmFsbENsb3NlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFjay5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwcml2YXRlIGRpc3Bvc2Uob3ZlcmxheVJlZjogT3ZlcmxheVJlZikge1xuICAgIG92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgb3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gIH1cbn1cbiJdfQ==","import { FocusKeyManager } from '@angular/cdk/a11y';\nimport { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Inject, Input, Output, QueryList, ViewChildren, DOCUMENT, } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ContextMenuContentItemDirective } from '../../directives/context-menu-content-item/context-menu-content-item.directive';\nimport { evaluateIfFunction } from '../../helper/evaluate';\nimport { ContextMenuOverlaysService } from '../../services/context-menu-overlays/context-menu-overlays.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"../../services/context-menu-overlays/context-menu-overlays.service\";\nimport * as i2 from \"@angular/common\";\nimport * as i3 from \"../../directives/context-menu-content-item/context-menu-content-item.directive\";\n/**\n * For testing purpose only\n */\nexport const TESTING_WRAPPER = {\n FocusKeyManager,\n};\nexport class ContextMenuContentComponent {\n // TODO: should be private but issue in spec with NullInjectorError: No provider for ElementRef!\n constructor(elementRef, document, contextMenuOverlaysService) {\n this.elementRef = elementRef;\n this.document = document;\n this.contextMenuOverlaysService = contextMenuOverlaysService;\n /**\n * The list of `IContextMenuItemDirective` that represent each menu items\n */\n this.menuDirectives = [];\n /**\n * A CSS class to apply a theme to the the menu\n */\n this.menuClass = '';\n /**\n * Emit when a menu item is selected\n */\n this.execute = new EventEmitter();\n /**\n * Emit when all menus is closed\n */\n this.close = new EventEmitter();\n /**\n * Accessibility\n *\n * @internal\n */\n this.role = 'menu';\n /**\n * Accessibility\n *\n * @internal\n */\n this.ariaOrientation = 'vertical';\n this.subscription = new Subscription();\n }\n /**\n * @internal\n */\n ngAfterViewInit() {\n this.setupDirectives();\n this.activeElement = this.document.activeElement;\n this.elementRef.nativeElement.focus();\n }\n /**\n * @internal\n */\n ngOnDestroy() {\n this.activeElement?.focus();\n this.subscription.unsubscribe();\n this.focusKeyManager?.destroy();\n }\n /**\n * @internal\n */\n onKeyArrowDownOrUp(event) {\n this.focusKeyManager?.onKeydown(event);\n }\n /**\n * @internal\n */\n onKeyArrowRight(event) {\n this.openCloseActiveItemSubMenu(this.dir !== 'rtl', event);\n }\n /**\n * @internal\n */\n onKeyArrowLeft(event) {\n this.openCloseActiveItemSubMenu(this.dir === 'rtl', event);\n }\n /**\n * @internal\n */\n onKeyEnterOrSpace(event) {\n if (!this.focusKeyManager?.activeItem) {\n return;\n }\n this.onMenuItemSelect(this.focusKeyManager.activeItem, event);\n }\n /**\n * @internal\n */\n onClickOrRightClick(event) {\n if (event.type === 'click' && event.button === 2) {\n return;\n }\n if (this.elementRef.nativeElement.contains(event.target)) {\n return;\n }\n this.contextMenuOverlaysService.closeAll();\n }\n /**\n * @internal\n */\n hideSubMenus() {\n this.menuDirectives.forEach((menuDirective) => {\n menuDirective.subMenu?.hide();\n });\n }\n /**\n * @internal\n */\n stopEvent(event) {\n event.stopPropagation();\n }\n /**\n * @internal\n */\n isMenuItemDisabled(menuItem) {\n return evaluateIfFunction(menuItem.disabled, this.value);\n }\n /**\n * @internal\n */\n isMenuItemVisible(menuItem) {\n return evaluateIfFunction(menuItem.contextMenuContentItem?.visible, this.value);\n }\n /**\n * @internal\n */\n openSubMenu(subMenu, event) {\n if (!subMenu) {\n return;\n }\n if (this.focusKeyManager?.activeItemIndex === null) {\n return;\n }\n const anchorContextMenuContentItem = this.contextMenuContentItems?.toArray()[this.focusKeyManager?.activeItemIndex ?? 0];\n const anchorElement = anchorContextMenuContentItem &&\n anchorContextMenuContentItem.nativeElement;\n if (anchorElement && event instanceof KeyboardEvent) {\n subMenu.show({\n anchoredTo: 'element',\n anchorElement,\n value: this.value,\n parentContextMenu: this,\n });\n return;\n }\n if (subMenu.isOpen) {\n return;\n }\n if (event.currentTarget) {\n subMenu.show({\n anchoredTo: 'element',\n anchorElement: event.currentTarget,\n value: this.value,\n parentContextMenu: this,\n });\n return;\n }\n subMenu.show({\n anchoredTo: 'position',\n x: event.clientX,\n y: event.clientY,\n value: this.value,\n });\n }\n /**\n * @internal\n */\n onMenuItemSelect(menuContentItem, event) {\n this.cancelEvent(event);\n this.openSubMenu(menuContentItem.contextMenuContentItem?.subMenu, event);\n if (!menuContentItem.contextMenuContentItem?.subMenu) {\n this.triggerExecute(menuContentItem, event);\n }\n }\n triggerExecute(menuItem, event) {\n menuItem.contextMenuContentItem?.triggerExecute(event, this.value);\n }\n setupDirectives() {\n this.menuDirectives.forEach((menuDirective) => {\n menuDirective.value = this.value;\n this.subscription.add(menuDirective.execute.subscribe((event) => {\n this.execute.emit({ ...event, menuDirective });\n }));\n });\n this.focusKeyManager = new TESTING_WRAPPER.FocusKeyManager(this.contextMenuContentItems).withWrap();\n }\n openCloseActiveItemSubMenu(open, event) {\n if (open) {\n this.openActiveItemSubMenu(event);\n return;\n }\n this.closeActiveItemSubMenu(event);\n }\n openActiveItemSubMenu(event) {\n if (this.focusKeyManager?.activeItemIndex === null) {\n return;\n }\n this.cancelEvent(event);\n if (this.focusKeyManager?.activeItem) {\n this.openSubMenu(this.focusKeyManager.activeItem?.contextMenuContentItem?.subMenu, event);\n }\n }\n closeActiveItemSubMenu(event) {\n this.hideSubMenus();\n if (!this.focusKeyManager?.activeItemIndex) {\n return;\n }\n this.close.emit();\n this.cancelEvent(event);\n }\n cancelEvent(event) {\n if (!event || !event.target) {\n return;\n }\n const target = event.target;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) ||\n target.isContentEditable) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuContentComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i1.ContextMenuOverlaysService }], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.0.3\", type: ContextMenuContentComponent, isStandalone: false, selector: \"context-menu-content\", inputs: { menuDirectives: \"menuDirectives\", value: \"value\", dir: \"dir\", parentContextMenu: \"parentContextMenu\", menuClass: \"menuClass\" }, outputs: { execute: \"execute\", close: \"close\" }, host: { attributes: { \"tabindex\": \"0\", \"role\": \"dialog\" }, listeners: { \"keydown.ArrowDown\": \"onKeyArrowDownOrUp($event)\", \"keydown.ArrowUp\": \"onKeyArrowDownOrUp($event)\", \"keydown.ArrowRight\": \"onKeyArrowRight($event)\", \"keydown.ArrowLeft\": \"onKeyArrowLeft($event)\", \"window:keydown.Enter\": \"onKeyEnterOrSpace($event)\", \"window:keydown.Space\": \"onKeyEnterOrSpace($event)\", \"document:click\": \"onClickOrRightClick($event)\" }, properties: { \"attr.dir\": \"this.dir\", \"class\": \"this.menuClass\", \"attr.role\": \"this.role\", \"aria-orientation\": \"this.ariaOrientation\" }, classAttribute: \"ngx-contextmenu\" }, viewQueries: [{ propertyName: \"contextMenuContentItems\", predicate: ContextMenuContentItemDirective, descendants: true, read: ContextMenuContentItemDirective }], ngImport: i0, template: \"@for (menuDirective of menuDirectives; track menuDirective; let i = $index) {\\n@if (menuDirective.divider) {\\n<hr\\n [contextMenuContentItem]=\\\"menuDirective\\\"\\n role=\\\"separator\\\"\\n (mouseenter)=\\\"hideSubMenus()\\\"\\n/>\\n} @if (!menuDirective.divider && !menuDirective.passive) {\\n<button\\n #buttonContextMenuContentItem=\\\"contextMenuContentItem\\\"\\n [contextMenuContentItem]=\\\"menuDirective\\\"\\n type=\\\"button\\\"\\n role=\\\"menuitem\\\"\\n [attr.aria-haspopup]=\\\"!!menuDirective.subMenu ? 'menu' : null\\\"\\n [class.ngx-contextmenu--parent-menu]=\\\"!!menuDirective.subMenu\\\"\\n [attr.disabled]=\\\"isMenuItemDisabled(menuDirective) ? 'disabled' : null\\\"\\n (click)=\\\"onMenuItemSelect(buttonContextMenuContentItem, $event)\\\"\\n (mouseenter)=\\\"\\n hideSubMenus();\\n openSubMenu(\\n buttonContextMenuContentItem.contextMenuContentItem?.subMenu,\\n $event\\n )\\n \\\"\\n>\\n <ng-template\\n [ngTemplateOutlet]=\\\"menuDirective.template\\\"\\n [ngTemplateOutletContext]=\\\"{ $implicit: value }\\\"\\n ></ng-template>\\n</button>\\n} @if (!menuDirective.divider && menuDirective.passive) {\\n<span\\n [contextMenuContentItem]=\\\"menuDirective\\\"\\n class=\\\"ngx-contextmenu-item--passive\\\"\\n role=\\\"menuitem\\\"\\n [attr.aria-disabled]=\\\"isMenuItemDisabled(menuDirective)\\\"\\n (click)=\\\"stopEvent($event)\\\"\\n (contextmenu)=\\\"stopEvent($event)\\\"\\n [class.disabled]=\\\"isMenuItemDisabled(menuDirective)\\\"\\n (mouseenter)=\\\"isMenuItemDisabled(menuDirective) ? null : hideSubMenus()\\\"\\n>\\n <ng-template\\n [ngTemplateOutlet]=\\\"menuDirective.template\\\"\\n [ngTemplateOutletContext]=\\\"{ $implicit: value }\\\"\\n ></ng-template>\\n</span>\\n} }\\n\", dependencies: [{ kind: \"directive\", type: i2.NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }, { kind: \"directive\", type: i3.ContextMenuContentItemDirective, selector: \"[contextMenuContentItem]\", inputs: [\"contextMenuContentItem\"], exportAs: [\"contextMenuContentItem\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: ContextMenuContentComponent, decorators: [{\n type: Component,\n args: [{ selector: 'context-menu-content', changeDetection: ChangeDetectionStrategy.OnPush, host: {\n tabindex: '0',\n role: 'dialog',\n class: 'ngx-contextmenu',\n }, standalone: false, template: \"@for (menuDirective of menuDirectives; track menuDirective; let i = $index) {\\n@if (menuDirective.divider) {\\n<hr\\n [contextMenuContentItem]=\\\"menuDirective\\\"\\n role=\\\"separator\\\"\\n (mouseenter)=\\\"hideSubMenus()\\\"\\n/>\\n} @if (!menuDirective.divider && !menuDirective.passive) {\\n<button\\n #buttonContextMenuContentItem=\\\"contextMenuContentItem\\\"\\n [contextMenuContentItem]=\\\"menuDirective\\\"\\n type=\\\"button\\\"\\n role=\\\"menuitem\\\"\\n [attr.aria-haspopup]=\\\"!!menuDirective.subMenu ? 'menu' : null\\\"\\n [class.ngx-contextmenu--parent-menu]=\\\"!!menuDirective.subMenu\\\"\\n [attr.disabled]=\\\"isMenuItemDisabled(menuDirective) ? 'disabled' : null\\\"\\n (click)=\\\"onMenuItemSelect(buttonContextMenuContentItem, $event)\\\"\\n (mouseenter)=\\\"\\n hideSubMenus();\\n openSubMenu(\\n buttonContextMenuContentItem.contextMenuContentItem?.subMenu,\\n $event\\n )\\n \\\"\\n>\\n <ng-template\\n [ngTemplateOutlet]=\\\"menuDirective.template\\\"\\n [ngTemplateOutletContext]=\\\"{ $implicit: value }\\\"\\n ></ng-template>\\n</button>\\n} @if (!menuDirective.divider && menuDirective.passive) {\\n<span\\n [contextMenuContentItem]=\\\"menuDirective\\\"\\n class=\\\"ngx-contextmenu-item--passive\\\"\\n role=\\\"menuitem\\\"\\n [attr.aria-disabled]=\\\"isMenuItemDisabled(menuDirective)\\\"\\n (click)=\\\"stopEvent($event)\\\"\\n (contextmenu)=\\\"stopEvent($event)\\\"\\n [class.disabled]=\\\"isMenuItemDisabled(menuDirective)\\\"\\n (mouseenter)=\\\"isMenuItemDisabled(menuDirective) ? null : hideSubMenus()\\\"\\n>\\n <ng-template\\n [ngTemplateOutlet]=\\\"menuDirective.template\\\"\\n [ngTemplateOutletContext]=\\\"{ $implicit: value }\\\"\\n ></ng-template>\\n</span>\\n} }\\n\" }]\n }], ctorParameters: () => [{ type: i0.ElementRef }, { type: Document, decorators: [{\n type: Inject,\n args: [DOCUMENT]\n }] }, { type: i1.ContextMenuOverlaysService }], propDecorators: { menuDirectives: [{\n type: Input\n }], value: [{\n type: Input\n }], dir: [{\n type: Input\n }, {\n type: HostBinding,\n args: ['attr.dir']\n }], parentContextMenu: [{\n type: Input\n }], menuClass: [{\n type: HostBinding,\n args: ['class']\n }, {\n type: Input\n }], execute: [{\n type: Output\n }], close: [{\n type: Output\n }], contextMenuContentItems: [{\n type: ViewChildren,\n args: [ContextMenuContentItemDirective, {\n read: ContextMenuContentItemDirective,\n }]\n }], role: [{\n type: HostBinding,\n args: ['attr.role']\n }], ariaOrientation: [{\n type: HostBinding,\n args: ['aria-orientation']\n }], onKeyArrowDownOrUp: [{\n type: HostListener,\n args: ['keydown.ArrowDown', ['$event']]\n }, {\n type: HostListener,\n args: ['keydown.ArrowUp', ['$event']]\n }], onKeyArrowRight: [{\n type: HostListener,\n args: ['keydown.ArrowRight', ['$event']]\n }], onKeyArrowLeft: [{\n type: HostListener,\n args: ['keydown.ArrowLeft', ['$event']]\n }], onKeyEnterOrSpace: [{\n type: HostListener,\n args: ['window:keydown.Enter', ['$event']]\n }, {\n type: HostListener,\n args: ['window:keydown.Space', ['$event']]\n }], onClickOrRightClick: [{\n type: HostListener,\n args: ['document:click', ['$event']]\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LWNvbnRlbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtY29udGV4dG1lbnUvc3JjL2xpYi9jb21wb25lbnRzL2NvbnRleHQtbWVudS1jb250ZW50L2NvbnRleHQtbWVudS1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWNvbnRleHRtZW51L3NyYy9saWIvY29tcG9uZW50cy9jb250ZXh0LW1lbnUtY29udGVudC9jb250ZXh0LW1lbnUtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sZ0ZBQWdGLENBQUM7QUFFakksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7Ozs7O0FBR2hIOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLGVBQWU7Q0FDaEIsQ0FBQztBQWFGLE1BQU0sT0FBTywyQkFBMkI7SUFpRnRDLGdHQUFnRztJQUNoRyxZQUNVLFVBQW1DLEVBRXBDLFFBQWtCLEVBQ2pCLDBCQUFzRDtRQUh0RCxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUVwQyxhQUFR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LFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUM1QyxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVNwQyxlQUFlO3NCQURyQixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN2QyxjQUFjO3NCQURwQixZQUFZO3VCQUFDLG1CQUFtQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVV0QyxpQkFBaUI7c0JBRnZCLFlBQVk7dUJBQUMsc0JBQXNCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUMvQyxZQUFZO3VCQUFDLHNCQUFzQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWF6QyxtQkFBbUI7c0JBRHpCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c0tleU1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkcmVuLFxuICBET0NVTUVOVCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRleHRNZW51Q29udGVudEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbnRleHQtbWVudS1jb250ZW50LWl0ZW0vY29udGV4dC1tZW51LWNvbnRlbnQtaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbnRleHQtbWVudS1pdGVtL2NvbnRleHQtbWVudS1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBldmFsdWF0ZUlmRnVuY3Rpb24gfSBmcm9tICcuLi8uLi9oZWxwZXIvZXZhbHVhdGUnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVPdmVybGF5c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb250ZXh0LW1lbnUtb3ZlcmxheXMvY29udGV4dC1tZW51LW92ZXJsYXlzLnNlcnZpY2UnO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUuY29tcG9uZW50JztcblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3NlIG9ubHlcbiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RJTkdfV1JBUFBFUiA9IHtcbiAgRm9jdXNLZXlNYW5hZ2VyLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29udGV4dC1tZW51LWNvbnRlbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGV4dC1tZW51LWNvbnRlbnQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgIHRhYmluZGV4OiAnMCcsXG4gICAgcm9sZTogJ2RpYWxvZycsXG4gICAgY2xhc3M6ICduZ3gtY29udGV4dG1lbnUnLFxuICB9LFxuICBzdGFuZGFsb25lOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVDb250ZW50Q29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBgSUNvbnRleHRNZW51SXRlbURpcmVjdGl2ZWAgdGhhdCByZXByZXNlbnQgZWFjaCBtZW51IGl0ZW1zXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWVudURpcmVjdGl2ZXM6IENvbnRleHRNZW51SXRlbURpcmVjdGl2ZTxUPltdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIG9uIHdoaWNoIHRoZSBtZW51IGFjdFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlPzogVDtcblxuICAvKipcbiAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9IVE1ML0dsb2JhbF9hdHRyaWJ1dGVzL2RpclxuICAgKi9cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRpcicpXG4gIHB1YmxpYyBkaXI6ICdsdHInIHwgJ3J0bCcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgbWVudSBvZiB0aGUgaW5zdGFuY2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYXJlbnRDb250ZXh0TWVudSE6IENvbnRleHRNZW51Q29udGVudENvbXBvbmVudDxUPjtcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgdG8gYXBwbHkgYSB0aGVtZSB0byB0aGUgdGhlIG1lbnVcbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBASW5wdXQoKVxuICBwdWJsaWMgbWVudUNsYXNzID0gJyc7XG5cbiAgLyoqXG4gICAqIEVtaXQgd2hlbiBhIG1lbnUgaXRlbSBpcyBzZWxlY3RlZFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBleGVjdXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50O1xuICAgIHZhbHVlPzogVDtcbiAgICBtZW51RGlyZWN0aXZlOiBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmU8VD47XG4gIH0+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXQgd2hlbiBhbGwgbWVudXMgaXMgY2xvc2VkXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBWaWV3Q2hpbGRyZW4oQ29udGV4dE1lbnVDb250ZW50SXRlbURpcmVjdGl2ZSwge1xuICAgIHJlYWQ6IENvbnRleHRNZW51Q29udGVudEl0ZW1EaXJlY3RpdmUsXG4gIH0pXG4gIHB1YmxpYyBjb250ZXh0TWVudUNvbnRlbnRJdGVtcyE6IFF1ZXJ5TGlzdDxcbiAgICBDb250ZXh0TWVudUNvbnRlbnRJdGVtRGlyZWN0aXZlPFQ+XG4gID47XG5cbiAgLyoqXG4gICAqIEFjY2Vzc2liaWxpdHlcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIHB1YmxpYyByb2xlID0gJ21lbnUnO1xuICAvKipcbiAgICogQWNjZXNzaWJpbGl0eVxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBIb3N0QmluZGluZygnYXJpYS1vcmllbnRhdGlvbicpXG4gIHB1YmxpYyBhcmlhT3JpZW50YXRpb24gPSAndmVydGljYWwnO1xuXG4gIHByaXZhdGUgZm9jdXNLZXlNYW5hZ2VyPzogRm9jdXNLZXlNYW5hZ2VyPENvbnRleHRNZW51Q29udGVudEl0ZW1EaXJlY3RpdmU8VD4+O1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGFjdGl2ZUVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLy8gVE9ETzogc2hvdWxkIGJlIHByaXZhdGUgYnV0IGlzc3VlIGluIHNwZWMgd2l0aCBOdWxsSW5qZWN0b3JFcnJvcjogTm8gcHJvdmlkZXIgZm9yIEVsZW1lbnRSZWYhXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgQEluamVjdChET0NVTUVOVClcbiAgICBwdWJsaWMgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgY29udGV4dE1lbnVPdmVybGF5c1NlcnZpY2U6IENvbnRleHRNZW51T3ZlcmxheXNTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0dXBEaXJlY3RpdmVzKCk7XG4gICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuYWN0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9jdXNLZXlNYW5hZ2VyPy5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLkFycm93RG93bicsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dVcCcsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbktleUFycm93RG93bk9yVXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzS2V5TWFuYWdlcj8ub25LZXlkb3duKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dSaWdodCcsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbktleUFycm93UmlnaHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5DbG9zZUFjdGl2ZUl0ZW1TdWJNZW51KHRoaXMuZGlyICE9PSAncnRsJywgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5BcnJvd0xlZnQnLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25LZXlBcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5DbG9zZUFjdGl2ZUl0ZW1TdWJNZW51KHRoaXMuZGlyID09PSAncnRsJywgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24uRW50ZXInLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi5TcGFjZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbktleUVudGVyT3JTcGFjZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mb2N1c0tleU1hbmFnZXI/LmFjdGl2ZUl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uTWVudUl0ZW1TZWxlY3QodGhpcy5mb2N1c0tleU1hbmFnZXIuYWN0aXZlSXRlbSwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25DbGlja09yUmlnaHRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snICYmIGV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHRNZW51T3ZlcmxheXNTZXJ2aWNlLmNsb3NlQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgaGlkZVN1Yk1lbnVzKCk6IHZvaWQge1xuICAgIHRoaXMubWVudURpcmVjdGl2ZXMuZm9yRWFjaCgobWVudURpcmVjdGl2ZSkgPT4ge1xuICAgICAgbWVudURpcmVjdGl2ZS5zdWJNZW51Py5oaWRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgc3RvcEV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgaXNNZW51SXRlbURpc2FibGVkKG1lbnVJdGVtOiBDb250ZXh0TWVudUl0ZW1EaXJlY3RpdmU8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGVJZkZ1bmN0aW9uKG1lbnVJdGVtLmRpc2FibGVkLCB0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBpc01lbnVJdGVtVmlzaWJsZShcbiAgICBtZW51SXRlbTogQ29udGV4dE1lbnVDb250ZW50SXRlbURpcmVjdGl2ZTxUPlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGVJZkZ1bmN0aW9uKFxuICAgICAgbWVudUl0ZW0uY29udGV4dE1lbnVDb250ZW50SXRlbT8udmlzaWJsZSxcbiAgICAgIHRoaXMudmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIG9wZW5TdWJNZW51KFxuICAgIHN1Yk1lbnU6IENvbnRleHRNZW51Q29tcG9uZW50PFQ+IHwgdW5kZWZpbmVkLFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXN1Yk1lb