ems-web-app-messages
Version:
This angular.io module includes a component and service that can be used to render "Growl" or "Snackbar" style in-app messages.
134 lines • 20.7 kB
JavaScript
import { Component, Input, HostListener, HostBinding } from '@angular/core';
import { MessageType, MessagePosition } from "./messages.enums";
import * as i0 from "@angular/core";
import * as i1 from "./messages.service";
import * as i2 from "@angular/platform-browser";
import * as i3 from "@angular/common";
export class MessagesComponent {
constructor(service, sanitizer) {
this.service = service;
this.sanitizer = sanitizer;
this.render = false;
this.classes = "";
this.background = "rgba(0,0,0,0.75)";
this.color = "#fff";
this.zIndex = 1000;
this.speed = 0.5;
this.queue = [];
this.timeout = 0;
this.onContainerClick = (element) => {
this.processMessageQueue(true);
};
}
ngOnInit() {
this.service.currentMessage.subscribe(message => {
if (!message && !this.currentMessage)
return;
if (!message)
this.processMessageQueue(true);
if (!this.validateMessage(message))
return;
this.queue.push(message);
this.processMessageQueue();
});
}
initializeStyles() {
if (!this.currentMessage)
return;
const duration = this.currentMessage.duration ?? 1;
const output = `messages {
background: ${this.background};
color: ${this.color};
transition-duration: ${this.speed}s;
z-index: ${this.zIndex};
}
messages.render {
transition-duration: ${this.speed}s;
}`;
this.styles = this.sanitizer.bypassSecurityTrustHtml(`<style>${output}</style>`);
}
async processMessageQueue(force = false) {
if (this.currentMessage && !force)
return;
await this.removeCurrentMessage();
this.currentMessage = this.queue.shift();
this.classes = `${this.currentMessage?.position} ${this.currentMessage?.type} ${this.currentMessage?.classes ?? ''}`;
await this.tick();
this.initializeStyles();
this.showNextMessage();
}
removeCurrentMessage() {
clearTimeout(this.timeout);
return new Promise((resolve) => {
if (!this.currentMessage) {
setTimeout(() => resolve());
}
else {
this.render = false;
setTimeout(() => resolve(), this.speed * 1000);
}
});
}
tick() {
return new Promise((resolve) => {
setTimeout(() => resolve(), this.speed * 1000);
});
}
showNextMessage() {
if (!this.currentMessage)
return;
setTimeout(() => this.render = true);
this.timeout = window.setTimeout(() => this.processMessageQueue(true), this.currentMessage.duration * 1000);
}
validateMessage(message) {
const growlPositions = [MessagePosition.BottomLeft, MessagePosition.BottomRight, MessagePosition.TopLeft, MessagePosition.TopRight];
const snackbarPositions = [MessagePosition.TopCenter, MessagePosition.BottomCenter];
if (!message)
return false;
if (message.type === MessageType.Growl && growlPositions.indexOf(message.position) === -1) {
throw new Error("Growl messages must use one of the following positions: MessagePosition.BottomLeft, MessagePosition.BottomRight, MessagePosition.TopLeft, MessagePosition.TopRight");
return false;
}
if (message.type === MessageType.Snackbar && snackbarPositions.indexOf(message.position) === -1) {
throw new Error("Snackbar messages must use one of the following positions: MessagePosition.TopCenter, MessagePosition.BottomCenter");
return false;
}
return true;
}
}
MessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesComponent, deps: [{ token: i1.MessagesService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
MessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MessagesComponent, selector: "messages", inputs: { background: "background", color: "color", zIndex: ["z-index", "zIndex"], speed: ["transition-speed", "speed"] }, host: { listeners: { "click": "onContainerClick($event.target)" }, properties: { "class.render": "this.render", "class": "this.classes" } }, ngImport: i0, template: `
<ng-container *ngTemplateOutlet="currentMessage?.template ?? null"></ng-container>
<div *ngIf="!currentMessage?.template" [attr.role]="currentMessage ? 'alert':'generic'" class="message-text" [innerHtml]="sanitizer.bypassSecurityTrustHtml(currentMessage?.message || ' ')"></div>
<div class="style-container" [innerHtml]="styles"></div>
`, isInline: true, styles: [":host{position:fixed;transition-property:all;border-radius:.5rem;box-sizing:border-box;padding:1rem;opacity:0;pointer-events:none}:host.growl{width:20rem}:host.snackbar{width:20rem}@media only screen and (min-width: 768px){:host.snackbar{width:40rem}}:host.growl.top.right{top:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem))}:host.growl.top.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.top.left{top:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.top.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.left{bottom:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.bottom.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.right{bottom:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem));opacity:0}:host.growl.bottom.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.top.center{top:2rem;box-sizing:border-box;transform:translateY(calc(-100% - 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.top.center{left:calc(50% - 20rem)}}:host.snackbar.top.center.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.bottom.center{bottom:2rem;box-sizing:border-box;transform:translateY(calc(100% + 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.bottom.center{left:calc(50% - 20rem)}}:host.snackbar.bottom.center.render{opacity:1;transform:translate(0);pointer-events:auto}\n"], directives: [{ type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesComponent, decorators: [{
type: Component,
args: [{ selector: 'messages', template: `
<ng-container *ngTemplateOutlet="currentMessage?.template ?? null"></ng-container>
<div *ngIf="!currentMessage?.template" [attr.role]="currentMessage ? 'alert':'generic'" class="message-text" [innerHtml]="sanitizer.bypassSecurityTrustHtml(currentMessage?.message || ' ')"></div>
<div class="style-container" [innerHtml]="styles"></div>
`, styles: [":host{position:fixed;transition-property:all;border-radius:.5rem;box-sizing:border-box;padding:1rem;opacity:0;pointer-events:none}:host.growl{width:20rem}:host.snackbar{width:20rem}@media only screen and (min-width: 768px){:host.snackbar{width:40rem}}:host.growl.top.right{top:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem))}:host.growl.top.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.top.left{top:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.top.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.left{bottom:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.bottom.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.right{bottom:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem));opacity:0}:host.growl.bottom.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.top.center{top:2rem;box-sizing:border-box;transform:translateY(calc(-100% - 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.top.center{left:calc(50% - 20rem)}}:host.snackbar.top.center.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.bottom.center{bottom:2rem;box-sizing:border-box;transform:translateY(calc(100% + 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.bottom.center{left:calc(50% - 20rem)}}:host.snackbar.bottom.center.render{opacity:1;transform:translate(0);pointer-events:auto}\n"] }]
}], ctorParameters: function () { return [{ type: i1.MessagesService }, { type: i2.DomSanitizer }]; }, propDecorators: { render: [{
type: HostBinding,
args: ['class.render']
}], classes: [{
type: HostBinding,
args: ['class']
}], background: [{
type: Input,
args: ["background"]
}], color: [{
type: Input,
args: ["color"]
}], zIndex: [{
type: Input,
args: ["z-index"]
}], speed: [{
type: Input,
args: ["transition-speed"]
}], onContainerClick: [{
type: HostListener,
args: ['click', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZXNzYWdlcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQWFoRSxNQUFNLE9BQU8saUJBQWlCO0lBZ0I1QixZQUFvQixPQUF3QixFQUFTLFNBQXVCO1FBQXhELFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBYztRQWQvQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQy9CLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFXLGtCQUFrQixDQUFDO1FBQzdDLFVBQUssR0FBVyxNQUFNLENBQUM7UUFDckIsV0FBTSxHQUFXLElBQUksQ0FBQztRQUNiLFVBQUssR0FBVyxHQUFHLENBQUM7UUFLeEMsVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUV0QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBZTVCLHFCQUFnQixHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUE7SUFmK0UsQ0FBQztJQUVqRixRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzlDLElBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBQzVDLElBQUcsQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFHLENBQUMsSUFBSSxD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QUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBIb3N0TGlzdGVuZXIsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSwgTWVzc2FnZVBvc2l0aW9uIH0gZnJvbSBcIi4vbWVzc2FnZXMuZW51bXNcIjtcbmltcG9ydCB7IElNZXNzYWdlIH0gZnJvbSBcIi4vbWVzc2FnZXMuaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTWVzc2FnZXNTZXJ2aWNlIH0gZnJvbSBcIi4vbWVzc2FnZXMuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZXNzYWdlcycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1cnJlbnRNZXNzYWdlPy50ZW1wbGF0ZSA/PyBudWxsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cIiFjdXJyZW50TWVzc2FnZT8udGVtcGxhdGVcIiBbYXR0ci5yb2xlXT1cImN1cnJlbnRNZXNzYWdlID8gJ2FsZXJ0JzonZ2VuZXJpYydcIiBjbGFzcz1cIm1lc3NhZ2UtdGV4dFwiIFtpbm5lckh0bWxdPVwic2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGN1cnJlbnRNZXNzYWdlPy5tZXNzYWdlIHx8ICcgJylcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic3R5bGUtY29udGFpbmVyXCIgW2lubmVySHRtbF09XCJzdHlsZXNcIj48L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbICcuL21lc3NhZ2VzLmNvbXBvbmVudC5sZXNzJyBdXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0ICB7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5yZW5kZXInKSByZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzZXM6IHN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dChcImJhY2tncm91bmRcIikgYmFja2dyb3VuZDogc3RyaW5nID0gXCJyZ2JhKDAsMCwwLDAuNzUpXCI7XG4gIEBJbnB1dChcImNvbG9yXCIpIGNvbG9yOiBzdHJpbmcgPSBcIiNmZmZcIjtcbiAgQElucHV0KFwiei1pbmRleFwiKSB6SW5kZXg6IG51bWJlciA9IDEwMDA7XG4gIEBJbnB1dChcInRyYW5zaXRpb24tc3BlZWRcIikgc3BlZWQ6IG51bWJlciA9IDAuNTtcblxuXG4gIHB1YmxpYyBzdHlsZXMhOiBTYWZlSHRtbDtcbiAgcHVibGljIGN1cnJlbnRNZXNzYWdlPzogSU1lc3NhZ2U7XG4gIHB1YmxpYyBxdWV1ZTogSU1lc3NhZ2VbXSA9IFtdO1xuXG4gIHByaXZhdGUgdGltZW91dDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IE1lc3NhZ2VzU2VydmljZSwgcHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UuY3VycmVudE1lc3NhZ2Uuc3Vic2NyaWJlKG1lc3NhZ2UgPT4ge1xuICAgICAgaWYoIW1lc3NhZ2UgJiYgIXRoaXMuY3VycmVudE1lc3NhZ2UpIHJldHVybjtcbiAgICAgIGlmKCFtZXNzYWdlKSB0aGlzLnByb2Nlc3NNZXNzYWdlUXVldWUodHJ1ZSk7XG4gICAgICBpZighdGhpcy52YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSEpKSByZXR1cm47XG4gICAgICB0aGlzLnF1ZXVlLnB1c2gobWVzc2FnZSEpO1xuICAgICAgdGhpcy5wcm9jZXNzTWVzc2FnZVF1ZXVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICBvbkNvbnRhaW5lckNsaWNrID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgdGhpcy5wcm9jZXNzTWVzc2FnZVF1ZXVlKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3R5bGVzKCkge1xuICAgIGlmKCF0aGlzLmN1cnJlbnRNZXNzYWdlKSByZXR1cm47XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmN1cnJlbnRNZXNzYWdlLmR1cmF0aW9uID8/IDE7XG4gICAgY29uc3Qgb3V0cHV0ID0gYG1lc3NhZ2VzIHsgXG4gICAgICBiYWNrZ3JvdW5kOiAke3RoaXMuYmFja2dyb3VuZH07IFxuICAgICAgY29sb3I6ICR7dGhpcy5jb2xvcn07IFxuICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJHt0aGlzLnNwZWVkfXM7IFxuICAgICAgei1pbmRleDogJHt0aGlzLnpJbmRleH07XG4gICAgfSBcbiAgICBtZXNzYWdlcy5yZW5kZXIge1xuICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJHt0aGlzLnNwZWVkfXM7XG4gICAgfWA7XG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChgPHN0eWxlPiR7b3V0cHV0fTwvc3R5bGU+YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNZXNzYWdlUXVldWUoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmKHRoaXMuY3VycmVudE1lc3NhZ2UgJiYgIWZvcmNlKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5yZW1vdmVDdXJyZW50TWVzc2FnZSgpO1xuICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgdGhpcy5jbGFzc2VzID0gYCR7dGhpcy5jdXJyZW50TWVzc2FnZT8ucG9zaXRpb259ICR7dGhpcy5jdXJyZW50TWVzc2FnZT8udHlwZX0gJHt0aGlzLmN1cnJlbnRNZXNzYWdlPy5jbGFzc2VzID8/ICcnfWA7XG4gICAgYXdhaXQgdGhpcy50aWNrKCk7XG4gICAgdGhpcy5pbml0aWFsaXplU3R5bGVzKCk7XG4gICAgdGhpcy5zaG93TmV4dE1lc3NhZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ3VycmVudE1lc3NhZ2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IChtZXNzYWdlPzogSU1lc3NhZ2UpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmKCF0aGlzLmN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCB0aGlzLnNwZWVkICogMTAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRpY2soKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiAobWVzc2FnZT86IElNZXNzYWdlKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCB0aGlzLnNwZWVkICogMTAwMCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dOZXh0TWVzc2FnZSgpIHtcbiAgICBpZighdGhpcy5jdXJyZW50TWVzc2FnZSkgcmV0dXJuO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW5kZXIgPSB0cnVlKTtcbiAgICB0aGlzLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnByb2Nlc3NNZXNzYWdlUXVldWUodHJ1ZSksIHRoaXMuY3VycmVudE1lc3NhZ2UuZHVyYXRpb24gKiAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVNZXNzYWdlKG1lc3NhZ2U6IElNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3Jvd2xQb3NpdGlvbnMgPSBbTWVzc2FnZVBvc2l0aW9uLkJvdHRvbUxlZnQsIE1lc3NhZ2VQb3NpdGlvbi5Cb3R0b21SaWdodCwgTWVzc2FnZVBvc2l0aW9uLlRvcExlZnQsIE1lc3NhZ2VQb3NpdGlvbi5Ub3BSaWdodF07XG4gICAgY29uc3Qgc25hY2tiYXJQb3NpdGlvbnMgPSBbTWVzc2FnZVBvc2l0aW9uLlRvcENlbnRlciwgTWVzc2FnZVBvc2l0aW9uLkJvdHRvbUNlbnRlcl07XG4gICAgaWYoIW1lc3NhZ2UpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBpZihtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLkdyb3dsICYmIGdyb3dsUG9zaXRpb25zLmluZGV4T2YobWVzc2FnZS5wb3NpdGlvbikgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHcm93bCBtZXNzYWdlcyBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6IE1lc3NhZ2VQb3NpdGlvbi5Cb3R0b21MZWZ0LCBNZXNzYWdlUG9zaXRpb24uQm90dG9tUmlnaHQsIE1lc3NhZ2VQb3NpdGlvbi5Ub3BMZWZ0LCBNZXNzYWdlUG9zaXRpb24uVG9wUmlnaHRcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZihtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLlNuYWNrYmFyICYmIHNuYWNrYmFyUG9zaXRpb25zLmluZGV4T2YobWVzc2FnZS5wb3NpdGlvbikgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTbmFja2JhciBtZXNzYWdlcyBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6IE1lc3NhZ2VQb3NpdGlvbi5Ub3BDZW50ZXIsIE1lc3NhZ2VQb3NpdGlvbi5Cb3R0b21DZW50ZXJcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19