UNPKG

@ibenvandeveire/ngx-utils

Version:

A series of abstracts, utils, pipes and services for Angular applications, created by Iben Van de Veire.

1 lines 137 kB
{"version":3,"file":"ibenvandeveire-ngx-utils.mjs","sources":["../tmp-esm2022/lib/directives/focus-click/focus-click.directive.js","../tmp-esm2022/lib/directives/index.js","../tmp-esm2022/lib/services/broadcast-channel/broadcast-channel.service.js","../tmp-esm2022/lib/services/storage-service/storage.service.js","../tmp-esm2022/lib/services/media-query/mediaquery.service.js","../tmp-esm2022/lib/pipes/btw/btw.pipe.js","../tmp-esm2022/lib/pipes/has-observers/has-observers.pipe.js","../tmp-esm2022/lib/pipes/iban/iban.pipe.js","../tmp-esm2022/lib/tokens/replace-elements.token.js","../tmp-esm2022/lib/pipes/replace-elements/replace-elements.pipe.js","../tmp-esm2022/lib/pipes/transform/transform.pipe.js","../tmp-esm2022/lib/pipes/index.js","../tmp-esm2022/lib/abstracts/query-param-form-sync/query-param-form-sync.component.abstract.js","../tmp-esm2022/lib/providers/replace-elements/replace-elements.provider.js","../tmp-esm2022/lib/utils/simple-changes/simple-changes.util.js","../tmp-esm2022/index.js","../tmp-esm2022/ibenvandeveire-ngx-utils.js"],"sourcesContent":["import { Directive, HostListener, input, output } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class FocusClickDirective {\n // Allow the button to ignore click events when set to true\n disabled = input(false, ...(ngDevMode ? [{ debugName: \"disabled\" }] : []));\n // Allow the function passed by the host to be executed\n // when the emit() method gets called\n /**\n * This directive replaces the default `click` directive and allows the user to execute\n * the `click` event by clicking the mouse **and** by using the `enter` key on focus.\n *\n * A tabindex of `0` gets added to the host.\n *\n * @memberof FocusClickDirective\n */\n focusClick = output();\n // Add eventhandler to the click event\n isClicked(event) {\n if (!this.disabled()) {\n this.focusClick.emit(event);\n }\n }\n // Add eventhandler to keydown event When enter is pressed and the event\n // isn't blocked, execute the click function of the host\n isEntered() {\n if (!this.disabled()) {\n this.focusClick.emit();\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: FocusClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"17.1.0\", version: \"20.1.2\", type: FocusClickDirective, isStandalone: true, selector: \"[focusClick]\", inputs: { disabled: { classPropertyName: \"disabled\", publicName: \"disabled\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusClick: \"focusClick\" }, host: { listeners: { \"click\": \"isClicked($event)\", \"keydown.enter\": \"isEntered()\" }, properties: { \"attr.tabIndex\": \"0\" } }, ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: FocusClickDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[focusClick]',\n standalone: true,\n host: {\n '[attr.tabIndex]': '0',\n },\n }]\n }], propDecorators: { isClicked: [{\n type: HostListener,\n args: ['click', ['$event']]\n }], isEntered: [{\n type: HostListener,\n args: ['keydown.enter']\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtY2xpY2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3V0aWxzL3NyYy9saWIvZGlyZWN0aXZlcy9mb2N1cy1jbGljay9mb2N1cy1jbGljay5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQW9CLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBU3pGLE1BQU0sT0FBTyxtQkFBbUI7SUFDL0IsMkRBQTJEO0lBQzNDLFFBQVEsR0FBRyxLQUFLLENBQVUsS0FBSyxvREFBQyxDQUFDO0lBRWpELHVEQUF1RDtJQUN2RCxxQ0FBcUM7SUFDckM7Ozs7Ozs7T0FPRztJQUNhLFVBQVUsR0FBbUMsTUFBTSxFQUFnQixDQUFDO0lBRXBGLHNDQUFzQztJQUUvQixTQUFTLENBQUMsS0FBWTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNGLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsd0RBQXdEO0lBRWpELFNBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0YsQ0FBQzt1R0EvQlcsbUJBQW1COzJGQUFuQixtQkFBbUI7OzJGQUFuQixtQkFBbUI7a0JBUC9CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUU7d0JBQ0wsaUJBQWlCLEVBQUUsR0FBRztxQkFDdEI7aUJBQ0Q7OEJBbUJPLFNBQVM7c0JBRGYsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFCLFNBQVM7c0JBRGYsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIE91dHB1dEVtaXR0ZXJSZWYsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnW2ZvY3VzQ2xpY2tdJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aG9zdDoge1xuXHRcdCdbYXR0ci50YWJJbmRleF0nOiAnMCcsXG5cdH0sXG59KVxuZXhwb3J0IGNsYXNzIEZvY3VzQ2xpY2tEaXJlY3RpdmUge1xuXHQvLyBBbGxvdyB0aGUgYnV0dG9uIHRvIGlnbm9yZSBjbGljayBldmVudHMgd2hlbiBzZXQgdG8gdHJ1ZVxuXHRwdWJsaWMgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cblx0Ly8gQWxsb3cgdGhlIGZ1bmN0aW9uIHBhc3NlZCBieSB0aGUgaG9zdCB0byBiZSBleGVjdXRlZFxuXHQvLyB3aGVuIHRoZSBlbWl0KCkgbWV0aG9kIGdldHMgY2FsbGVkXG5cdC8qKlxuXHQgKiBUaGlzIGRpcmVjdGl2ZSByZXBsYWNlcyB0aGUgZGVmYXVsdCBgY2xpY2tgIGRpcmVjdGl2ZSBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIGV4ZWN1dGVcblx0ICogdGhlIGBjbGlja2AgZXZlbnQgYnkgY2xpY2tpbmcgdGhlIG1vdXNlICoqYW5kKiogIGJ5IHVzaW5nIHRoZSBgZW50ZXJgIGtleSBvbiBmb2N1cy5cblx0ICpcblx0ICogQSB0YWJpbmRleCBvZiBgMGAgZ2V0cyBhZGRlZCB0byB0aGUgaG9zdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIEZvY3VzQ2xpY2tEaXJlY3RpdmVcblx0ICovXG5cdHB1YmxpYyByZWFkb25seSBmb2N1c0NsaWNrOiBPdXRwdXRFbWl0dGVyUmVmPHZvaWQgfCBFdmVudD4gPSBvdXRwdXQ8dm9pZCB8IEV2ZW50PigpO1xuXG5cdC8vIEFkZCBldmVudGhhbmRsZXIgdG8gdGhlIGNsaWNrIGV2ZW50XG5cdEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcblx0cHVibGljIGlzQ2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuZGlzYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5mb2N1c0NsaWNrLmVtaXQoZXZlbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEFkZCBldmVudGhhbmRsZXIgdG8ga2V5ZG93biBldmVudCBXaGVuIGVudGVyIGlzIHByZXNzZWQgYW5kIHRoZSBldmVudFxuXHQvLyBpc24ndCBibG9ja2VkLCBleGVjdXRlIHRoZSBjbGljayBmdW5jdGlvbiBvZiB0aGUgaG9zdFxuXHRASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJylcblx0cHVibGljIGlzRW50ZXJlZCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuZGlzYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5mb2N1c0NsaWNrLmVtaXQoKTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==","import { FocusClickDirective } from './focus-click/focus-click.directive';\nexport const Directives = [FocusClickDirective];\nexport { FocusClickDirective } from './focus-click/focus-click.directive';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvdXRpbHMvc3JjL2xpYi9kaXJlY3RpdmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTFFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c0NsaWNrRGlyZWN0aXZlIH0gZnJvbSAnLi9mb2N1cy1jbGljay9mb2N1cy1jbGljay5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgRGlyZWN0aXZlcyA9IFtGb2N1c0NsaWNrRGlyZWN0aXZlXTtcblxuZXhwb3J0IHsgRm9jdXNDbGlja0RpcmVjdGl2ZSB9IGZyb20gJy4vZm9jdXMtY2xpY2svZm9jdXMtY2xpY2suZGlyZWN0aXZlJztcbiJdfQ==","import { Injectable, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { EMPTY, fromEvent } from 'rxjs';\nimport * as i0 from \"@angular/core\";\n/**\n * A service that wraps the BroadCastChannel API and provides an Observable based implementation to the channel messages.\n *\n * For more information:\n * https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n */\nexport class NgxBroadcastChannelService {\n windowService = inject(NgxWindowService);\n /**\n * A record holding all the broadcast channels\n */\n broadcastChannel = {};\n /**\n * initChannel\n *\n * The initChannel method initializes a new BroadcastChannel instance.\n *\n * @param args{ConstructorParameters<typeof BroadcastChannel>} - The arguments to pass to the BroadcastChannel constructor.\n */\n initChannel(...args) {\n // Iben: Only run when in browser\n this.windowService.runInBrowser(() => {\n const [channelName] = args;\n if (!channelName) {\n console.error('NgxUtils: There was an attempt to initialize a BroadcastChannel without providing a name.');\n return;\n }\n if (!this.broadcastChannel[channelName]) {\n this.broadcastChannel[channelName] = new BroadcastChannel(...args);\n }\n });\n }\n /**\n * closeChannel\n *\n * The closeChannel method closes a selected BroadcastChannel instance.\n *\n * @param channelName{string} - The name of the Broadcast Channel.\n */\n closeChannel(channelName) {\n if (!channelName || !this.broadcastChannel[channelName]) {\n return;\n }\n this.broadcastChannel[channelName].close();\n delete this.broadcastChannel[channelName];\n }\n /**\n * postMessage\n *\n * The postMessage method sends a message to a selected BroadcastChannel instance.\n *\n * @param channelName{string} - The name of the Broadcast Channel.\n * @param message{any} - The payload to send through the channel.\n */\n postMessage(channelName, message) {\n if (!channelName || !this.broadcastChannel[channelName]) {\n console.error('NgxUtils: There was an attempt to post a message to a channel without providing a name or the selected channel does not exist. The included message was:', message);\n return;\n }\n this.broadcastChannel[channelName].postMessage(message);\n }\n /**\n * selectChannelMessages\n *\n * The selectChannelMessages method subscribes to the `message` (bc.onmessage) event of a selected BroadcastChannel instance.\n *\n * @param channelName{string} - The name of the Broadcast Channel.\n * @returns Observable<MessageEvent> - The message event of the channel wrapped in an observable.\n */\n selectChannelMessages(channelName) {\n if (!channelName || !this.broadcastChannel[channelName]) {\n console.error(\"NgxUtils: There was an attempt to select a BroadcastChannel's messages without providing a name or the selected channel does not exist.\");\n return EMPTY;\n }\n return fromEvent(this.broadcastChannel[channelName], 'message');\n }\n /**\n * selectChannelMessageErrors\n *\n * The selectChannelMessageErrors method subscribes to the `messageerror` (bc.onmessageerror) event of a selected BroadcastChannel instance.\n *\n * @param channelName{string} - The name of the Broadcast Channel.\n * @returns Observable<MessageEvent> - The messageerror event of the channel wrapped in an observable.\n */\n selectChannelMessageErrors(channelName) {\n if (!channelName || !this.broadcastChannel[channelName]) {\n console.error(\"NgxUtils: There was an attempt to select a BroadcastChannel's message errors without providing a name or the selected channel does not exist.\");\n return EMPTY;\n }\n return fromEvent(this.broadcastChannel[channelName], 'messageerror');\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: NgxBroadcastChannelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: NgxBroadcastChannelService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: NgxBroadcastChannelService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0LWNoYW5uZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci91dGlscy9zcmMvbGliL3NlcnZpY2VzL2Jyb2FkY2FzdC1jaGFubmVsL2Jyb2FkY2FzdC1jaGFubmVsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBRXBEOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQixhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFMUQ7O09BRUc7SUFDSyxnQkFBZ0IsR0FBcUMsRUFBRSxDQUFDO0lBRWhFOzs7Ozs7T0FNRztJQUNJLFdBQVcsQ0FBQyxHQUFHLElBQW9EO1FBQ3pFLGlDQUFpQztRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUUzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQ1osMkZBQTJGLENBQzNGLENBQUM7Z0JBRUYsT0FBTztZQUNSLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFlBQVksQ0FBQyxXQUFtQjtRQUN0QyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDekQsT0FBTztRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxXQUFXLENBQW9CLFdBQW1CLEVBQUUsT0FBb0I7UUFDOUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQ1osMEpBQTBKLEVBQzFKLE9BQU8sQ0FDUCxDQUFDO1lBRUYsT0FBTztRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0kscUJBQXFCLENBQzNCLFdBQW1CO1FBRW5CLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxPQUFPLENBQUMsS0FBSyxDQUNaLHlJQUF5SSxDQUN6SSxDQUFDO1lBRUYsT0FBTyxLQUFLLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQTRCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLDBCQUEwQixDQUNoQyxXQUFtQjtRQUVuQixJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDekQsT0FBTyxDQUFDLEtBQUssQ0FDWiwrSUFBK0ksQ0FDL0ksQ0FBQztZQUVGLE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUNmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFDbEMsY0FBYyxDQUNkLENBQUM7SUFDSCxDQUFDO3VHQXBIVywwQkFBMEI7MkdBQTFCLDBCQUEwQixjQUYxQixNQUFNOzsyRkFFTiwwQkFBMEI7a0JBSHRDLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3hXaW5kb3dTZXJ2aWNlIH0gZnJvbSAnQGliZW52YW5kZXZlaXJlL25neC1jb3JlJztcbmltcG9ydCB7IEVNUFRZLCBmcm9tRXZlbnQsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBBIHNlcnZpY2UgdGhhdCB3cmFwcyB0aGUgQnJvYWRDYXN0Q2hhbm5lbCBBUEkgYW5kIHByb3ZpZGVzIGFuIE9ic2VydmFibGUgYmFzZWQgaW1wbGVtZW50YXRpb24gdG8gdGhlIGNoYW5uZWwgbWVzc2FnZXMuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb246XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQnJvYWRjYXN0Q2hhbm5lbFxuICovXG5ASW5qZWN0YWJsZSh7XG5cdHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmd4QnJvYWRjYXN0Q2hhbm5lbFNlcnZpY2Uge1xuXHRwcml2YXRlIHJlYWRvbmx5IHdpbmRvd1NlcnZpY2UgPSBpbmplY3QoTmd4V2luZG93U2VydmljZSk7XG5cblx0LyoqXG5cdCAqIEEgcmVjb3JkIGhvbGRpbmcgYWxsIHRoZSBicm9hZGNhc3QgY2hhbm5lbHNcblx0ICovXG5cdHByaXZhdGUgYnJvYWRjYXN0Q2hhbm5lbDogUmVjb3JkPHN0cmluZywgQnJvYWRjYXN0Q2hhbm5lbD4gPSB7fTtcblxuXHQvKipcblx0ICogaW5pdENoYW5uZWxcblx0ICpcblx0ICogVGhlIGluaXRDaGFubmVsIG1ldGhvZCBpbml0aWFsaXplcyBhIG5ldyBCcm9hZGNhc3RDaGFubmVsIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXJnc3tDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEJyb2FkY2FzdENoYW5uZWw+fSAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgQnJvYWRjYXN0Q2hhbm5lbCBjb25zdHJ1Y3Rvci5cblx0ICovXG5cdHB1YmxpYyBpbml0Q2hhbm5lbCguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEJyb2FkY2FzdENoYW5uZWw+KTogdm9pZCB7XG5cdFx0Ly8gSWJlbjogT25seSBydW4gd2hlbiBpbiBicm93c2VyXG5cdFx0dGhpcy53aW5kb3dTZXJ2aWNlLnJ1bkluQnJvd3NlcigoKSA9PiB7XG5cdFx0XHRjb25zdCBbY2hhbm5lbE5hbWVdID0gYXJncztcblxuXHRcdFx0aWYgKCFjaGFubmVsTmFtZSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRcdCdOZ3hVdGlsczogVGhlcmUgd2FzIGFuIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSBhIEJyb2FkY2FzdENoYW5uZWwgd2l0aG91dCBwcm92aWRpbmcgYSBuYW1lLidcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5icm9hZGNhc3RDaGFubmVsW2NoYW5uZWxOYW1lXSkge1xuXHRcdFx0XHR0aGlzLmJyb2FkY2FzdENoYW5uZWxbY2hhbm5lbE5hbWVdID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoLi4uYXJncyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogY2xvc2VDaGFubmVsXG5cdCAqXG5cdCAqIFRoZSBjbG9zZUNoYW5uZWwgbWV0aG9kIGNsb3NlcyBhIHNlbGVjdGVkIEJyb2FkY2FzdENoYW5uZWwgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBjaGFubmVsTmFtZXtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIEJyb2FkY2FzdCBDaGFubmVsLlxuXHQgKi9cblx0cHVibGljIGNsb3NlQ2hhbm5lbChjaGFubmVsTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKCFjaGFubmVsTmFtZSB8fCAhdGhpcy5icm9hZGNhc3RDaGFubmVsW2NoYW5uZWxOYW1lXSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuYnJvYWRjYXN0Q2hhbm5lbFtjaGFubmVsTmFtZV0uY2xvc2UoKTtcblx0XHRkZWxldGUgdGhpcy5icm9hZGNhc3RDaGFubmVsW2NoYW5uZWxOYW1lXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBwb3N0TWVzc2FnZVxuXHQgKlxuXHQgKiBUaGUgcG9zdE1lc3NhZ2UgbWV0aG9kIHNlbmRzIGEgbWVzc2FnZSB0byBhIHNlbGVjdGVkIEJyb2FkY2FzdENoYW5uZWwgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBjaGFubmVsTmFtZXtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIEJyb2FkY2FzdCBDaGFubmVsLlxuXHQgKiBAcGFyYW0gbWVzc2FnZXthbnl9IC0gVGhlIHBheWxvYWQgdG8gc2VuZCB0aHJvdWdoIHRoZSBjaGFubmVsLlxuXHQgKi9cblx0cHVibGljIHBvc3RNZXNzYWdlPE1lc3NhZ2VUeXBlID0gYW55PihjaGFubmVsTmFtZTogc3RyaW5nLCBtZXNzYWdlOiBNZXNzYWdlVHlwZSk6IHZvaWQge1xuXHRcdGlmICghY2hhbm5lbE5hbWUgfHwgIXRoaXMuYnJvYWRjYXN0Q2hhbm5lbFtjaGFubmVsTmFtZV0pIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdCdOZ3hVdGlsczogVGhlcmUgd2FzIGFuIGF0dGVtcHQgdG8gcG9zdCBhIG1lc3NhZ2UgdG8gYSBjaGFubmVsIHdpdGhvdXQgcHJvdmlkaW5nIGEgbmFtZSBvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBkb2VzIG5vdCBleGlzdC4gVGhlIGluY2x1ZGVkIG1lc3NhZ2Ugd2FzOicsXG5cdFx0XHRcdG1lc3NhZ2Vcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmJyb2FkY2FzdENoYW5uZWxbY2hhbm5lbE5hbWVdLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHNlbGVjdENoYW5uZWxNZXNzYWdlc1xuXHQgKlxuXHQgKiBUaGUgc2VsZWN0Q2hhbm5lbE1lc3NhZ2VzIG1ldGhvZCBzdWJzY3JpYmVzIHRvIHRoZSBgbWVzc2FnZWAgKGJjLm9ubWVzc2FnZSkgZXZlbnQgb2YgYSBzZWxlY3RlZCBCcm9hZGNhc3RDaGFubmVsIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gY2hhbm5lbE5hbWV7c3RyaW5nfSAtIFRoZSBuYW1lIG9mIHRoZSBCcm9hZGNhc3QgQ2hhbm5lbC5cblx0ICogQHJldHVybnMgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IC0gVGhlIG1lc3NhZ2UgZXZlbnQgb2YgdGhlIGNoYW5uZWwgd3JhcHBlZCBpbiBhbiBvYnNlcnZhYmxlLlxuXHQgKi9cblx0cHVibGljIHNlbGVjdENoYW5uZWxNZXNzYWdlczxNZXNzYWdlVHlwZSA9IGFueT4oXG5cdFx0Y2hhbm5lbE5hbWU6IHN0cmluZ1xuXHQpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudDxNZXNzYWdlVHlwZT4+IHtcblx0XHRpZiAoIWNoYW5uZWxOYW1lIHx8ICF0aGlzLmJyb2FkY2FzdENoYW5uZWxbY2hhbm5lbE5hbWVdKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRcIk5neFV0aWxzOiBUaGVyZSB3YXMgYW4gYXR0ZW1wdCB0byBzZWxlY3QgYSBCcm9hZGNhc3RDaGFubmVsJ3MgbWVzc2FnZXMgd2l0aG91dCBwcm92aWRpbmcgYSBuYW1lIG9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIGRvZXMgbm90IGV4aXN0LlwiXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gRU1QVFk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZyb21FdmVudDxNZXNzYWdlRXZlbnQ8TWVzc2FnZVR5cGU+Pih0aGlzLmJyb2FkY2FzdENoYW5uZWxbY2hhbm5lbE5hbWVdLCAnbWVzc2FnZScpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHNlbGVjdENoYW5uZWxNZXNzYWdlRXJyb3JzXG5cdCAqXG5cdCAqIFRoZSBzZWxlY3RDaGFubmVsTWVzc2FnZUVycm9ycyBtZXRob2Qgc3Vic2NyaWJlcyB0byB0aGUgYG1lc3NhZ2VlcnJvcmAgKGJjLm9ubWVzc2FnZWVycm9yKSBldmVudCBvZiBhIHNlbGVjdGVkIEJyb2FkY2FzdENoYW5uZWwgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBjaGFubmVsTmFtZXtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIEJyb2FkY2FzdCBDaGFubmVsLlxuXHQgKiBAcmV0dXJucyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4gLSBUaGUgbWVzc2FnZWVycm9yIGV2ZW50IG9mIHRoZSBjaGFubmVsIHdyYXBwZWQgaW4gYW4gb2JzZXJ2YWJsZS5cblx0ICovXG5cdHB1YmxpYyBzZWxlY3RDaGFubmVsTWVzc2FnZUVycm9yczxNZXNzYWdlVHlwZSA9IGFueT4oXG5cdFx0Y2hhbm5lbE5hbWU6IHN0cmluZ1xuXHQpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudDxNZXNzYWdlVHlwZT4+IHtcblx0XHRpZiAoIWNoYW5uZWxOYW1lIHx8ICF0aGlzLmJyb2FkY2FzdENoYW5uZWxbY2hhbm5lbE5hbWVdKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRcIk5neFV0aWxzOiBUaGVyZSB3YXMgYW4gYXR0ZW1wdCB0byBzZWxlY3QgYSBCcm9hZGNhc3RDaGFubmVsJ3MgbWVzc2FnZSBlcnJvcnMgd2l0aG91dCBwcm92aWRpbmcgYSBuYW1lIG9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIGRvZXMgbm90IGV4aXN0LlwiXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gRU1QVFk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZyb21FdmVudDxNZXNzYWdlRXZlbnQ8TWVzc2FnZVR5cGU+Pihcblx0XHRcdHRoaXMuYnJvYWRjYXN0Q2hhbm5lbFtjaGFubmVsTmFtZV0sXG5cdFx0XHQnbWVzc2FnZWVycm9yJ1xuXHRcdCk7XG5cdH1cbn1cbiJdfQ==","import { Injectable, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { BehaviorSubject, NEVER, Subject } from 'rxjs';\nimport * as i0 from \"@angular/core\";\n/**\n * A service that provides a SSR-proof Observable based approach to the session- and localStorage.\n */\nexport class NgxStorageService {\n windowService = inject(NgxWindowService);\n /**\n * A record to hold the properties in the sessionStorage\n */\n sessionStorageRecord = {};\n /**\n * A record to hold the properties in the localStorage\n */\n localStorageRecord = {};\n /**\n * A subject to hold the events of the storage\n */\n storageEventSubject = new Subject();\n /**\n * An observable that emits whenever the session- or the localStorage was updated\n */\n storageEvents$ = this.storageEventSubject.asObservable();\n constructor() {\n const windowService = this.windowService;\n // Iben: Get the initial values of the session and the local storage\n windowService.runInBrowser(() => {\n this.setupStorage(sessionStorage, this.sessionStorageRecord);\n this.setupStorage(localStorage, this.localStorageRecord);\n });\n }\n /**\n * A localStorage implementation using observables\n */\n get localStorage() {\n return {\n getItem: (key) => this.getItem(key, localStorage),\n getItemObservable: (key) => this.getItemObservable(key, this.localStorageRecord),\n removeItem: (key) => this.removeItem(key, localStorage, this.localStorageRecord, 'local'),\n setItem: (key, item) => this.setItem(key, item, localStorage, this.localStorageRecord, 'local'),\n clear: () => this.clearStorage(localStorage, this.localStorageRecord, 'local'),\n };\n }\n /**\n * A sessionStorage implementation using observables\n */\n get sessionStorage() {\n return {\n getItem: (key) => this.getItem(key, sessionStorage),\n getItemObservable: (key) => this.getItemObservable(key, this.sessionStorageRecord),\n removeItem: (key) => this.removeItem(key, sessionStorage, this.sessionStorageRecord, 'session'),\n setItem: (key, item) => this.setItem(key, item, sessionStorage, this.sessionStorageRecord, 'session'),\n clear: () => this.clearStorage(sessionStorage, this.sessionStorageRecord, 'session'),\n };\n }\n getItem(key, storage) {\n return this.parseValue(storage.getItem(key));\n }\n /**\n * Returns an observable version of the storage value\n *\n * @param key - The key of the storage value\n * @param record - The storage record\n */\n getItemObservable(key, record) {\n // Iben: Return NEVER when not in browser\n if (!this.windowService.isBrowser()) {\n return NEVER;\n }\n // Iben: If the subject already exists, we return the observable\n if (record[key]) {\n return record[key].asObservable();\n }\n // Iben: If no subject exits, we create a new one\n record[key] = new BehaviorSubject(undefined);\n // Iben: Return the observable\n return this.getItemObservable(key, record);\n }\n /**\n * Sets an item in the storage\n *\n * @param key - The key of the item\n * @param item - The item in the storage\n * @param storage - The storage in which we want to save the item\n * @param record - The corresponding storage record\n */\n setItem(key, item, storage, record, type) {\n // Iben: Early exit when we're in the browser\n if (!this.windowService.isBrowser()) {\n return undefined;\n }\n // Iben: Check if there's already a subject for this item. If not, we create one\n let subject = record[key];\n if (!subject) {\n subject = new BehaviorSubject(undefined);\n storage[key] = subject;\n }\n // Iben: Store the current value of the subject\n const oldValue = subject.getValue();\n // Iben: Set the item in the storage\n storage.setItem(key, typeof item === 'string' ? item : JSON.stringify(item));\n // Iben: Update the subject in the record\n subject.next(item);\n // Iben: Create the storage event\n const event = {\n key,\n newValue: item,\n oldValue,\n storage: type,\n type: 'set',\n };\n // Iben: Emit the storage event\n this.storageEventSubject.next(event);\n // Iben: Return the storage event\n return event;\n }\n /**\n * Remove an item from the storage and emit a remove event\n *\n * @param key - The key of the item\n * @param storage - The storage we wish to remove the item from\n * @param record - The record with the subject\n * @param type - The type of storage\n */\n removeItem(key, storage, record, type) {\n // Iben: Early exit when we're not in the browser\n if (!this.windowService.isBrowser()) {\n return undefined;\n }\n // Iben: Get the old item\n const oldValue = this.parseValue(storage.getItem(key));\n // Iben: Remove the item from the storage\n storage.removeItem(key);\n // Iben Update the subject if it exists\n record[key]?.next(undefined);\n // Iben: Create the event and return and emit it\n const event = {\n oldValue,\n storage: type,\n key,\n type: 'remove',\n };\n this.storageEventSubject.next(event);\n return event;\n }\n /**\n * Clears the storage, completes all subjects and emits a clear event\n *\n * @param storage - The storage we wish to clear\n * @param record - The record with the subjects\n * @param type - The type of storage\n */\n clearStorage(storage, record, type) {\n // Iben: Early exit when we're not in the browser\n if (!this.windowService.isBrowser()) {\n return undefined;\n }\n // Iben: Clear the storage\n storage.clear();\n // Iben: Clear the record and complete all subjects\n Object.entries(record).forEach(([key, subject]) => {\n subject.next(undefined);\n subject.complete();\n record[key] = undefined;\n });\n // Iben: Create and emit event\n const event = {\n type: 'clear',\n storage: type,\n };\n this.storageEventSubject.next(event);\n return event;\n }\n /**\n * Grabs the existing storage and updates the record\n *\n * @private\n * @param {Storage} storage - The current state of the storage\n * @param {NgxStorageRecord} record\n * @memberof NgxStorageService\n */\n setupStorage(storage, record) {\n Object.entries(storage).forEach(([key, value]) => {\n record[key] = new BehaviorSubject(this.parseValue(value));\n });\n }\n /**\n * Parses a string value from the storage to an actual value\n *\n * @param value - The provided string value\n */\n parseValue(value) {\n // Iben: If the value does not exist, return the value\n if (!value) {\n return value;\n }\n // Iben: If the value is either true or false, return a boolean version of the value\n if (value === 'true' || value === 'false') {\n return value === 'true';\n }\n // Iben: If the value is a number, return the parsed number\n if (value.match(/^[0-9]*[,.]{0,1}[0-9]*$/)) {\n return Number(value);\n }\n // Iben: If the value is an object, return the parsed object\n if (value.match(/{(.*:.*[,]{0,1})*}/)) {\n return JSON.parse(value);\n }\n // Iben: Return the string value as is\n return value;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: NgxStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: NgxStorageService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: NgxStorageService, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3V0aWxzL3NyYy9saWIvc2VydmljZXMvc3RvcmFnZS1zZXJ2aWNlL3N0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBWW5FOztHQUVHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUNaLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUxRDs7T0FFRztJQUNjLG9CQUFvQixHQUFxQixFQUFFLENBQUM7SUFDN0Q7O09BRUc7SUFDYyxrQkFBa0IsR0FBcUIsRUFBRSxDQUFDO0lBQzNEOztPQUVHO0lBQ2MsbUJBQW1CLEdBQTZCLElBQUksT0FBTyxFQUFFLENBQUM7SUFFL0U7O09BRUc7SUFDYSxjQUFjLEdBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV6QztRQUNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFekMsb0VBQW9FO1FBQ3BFLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ3RC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QUNuQixpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3hXaW5kb3dTZXJ2aWNlIH0gZnJvbSAnQGliZW52YW5kZXZlaXJlL25neC1jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgTkVWRVIsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcblx0Tmd4U3RvcmFnZSxcblx0Tmd4U3RvcmFnZUNsZWFyRXZlbnQsXG5cdE5neFN0b3JhZ2VFdmVudCxcblx0Tmd4U3RvcmFnZVJlY29yZCxcblx0Tmd4U3RvcmFnZVJlbW92ZUV2ZW50LFxuXHROZ3hTdG9yYWdlU2V0RXZlbnQsXG5cdE5neFN0b3JhZ2VUeXBlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYSBTU1ItcHJvb2YgT2JzZXJ2YWJsZSBiYXNlZCBhcHByb2FjaCB0byB0aGUgc2Vzc2lvbi0gYW5kIGxvY2FsU3RvcmFnZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOZ3hTdG9yYWdlU2VydmljZSB7XG5cdHByaXZhdGUgcmVhZG9ubHkgd2luZG93U2VydmljZSA9IGluamVjdChOZ3hXaW5kb3dTZXJ2aWNlKTtcblxuXHQvKipcblx0ICogQSByZWNvcmQgdG8gaG9sZCB0aGUgcHJvcGVydGllcyBpbiB0aGUgc2Vzc2lvblN0b3JhZ2Vcblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblN0b3JhZ2VSZWNvcmQ6IE5neFN0b3JhZ2VSZWNvcmQgPSB7fTtcblx0LyoqXG5cdCAqIEEgcmVjb3JkIHRvIGhvbGQgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGxvY2FsU3RvcmFnZVxuXHQgKi9cblx0cHJpdmF0ZSByZWFkb25seSBsb2NhbFN0b3JhZ2VSZWNvcmQ6IE5neFN0b3JhZ2VSZWNvcmQgPSB7fTtcblx0LyoqXG5cdCAqIEEgc3ViamVjdCB0byBob2xkIHRoZSBldmVudHMgb2YgdGhlIHN0b3JhZ2Vcblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZUV2ZW50U3ViamVjdDogU3ViamVjdDxOZ3hTdG9yYWdlRXZlbnQ+ID0gbmV3IFN1YmplY3QoKTtcblxuXHQvKipcblx0ICogQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW5ldmVyIHRoZSBzZXNzaW9uLSBvciB0aGUgbG9jYWxTdG9yYWdlIHdhcyB1cGRhdGVkXG5cdCAqL1xuXHRwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZUV2ZW50cyQ6IE9ic2VydmFibGU8Tmd4U3RvcmFnZUV2ZW50PiA9XG5cdFx0dGhpcy5zdG9yYWdlRXZlbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGNvbnN0IHdpbmRvd1NlcnZpY2UgPSB0aGlzLndpbmRvd1NlcnZpY2U7XG5cblx0XHQvLyBJYmVuOiBHZXQgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBzZXNzaW9uIGFuZCB0aGUgbG9jYWwgc3RvcmFnZVxuXHRcdHdpbmRvd1NlcnZpY2UucnVuSW5Ccm93c2VyKCgpID0+IHtcblx0XHRcdHRoaXMuc2V0dXBTdG9yYWdlKHNlc3Npb25TdG9yYWdlLCB0aGlzLnNlc3Npb25TdG9yYWdlUmVjb3JkKTtcblx0XHRcdHRoaXMuc2V0dXBTdG9yYWdlKGxvY2FsU3RvcmFnZSwgdGhpcy5sb2NhbFN0b3JhZ2VSZWNvcmQpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgbG9jYWxTdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIG9ic2VydmFibGVzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxvY2FsU3RvcmFnZSgpOiBOZ3hTdG9yYWdlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0SXRlbTogPERhdGFUeXBlID0gYW55PihrZXk6IHN0cmluZykgPT4gdGhpcy5nZXRJdGVtPERhdGFUeXBlPihrZXksIGxvY2FsU3RvcmFnZSksXG5cdFx0XHRnZXRJdGVtT2JzZXJ2YWJsZTogPERhdGFUeXBlID0gYW55PihrZXk6IHN0cmluZykgPT5cblx0XHRcdFx0dGhpcy5nZXRJdGVtT2JzZXJ2YWJsZTxEYXRhVHlwZT4oa2V5LCB0aGlzLmxvY2FsU3RvcmFnZVJlY29yZCksXG5cdFx0XHRyZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+XG5cdFx0XHRcdHRoaXMucmVtb3ZlSXRlbShrZXksIGxvY2FsU3RvcmFnZSwgdGhpcy5sb2NhbFN0b3JhZ2VSZWNvcmQsICdsb2NhbCcpLFxuXHRcdFx0c2V0SXRlbTogPERhdGFUeXBlID0gYW55PihrZXk6IHN0cmluZywgaXRlbTogRGF0YVR5cGUpID0+XG5cdFx0XHRcdHRoaXMuc2V0SXRlbShrZXksIGl0ZW0sIGxvY2FsU3RvcmFnZSwgdGhpcy5sb2NhbFN0b3JhZ2VSZWNvcmQsICdsb2NhbCcpLFxuXHRcdFx0Y2xlYXI6ICgpID0+IHRoaXMuY2xlYXJTdG9yYWdlKGxvY2FsU3RvcmFnZSwgdGhpcy5sb2NhbFN0b3JhZ2VSZWNvcmQsICdsb2NhbCcpLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQSBzZXNzaW9uU3RvcmFnZSBpbXBsZW1lbnRhdGlvbiB1c2luZyBvYnNlcnZhYmxlc1xuXHQgKi9cblx0cHVibGljIGdldCBzZXNzaW9uU3RvcmFnZSgpOiBOZ3hTdG9yYWdlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0SXRlbTogPERhdGFUeXBlID0gYW55PihrZXk6IHN0cmluZykgPT4gdGhpcy5nZXRJdGVtPERhdGFUeXBlPihrZXksIHNlc3Npb25TdG9yYWdlKSxcblx0XHRcdGdldEl0ZW1PYnNlcnZhYmxlOiA8RGF0YVR5cGUgPSBhbnk+KGtleTogc3RyaW5nKSA9PlxuXHRcdFx0XHR0aGlzLmdldEl0ZW1PYnNlcnZhYmxlPERhdGFUeXBlPihrZXksIHRoaXMuc2Vzc2lvblN0b3JhZ2VSZWNvcmQpLFxuXHRcdFx0cmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PlxuXHRcdFx0XHR0aGlzLnJlbW92ZUl0ZW0oa2V5LCBzZXNzaW9uU3RvcmFnZSwgdGhpcy5zZXNzaW9uU3RvcmFnZVJlY29yZCwgJ3Nlc3Npb24nKSxcblx0XHRcdHNldEl0ZW06IDxEYXRhVHlwZSA9IGFueT4oa2V5OiBzdHJpbmcsIGl0ZW06IERhdGFUeXBlKSA9PlxuXHRcdFx0XHR0aGlzLnNldEl0ZW0oa2V5LCBpdGVtLCBzZXNzaW9uU3RvcmFnZSwgdGhpcy5zZXNzaW9uU3RvcmFnZVJlY29yZCwgJ3Nlc3Npb24nKSxcblx0XHRcdGNsZWFyOiAoKSA9PiB0aGlzLmNsZWFyU3RvcmFnZShzZXNzaW9uU3RvcmFnZSwgdGhpcy5zZXNzaW9uU3RvcmFnZVJlY29yZCwgJ3Nlc3Npb24nKSxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRJdGVtPERhdGFUeXBlID0gYW55PihrZXk6IHN0cmluZywgc3RvcmFnZTogU3RvcmFnZSk6IERhdGFUeXBlIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJzZVZhbHVlKHN0b3JhZ2UuZ2V0SXRlbShrZXkpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgdmVyc2lvbiBvZiB0aGUgc3RvcmFnZSB2YWx1ZVxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgc3RvcmFnZSB2YWx1ZVxuXHQgKiBAcGFyYW0gcmVjb3JkICAtIFRoZSBzdG9yYWdlIHJlY29yZFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJdGVtT2JzZXJ2YWJsZTxEYXRhVHlwZT4oXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0cmVjb3JkOiBOZ3hTdG9yYWdlUmVjb3JkXG5cdCk6IE9ic2VydmFibGU8RGF0YVR5cGU+IHtcblx0XHQvLyBJYmVuOiBSZXR1cm4gTkVWRVIgd2hlbiBub3QgaW4gYnJvd3NlclxuXHRcdGlmICghdGhpcy53aW5kb3dTZXJ2aWNlLmlzQnJvd3NlcigpKSB7XG5cdFx0XHRyZXR1cm4gTkVWRVI7XG5cdFx0fVxuXG5cdFx0Ly8gSWJlbjogSWYgdGhlIHN1YmplY3QgYWxyZWFkeSBleGlzdHMsIHdlIHJldHVybiB0aGUgb2JzZXJ2YWJsZVxuXHRcdGlmIChyZWNvcmRba2V5XSkge1xuXHRcdFx0cmV0dXJuIHJlY29yZFtrZXldLmFzT2JzZXJ2YWJsZSgpO1xuXHRcdH1cblxuXHRcdC8vIEliZW46IElmIG5vIHN1YmplY3QgZXhpdHMsIHdlIGNyZWF0ZSBhIG5ldyBvbmVcblx0XHRyZWNvcmRba2V5XSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVR5cGU+KHVuZGVmaW5lZCk7XG5cblx0XHQvLyBJYmVuOiBSZXR1cm4gdGhlIG9ic2VydmFibGVcblx0XHRyZXR1cm4gdGhpcy5nZXRJdGVtT2JzZXJ2YWJsZTxEYXRhVHlwZT4oa2V5LCByZWNvcmQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYW4gaXRlbSBpbiB0aGUgc3RvcmFnZVxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgaXRlbVxuXHQgKiBAcGFyYW0gaXRlbSAtIFRoZSBpdGVtIGluIHRoZSBzdG9yYWdlXG5cdCAqIEBwYXJhbSBzdG9yYWdlIC0gVGhlIHN0b3JhZ2UgaW4gd2hpY2ggd2Ugd2FudCB0byBzYXZlIHRoZSBpdGVtXG5cdCAqIEBwYXJhbSByZWNvcmQgLSBUaGUgY29ycmVzcG9uZGluZyBzdG9yYWdlIHJlY29yZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRJdGVtPERhdGFUeXBlID0gYW55Pihcblx0XHRrZXk6IHN0cmluZyxcblx0XHRpdGVtOiBEYXRhVHlwZSxcblx0XHRzdG9yYWdlOiBTdG9yYWdlLFxuXHRcdHJlY29yZDogTmd4U3RvcmFnZVJlY29yZCxcblx0XHR0eXBlOiBOZ3hTdG9yYWdlVHlwZVxuXHQpOiBOZ3hTdG9yYWdlU2V0RXZlbnQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEliZW46IEVhcmx5IGV4aXQgd2hlbiB3ZSdyZSBpbiB0aGUgYnJvd3NlclxuXHRcdGlmICghdGhpcy53aW5kb3dTZXJ2aWNlLmlzQnJvd3NlcigpKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEliZW46IENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHN1YmplY3QgZm9yIHRoaXMgaXRlbS4gSWYgbm90LCB3ZSBjcmVhdGUgb25lXG5cdFx0bGV0IHN1YmplY3QgPSByZWNvcmRba2V5XTtcblxuXHRcdGlmICghc3ViamVjdCkge1xuXHRcdFx0c3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVR5cGU+KHVuZGVmaW5lZCk7XG5cdFx0XHRzdG9yYWdlW2tleV0gPSBzdWJqZWN0O1xuXHRcdH1cblxuXHRcdC8vIEliZW46IFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdWJqZWN0XG5cdFx0Y29uc3Qgb2xkVmFsdWUgPSBzdWJqZWN0LmdldFZhbHVlKCk7XG5cblx0XHQvLyBJYmVuOiBTZXQgdGhlIGl0ZW0gaW4gdGhlIHN0b3JhZ2Vcblx0XHRzdG9yYWdlLnNldEl0ZW0oa2V5LCB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuXG5cdFx0Ly8gSWJlbjogVXBkYXRlIHRoZSBzdWJqZWN0IGluIHRoZSByZWNvcmRcblx0XHRzdWJqZWN0Lm5leHQoaXRlbSk7XG5cblx0XHQvLyBJYmVuOiBDcmVhdGUgdGhlIHN0b3JhZ2UgZXZlbnRcblx0XHRjb25zdCBldmVudDogTmd4U3RvcmFnZVNldEV2ZW50ID0ge1xuXHRcdFx0a2V5LFxuXHRcdFx0bmV3VmFsdWU6IGl0ZW0sXG5cdFx0XHRvbGRWYWx1ZSxcblx0XHRcdHN0b3JhZ2U6IHR5cGUsXG5cdFx0XHR0eXBlOiAnc2V0Jyxcblx0XHR9O1xuXG5cdFx0Ly8gSWJlbjogRW1pdCB0aGUgc3RvcmFnZSBldmVudFxuXHRcdHRoaXMuc3RvcmFnZUV2ZW50U3ViamVjdC5uZXh0KGV2ZW50KTtcblxuXHRcdC8vIEliZW46IFJldHVybiB0aGUgc3RvcmFnZSBldmVudFxuXHRcdHJldHVybiBldmVudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdG9yYWdlIGFuZCBlbWl0IGEgcmVtb3ZlIGV2ZW50XG5cdCAqXG5cdCAqIEBwYXJhbSAga2V5IC0gVGhlIGtleSBvZiB0aGUgaXRlbVxuXHQgKiBAcGFyYW0gc3RvcmFnZSAtIFRoZSBzdG9yYWdlIHdlIHdpc2ggdG8gcmVtb3ZlIHRoZSBpdGVtIGZyb21cblx0ICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgd2l0aCB0aGUgc3ViamVjdFxuXHQgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHN0b3JhZ2Vcblx0ICovXG5cdHByaXZhdGUgcmVtb3ZlSXRlbShcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdG9yYWdlOiBTdG9yYWdlLFxuXHRcdHJlY29yZDogTmd4U3RvcmFnZVJlY29yZCxcblx0XHR0eXBlOiBOZ3hTdG9yYWdlVHlwZVxuXHQpOiBOZ3hTdG9yYWdlUmVtb3ZlRXZlbnQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEliZW46IEVhcmx5IGV4aXQgd2hlbiB3ZSdyZSBub3QgaW4gdGhlIGJyb3dzZXJcblx0XHRpZiAoIXRoaXMud2luZG93U2VydmljZS5pc0Jyb3dzZXIoKSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBJYmVuOiBHZXQgdGhlIG9sZCBpdGVtXG5cdFx0Y29uc3Qgb2xkVmFsdWUgPSB0aGlzLnBhcnNlVmFsdWUoc3RvcmFnZS5nZXRJdGVtKGtleSkpO1xuXG5cdFx0Ly8gSWJlbjogUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHN0b3JhZ2Vcblx0XHRzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcblxuXHRcdC8vIEliZW4gVXBkYXRlIHRoZSBzdWJqZWN0IGlmIGl0IGV4aXN0c1xuXHRcdHJlY29yZFtrZXldPy5uZXh0KHVuZGVmaW5lZCk7XG5cblx0XHQvLyBJYmVuOiBDcmVhdGUgdGhlIGV2ZW50IGFuZCByZXR1cm4gYW5kIGVtaXQgaXRcblx0XHRjb25zdCBldmVudDogTmd4U3RvcmFnZVJlbW92ZUV2ZW50ID0ge1xuXHRcdFx0b2xkVmFsdWUsXG5cdFx0XHRzdG9yYWdlOiB0eXBlLFxuXHRcdFx0a2V5LFxuXHRcdFx0dHlwZTogJ3JlbW92ZScsXG5cdFx0fTtcblxuXHRcdHRoaXMuc3RvcmFnZUV2ZW50U3ViamVjdC5uZXh0KGV2ZW50KTtcblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXJzIHRoZSBzdG9yYWdlLCBjb21wbGV0ZXMgYWxsIHN1YmplY3RzIGFuZCBlbWl0cyBhIGNsZWFyIGV2ZW50XG5cdCAqXG5cdCAqIEBwYXJhbSBzdG9yYWdlIC0gVGhlIHN0b3JhZ2Ugd2Ugd2lzaCB0byBjbGVhclxuXHQgKiBAcGFyYW0gcmVjb3JkIC0gVGhlIHJlY29yZCB3aXRoIHRoZSBzdWJqZWN0c1xuXHQgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHN0b3JhZ2Vcblx0ICovXG5cdHByaXZhdGUgY2xlYXJTdG9yYWdlKFxuXHRcdHN0b3JhZ2U6IFN0b3JhZ2UsXG5cdFx0cmVjb3JkOiBOZ3hTdG9yYWdlUmVjb3JkLFxuXHRcdHR5cGU6IE5neFN0b3JhZ2VUeXBlXG5cdCk6IE5neFN0b3JhZ2VDbGVhckV2ZW50IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBJYmVuOiBFYXJseSBleGl0IHdoZW4gd2UncmUgbm90IGluIHRoZSBicm93c2VyXG5cdFx0aWYgKCF0aGlzLndpbmRvd1NlcnZpY2UuaXNCcm93c2VyKCkpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gSWJlbjogQ2xlYXIgdGhlIHN0b3JhZ2Vcblx0XHRzdG9yYWdlLmNsZWFyKCk7XG5cblx0XHQvLyBJYmVuOiBDbGVhciB0aGUgcmVjb3JkIGFuZCBjb21wbGV0ZSBhbGwgc3ViamVjdHNcblx0XHRPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHN1YmplY3RdKSA9PiB7XG5cdFx0XHRzdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcblx0XHRcdHN1YmplY3QuY29tcGxldGUoKTtcblxuXHRcdFx0cmVjb3JkW2tleV0gPSB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cblx0XHQvLyBJYmVuOiBDcmVhdGUgYW5kIGVtaXQgZXZlbnRcblx0XHRjb25zdCBldmVudDogTmd4U3RvcmFnZUNsZWFyRXZlbnQgPSB7XG5cdFx0XHR0eXBlOiAnY2xlYXInLFxuXHRcdFx0c3RvcmFnZTogdHlwZSxcblx0XHR9O1xuXG5cdFx0dGhpcy5zdG9yYWdlRXZlbnRTdWJqZWN0Lm5leHQoZXZlbnQpO1xuXG5cdFx0cmV0dXJuIGV2ZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdyYWJzIHRoZSBleGlzdGluZyBzdG9yYWdlIGFuZCB1cGRhdGVzIHRoZSByZWNvcmRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdG9yYWdlfSBzdG9yYWdlIC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0b3JhZ2Vcblx0ICogQHBhcmFtIHtOZ3hTdG9yYWdlUmVjb3JkfSByZWNvcmRcblx0ICogQG1lbWJlcm9mIE5neFN0b3JhZ2VTZXJ2aWNlXG5cdCAqL1xuXHRwcml2YXRlIHNldHVwU3RvcmFnZShzdG9yYWdlOiBTdG9yYWdlLCByZWNvcmQ6IE5neFN0b3JhZ2VSZWNvcmQpIHtcblx0XHRPYmplY3QuZW50cmllcyhzdG9yYWdlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRcdHJlY29yZFtrZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZXMgYSBzdHJpbmcgdmFsdWUgZnJvbSB0aGUgc3RvcmFnZSB0byBhbiBhY3R1YWwgdmFsdWVcblx0ICpcblx0ICogQHBhcmFtIHZhbHVlIC0gVGhlIHByb3ZpZGVkIHN0cmluZyB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBhbnkge1xuXHRcdC8vIEliZW46IElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIHRoZSB2YWx1ZVxuXHRcdGlmICghdmFsdWUpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHQvLyBJYmVuOiBJZiB0aGUgdmFsdWUgaXMgZWl0aGVyIHRydWUgb3IgZmFsc2UsIHJldHVybiBhIGJvb2xlYW4gdmVyc2lvbiBvZiB0aGUgdmFsdWVcblx0XHRpZiAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG5cdFx0fVxuXG5cdFx0Ly8gSWJlbjogSWYgdGhlIHZhbHVlIGlzIGEgbnVtYmVyLCByZXR1cm4gdGhlIHBhcnNlZCBudW1iZXJcblx0XHRpZiAodmFsdWUubWF0Y2goL15bMC05XSpbLC5dezAsMX1bMC05XSokLykpIHtcblx0XHRcdHJldHVybiBOdW1iZXIodmFsdWUpO1xuXHRcdH1cblxuXHRcdC8vIEliZW46IElmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QsIHJldHVybiB0aGUgcGFyc2VkIG9iamVjdFxuXHRcdGlmICh2YWx1ZS5tYXRjaCgveyguKjouKlssXXswLDF9KSp9LykpIHtcblx0XHRcdHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcblx0XHR9XG5cblx0XHQvLyBJYmVuOiBSZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBhcyBpc1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxufVxuIl19","import { Injectable, inject } from '@angular/core';\nimport { NgxWindowService } from '@ibenvandeveire/ngx-core';\nimport { filter, map, ReplaySubject } from 'rxjs';\nimport * as i0 from \"@angular/core\";\n/**\n * A service that can be used to track media queries and their changes. It exposes a method\n * to register media queries, which takes an array of tuples with the id of the media query\n * and the query itself. The service will then emit the id of the media query that has\n * changed when subscribed to the `getMatchingQuery$` method.\n */\nexport class NgxMediaQueryService {\n windowService = inject(NgxWindowService);\n /**\n * A map of media queries that are registered with the service.\n */\n queryListMap = new Map();\n /**\n * A map of the registered media queries with their id.\n */\n queryIdMap = new Map();\n /*\n * A map of listeners that are registered with the service.\n * They are saved to be able to remove them when the service is destroyed.\n */\n mediaQueryListenerMap = new Map();\n /**\n * A subject that emits the id of the media query that has changed.\n */\n queryChangedSubject = new ReplaySubject();\