ngx-dynamic-hooks
Version:
Automatically insert live Angular components into a dynamic string of content (based on their selector or any pattern of your choice) and render the result in the DOM.
126 lines • 16.9 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { getParseOptionDefaults } from '../../public-api';
import * as i0 from "@angular/core";
import * as i1 from "../services/dynamicHooksService";
import * as i2 from "../services/core/componentUpdater";
import * as i3 from "../services/platform/autoPlatformService";
/**
* The main component of the ngx-dynamic-hooks library to dynamically load components into content
*/
export class DynamicHooksComponent {
constructor(hostElement, dynamicHooksService, componentUpdater, platformService, environmentInjector, injector) {
this.hostElement = hostElement;
this.dynamicHooksService = dynamicHooksService;
this.componentUpdater = componentUpdater;
this.platformService = platformService;
this.environmentInjector = environmentInjector;
this.injector = injector;
this.content = null;
this.context = null;
this.globalParsersBlacklist = null;
this.globalParsersWhitelist = null;
this.parsers = null;
this.options = null;
this.componentsLoaded = new EventEmitter();
this.hookIndex = {};
this.activeOptions = getParseOptionDefaults();
this.activeParsers = [];
this.token = Math.random().toString(36).substring(2, 12);
this.initialized = false;
}
ngDoCheck() {
// Update bindings on every change detection run?
if (!this.activeOptions.updateOnPushOnly) {
this.refresh(false);
}
}
ngOnChanges(changes) {
// If text or options change, reset and parse from scratch
if (changes.hasOwnProperty('content') ||
changes.hasOwnProperty('globalParsersBlacklist') ||
changes.hasOwnProperty('globalParsersWhitelist') ||
changes.hasOwnProperty('parsers') ||
changes.hasOwnProperty('options')) {
this.reset();
this.parse(this.content);
// If only context changed, just refresh hook inputs/outputs
}
else if (changes.hasOwnProperty('context')) {
this.refresh(true);
}
}
ngAfterViewInit() {
}
ngAfterViewChecked() {
}
ngOnDestroy() {
this.reset();
}
// ----------------------------------------------------------------------
/**
* Empties the state of this component
*/
reset() {
this.dynamicHooksService.destroy(this.hookIndex);
// Reset state
this.platformService.setInnerContent(this.hostElement.nativeElement, '');
this.hookIndex = {};
this.activeOptions = getParseOptionDefaults();
this.activeParsers = [];
this.initialized = false;
}
/**
* Parses the content and load components
*
* @param content - The content to parse
*/
parse(content) {
this.dynamicHooksService.parse(content, this.parsers, this.context, this.options, this.globalParsersBlacklist, this.globalParsersWhitelist, this.hostElement.nativeElement, this.hookIndex, this.environmentInjector, this.injector).subscribe((parseResult) => {
// hostElement and hookIndex are automatically filled
this.activeParsers = parseResult.usedParsers;
this.activeOptions = parseResult.usedOptions;
this.initialized = true;
// Return all loaded components
const loadedComponents = Object.values(this.hookIndex).map((hook) => {
return {
hookId: hook.id,
hookValue: hook.value,
hookParser: hook.parser,
componentRef: hook.componentRef
};
});
this.componentsLoaded.emit(loadedComponents);
});
}
/**
* Updates the bindings for all existing components
*
* @param triggerOnDynamicChanges - Whether to trigger the OnDynamicChanges method of dynamically loaded components
*/
refresh(triggerOnDynamicChanges) {
if (this.initialized) {
this.componentUpdater.refresh(this.hookIndex, this.context, this.activeOptions, triggerOnDynamicChanges);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksComponent, deps: [{ token: i0.ElementRef }, { token: i1.DynamicHooksService }, { token: i2.ComponentUpdater }, { token: i3.AutoPlatformService }, { token: i0.EnvironmentInjector }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DynamicHooksComponent, isStandalone: true, selector: "ngx-dynamic-hooks", inputs: { content: "content", context: "context", globalParsersBlacklist: "globalParsersBlacklist", globalParsersWhitelist: "globalParsersWhitelist", parsers: "parsers", options: "options" }, outputs: { componentsLoaded: "componentsLoaded" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-dynamic-hooks', template: '', standalone: true }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DynamicHooksService }, { type: i2.ComponentUpdater }, { type: i3.AutoPlatformService }, { type: i0.EnvironmentInjector }, { type: i0.Injector }], propDecorators: { content: [{
type: Input
}], context: [{
type: Input
}], globalParsersBlacklist: [{
type: Input
}], globalParsersWhitelist: [{
type: Input
}], parsers: [{
type: Input
}], options: [{
type: Input
}], componentsLoaded: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY0hvb2tzQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtaG9va3Mvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWNIb29rc0NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFvQyxLQUFLLEVBQW9ELE1BQU0sRUFBRSxZQUFZLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBTzNOLE9BQU8sRUFBZ0Isc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7QUFFeEU7O0dBRUc7QUFPSCxNQUFNLE9BQU8scUJBQXFCO0lBY2hDLFlBQ1UsV0FBdUIsRUFDdkIsbUJBQXdDLEVBQ3hDLGdCQUFrQyxFQUNsQyxlQUFvQyxFQUNwQyxtQkFBd0MsRUFDeEMsUUFBa0I7UUFMbEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG9CQUFlLEdBQWYsZUFBZSxDQUFxQjtRQUNwQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFuQm5CLFlBQU8sR0FBUSxJQUFJLENBQUM7UUFDcEIsWUFBTyxHQUFRLElBQUksQ0FBQztRQUNwQiwyQkFBc0IsR0FBa0IsSUFBSSxDQUFDO1FBQzdDLDJCQUFzQixHQUFrQixJQUFJLENBQUM7UUFDN0MsWUFBTyxHQUEyQixJQUFJLENBQUM7UUFDdkMsWUFBTyxHQUFzQixJQUFJLENBQUM7UUFDakMscUJBQWdCLEdBQW9DLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakYsY0FBUyxHQUFjLEVBQUUsQ0FBQztRQUMxQixrQkFBYSxHQUFpQixzQkFBc0IsRUFBRSxDQUFDO1FBQ3ZELGtCQUFhLEdBQWlCLEVBQUUsQ0FBQztRQUNqQyxV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LEtBQUs7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFhO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyx1QkFBZ0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNHLENBQUM7SUFDSCxDQUFDOytHQXhIVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixxVkFKdEIsRUFBRTs7NEZBSUQscUJBQXFCO2tCQU5qQyxTQUFTOytCQUNFLG1CQUFtQixZQUNuQixFQUFFLGNBQ0EsSUFBSTsyT0FJUCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJbnB1dCwgT25DaGFuZ2VzLCBFbGVtZW50UmVmLCBEb0NoZWNrLCBBZnRlclZpZXdDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE9wdGlvbmFsLCBJbmplY3QsIFNpbXBsZUNoYW5nZXMsIEVudmlyb25tZW50SW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhvb2tJbmRleCwgSG9vaywgUGFyc2VSZXN1bHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzUHVibGljJztcbmltcG9ydCB7IEhvb2tQYXJzZXIsIExvYWRlZENvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXNQdWJsaWMnO1xuaW1wb3J0IHsgRHluYW1pY0hvb2tzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2R5bmFtaWNIb29rc1NlcnZpY2UnO1xuaW1wb3J0IHsgSG9va1BhcnNlckVudHJ5IH0gZnJvbSAnLi4vc2VydmljZXMvc2V0dGluZ3MvcGFyc2VyRW50cnknO1xuaW1wb3J0IHsgQ29tcG9uZW50VXBkYXRlciB9IGZyb20gJy4uL3NlcnZpY2VzL2NvcmUvY29tcG9uZW50VXBkYXRlcic7XG5pbXBvcnQgeyBBdXRvUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0vYXV0b1BsYXRmb3JtU2VydmljZSc7XG5pbXBvcnQgeyBQYXJzZU9wdGlvbnMsIGdldFBhcnNlT3B0aW9uRGVmYXVsdHMgfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcblxuLyoqXG4gKiBUaGUgbWFpbiBjb21wb25lbnQgb2YgdGhlIG5neC1keW5hbWljLWhvb2tzIGxpYnJhcnkgdG8gZHluYW1pY2FsbHkgbG9hZCBjb21wb25lbnRzIGludG8gY29udGVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZHluYW1pYy1ob29rcycsXG4gIHRlbXBsYXRlOiAnJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc3R5bGVzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljSG9va3NDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIGdsb2JhbFBhcnNlcnNCbGFja2xpc3Q6IHN0cmluZ1tdfG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBnbG9iYWxQYXJzZXJzV2hpdGVsaXN0OiBzdHJpbmdbXXxudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcGFyc2VyczogSG9va1BhcnNlckVudHJ5W118bnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFBhcnNlT3B0aW9uc3xudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIGNvbXBvbmVudHNMb2FkZWQ6IEV2ZW50RW1pdHRlcjxMb2FkZWRDb21wb25lbnRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGhvb2tJbmRleDogSG9va0luZGV4ID0ge307XG4gIGFjdGl2ZU9wdGlvbnM6IFBhcnNlT3B0aW9ucyA9IGdldFBhcnNlT3B0aW9uRGVmYXVsdHMoKTtcbiAgYWN0aXZlUGFyc2VyczogSG9va1BhcnNlcltdID0gW107XG4gIHRva2VuID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDEyKTtcbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZHluYW1pY0hvb2tzU2VydmljZTogRHluYW1pY0hvb2tzU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudFVwZGF0ZXI6IENvbXBvbmVudFVwZGF0ZXIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybVNlcnZpY2U6IEF1dG9QbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge1xuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBiaW5kaW5ncyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bj9cbiAgICBpZiAoIXRoaXMuYWN0aXZlT3B0aW9ucy51cGRhdGVPblB1c2hPbmx5KSB7XG4gICAgICB0aGlzLnJlZnJlc2goZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBJZiB0ZXh0IG9yIG9wdGlvbnMgY2hhbmdlLCByZXNldCBhbmQgcGFyc2UgZnJvbSBzY3JhdGNoXG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnY29udGVudCcpIHx8XG4gICAgICBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdnbG9iYWxQYXJzZXJzQmxhY2tsaXN0JykgfHxcbiAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2dsb2JhbFBhcnNlcnNXaGl0ZWxpc3QnKSB8fFxuICAgICAgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgncGFyc2VycycpIHx8XG4gICAgICBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdvcHRpb25zJylcbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMucGFyc2UodGhpcy5jb250ZW50KTtcblxuICAgIC8vIElmIG9ubHkgY29udGV4dCBjaGFuZ2VkLCBqdXN0IHJlZnJlc2ggaG9vayBpbnB1dHMvb3V0cHV0c1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpKSB7XG4gICAgICB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIHRoZSBzdGF0ZSBvZiB0aGlzIGNvbXBvbmVudFxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5keW5hbWljSG9va3NTZXJ2aWNlLmRlc3Ryb3kodGhpcy5ob29rSW5kZXgpO1xuXG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICB0aGlzLnBsYXRmb3JtU2VydmljZS5zZXRJbm5lckNvbnRlbnQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAnJyk7XG4gICAgdGhpcy5ob29rSW5kZXggPSB7fTtcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbnMgPSBnZXRQYXJzZU9wdGlvbkRlZmF1bHRzKCk7XG4gICAgdGhpcy5hY3RpdmVQYXJzZXJzID0gW107XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgY29udGVudCBhbmQgbG9hZCBjb21wb25lbnRzXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgdG8gcGFyc2VcbiAgICovXG4gIHBhcnNlKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZHluYW1pY0hvb2tzU2VydmljZS5wYXJzZShcbiAgICAgIGNvbnRlbnQsXG4gICAgICB0aGlzLnBhcnNlcnMsXG4gICAgICB0aGlzLmNvbnRleHQsXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLmdsb2JhbFBhcnNlcnNCbGFja2xpc3QsXG4gICAgICB0aGlzLmdsb2JhbFBhcnNlcnNXaGl0ZWxpc3QsXG4gICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmhvb2tJbmRleCxcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgIHRoaXMuaW5qZWN0b3JcbiAgICApLnN1YnNjcmliZSgocGFyc2VSZXN1bHQ6IFBhcnNlUmVzdWx0KSA9PiB7XG4gICAgICAvLyBob3N0RWxlbWVudCBhbmQgaG9va0luZGV4IGFyZSBhdXRvbWF0aWNhbGx5IGZpbGxlZFxuICAgICAgdGhpcy5hY3RpdmVQYXJzZXJzID0gcGFyc2VSZXN1bHQudXNlZFBhcnNlcnM7XG4gICAgICB0aGlzLmFjdGl2ZU9wdGlvbnMgPSBwYXJzZVJlc3VsdC51c2VkT3B0aW9ucztcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAvLyBSZXR1cm4gYWxsIGxvYWRlZCBjb21wb25lbnRzXG4gICAgICBjb25zdCBsb2FkZWRDb21wb25lbnRzOiBMb2FkZWRDb21wb25lbnRbXSA9IE9iamVjdC52YWx1ZXModGhpcy5ob29rSW5kZXgpLm1hcCgoaG9vazogSG9vaykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhvb2tJZDogaG9vay5pZCxcbiAgICAgICAgICBob29rVmFsdWU6IGhvb2sudmFsdWUsXG4gICAgICAgICAgaG9va1BhcnNlcjogaG9vay5wYXJzZXIsXG4gICAgICAgICAgY29tcG9uZW50UmVmOiBob29rLmNvbXBvbmVudFJlZiFcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVkLmVtaXQobG9hZGVkQ29tcG9uZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgYmluZGluZ3MgZm9yIGFsbCBleGlzdGluZyBjb21wb25lbnRzXG4gICAqXG4gICAqIEBwYXJhbSB0cmlnZ2VyT25EeW5hbWljQ2hhbmdlcyAtIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgT25EeW5hbWljQ2hhbmdlcyBtZXRob2Qgb2YgZHluYW1pY2FsbHkgbG9hZGVkIGNvbXBvbmVudHNcbiAgICovXG4gIHJlZnJlc2godHJpZ2dlck9uRHluYW1pY0NoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5jb21wb25lbnRVcGRhdGVyLnJlZnJlc2godGhpcy5ob29rSW5kZXgsIHRoaXMuY29udGV4dCwgdGhpcy5hY3RpdmVPcHRpb25zLCB0cmlnZ2VyT25EeW5hbWljQ2hhbmdlcyk7XG4gICAgfVxuICB9XG59XG4iXX0=