ngx-message-bus
Version:
Messaging system for angular 11.x application. It allows communication between components and modules. Direct messages, messages by types and broadcasting.
129 lines • 19.3 kB
JavaScript
import { ErrorHandlingEnum } from './error-handling.enum';
export class Hub {
constructor(hubName, errorHanndling) {
this.errorHanndling = errorHanndling;
this.subscribers = [];
this.listeners = [];
this.broadcastListeners = [];
this.hubName = hubName;
}
connect(connection) {
this.subscribers.push(connection);
}
disconnect(connection) {
if (!this.subscribers || this.subscribers.length === 0) {
return;
}
const subscriberIndex = this.subscribers.findIndex(sub => sub.getSubscriberId() === connection.getSubscriberId());
if (subscriberIndex >= 0) {
this.subscribers.splice(subscriberIndex, 1);
}
if (this.isAnyListener()) {
let listenerIndex = -1;
while ((listenerIndex = this.listeners.findIndex(l => l.subscriberId.toString() === connection.getSubscriberId())) >= 0) {
this.listeners.splice(listenerIndex, 1);
}
}
if (this.isAnyBroadcastListener()) {
let broadcastListenerIndex = -1;
while ((broadcastListenerIndex = this.broadcastListeners
.findIndex(l => l.subscriberId.toString() === connection.getSubscriberId())) >= 0) {
this.broadcastListeners.splice(broadcastListenerIndex, 1);
}
}
}
getActiveConnections() {
return this.subscribers.length;
}
addListener(listener) {
if (!this.listeners.find(l => l.subscriberId.toString() === listener.subscriberId.toString()
&& l.groupId.toString() === listener.groupId.toString())) {
this.listeners.push(listener);
}
}
addBroadcastListener(listener) {
if (!this.broadcastListeners.find(l => l.subscriberId.toString() === listener.subscriberId.toString())) {
this.broadcastListeners.push(listener);
}
}
removeListener(listener) {
if (!this.isAnyListener()) {
return;
}
const listenerToRemoveIndex = this.listeners
.findIndex(l => l.subscriberId.toString() === listener.subscriberId.toString()
&& l.groupId.toString() === listener.groupId.toString());
if (listenerToRemoveIndex > -1) {
this.listeners.splice(listenerToRemoveIndex, 1);
}
}
removeBroadcastListener(subscriberId) {
if (!this.isAnyBroadcastListener()) {
return;
}
const listenerToRemoveIndex = this.broadcastListeners
.findIndex(listener => listener.subscriberId.toString() === subscriberId.toString());
if (listenerToRemoveIndex > -1) {
this.broadcastListeners.splice(listenerToRemoveIndex, 1);
}
}
getHubName() {
return this.hubName;
}
post(message) {
if (!this.isAnyListener() && message) {
return;
}
let recipients = this.listeners;
if (!message.recipientIds || message.recipientIds.indexOf(message.publisherId.toString()) < 0) {
recipients = recipients.filter(l => l.subscriberId.toString() !== message.publisherId.toString());
}
if (message.recipientIds && message.recipientIds.length > 0) {
recipients = recipients.filter(sub => message.recipientIds.indexOf(sub.subscriberId.toString()) >= 0);
}
if (message.groupId && message.groupId.length > 0) {
recipients = recipients.filter(sub => sub.groupId.toString() === message.groupId.toString());
}
if (!recipients || recipients.length === 0) {
return;
}
recipients.forEach(recipient => {
try {
recipient.callback(message.payload);
}
catch (e) {
switch (this.errorHanndling) {
case ErrorHandlingEnum.Log:
console.error(e);
break;
case ErrorHandlingEnum.Throw:
throw e;
case ErrorHandlingEnum.None:
default:
break;
}
}
});
}
broadcast(message) {
if (!this.isAnyBroadcastListener()) {
return;
}
this.broadcastListeners
.filter(listener => listener.subscriberId.toString() !== message.publisherId.toString())
.forEach(listener => listener.callback(message.payload));
}
dispose() {
this.subscribers = null;
this.broadcastListeners = null;
this.hubName = null;
this.listeners = null;
}
isAnyListener() {
return this.listeners && this.listeners.length > 0;
}
isAnyBroadcastListener() {
return this.broadcastListeners && this.broadcastListeners.length > 0;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLyIsInNvdXJjZXMiOlsic3JjL2h1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUsxRCxNQUFNLE9BQU8sR0FBRztJQU1SLFlBQVksT0FBZSxFQUNmLGNBQWlDO1FBQWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPLENBQUMsVUFBc0I7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxVQUFzQjtRQUM3QixJQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkQsT0FBTztTQUNWO1FBQ0QsTUFBTSxlQUFlLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDMUgsSUFBRyxlQUFlLElBQUksQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvQztRQUNELElBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3JCLElBQUksYUFBYSxHQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFD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SSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFTyxhQUFhO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFcnJvckhhbmRsaW5nRW51bSB9IGZyb20gJy4vZXJyb3ItaGFuZGxpbmcuZW51bSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4vY29ubmVjdGlvblwiO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gXCIuL21lc3NhZ2VcIjtcbmltcG9ydCB7IExpc3RlbmVyIH0gZnJvbSBcIi4vbGlzdGVuZXJcIjtcblxuZXhwb3J0IGNsYXNzIEh1YiB7XG4gICAgICAgIHByaXZhdGUgaHViTmFtZTogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHN1YnNjcmliZXJzOiBDb25uZWN0aW9uW107XG4gICAgICAgIHByaXZhdGUgbGlzdGVuZXJzOiBMaXN0ZW5lcltdO1xuICAgICAgICBwcml2YXRlIGJyb2FkY2FzdExpc3RlbmVyczogTGlzdGVuZXJbXTtcblxuICAgICAgICBjb25zdHJ1Y3RvcihodWJOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICBwcml2YXRlIGVycm9ySGFubmRsaW5nOiBFcnJvckhhbmRsaW5nRW51bSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0TGlzdGVuZXJzID0gW107XG4gICAgICAgICAgICB0aGlzLmh1Yk5hbWUgPSBodWJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgY29ubmVjdChjb25uZWN0aW9uOiBDb25uZWN0aW9uKTp2b2lkIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc2Nvbm5lY3QoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6dm9pZCB7XG4gICAgICAgICAgICBpZighdGhpcy5zdWJzY3JpYmVycyB8fCB0aGlzLnN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmliZXJJbmRleDogbnVtYmVyID0gdGhpcy5zdWJzY3JpYmVycy5maW5kSW5kZXgoc3ViID0+IHN1Yi5nZXRTdWJzY3JpYmVySWQoKSA9PT0gY29ubmVjdGlvbi5nZXRTdWJzY3JpYmVySWQoKSk7XG4gICAgICAgICAgICBpZihzdWJzY3JpYmVySW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuc3BsaWNlKHN1YnNjcmliZXJJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmlzQW55TGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgICAgIGxldCBsaXN0ZW5lckluZGV4OiBudW1iZXIgPSAtMTtcbiAgICAgICAgICAgICAgICB3aGlsZSggKGxpc3RlbmVySW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgobCA9PiBsLnN1YnNjcmliZXJJZC50b1N0cmluZygpID09PSBjb25uZWN0aW9uLmdldFN1YnNjcmliZXJJZCgpKSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UobGlzdGVuZXJJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZih0aGlzLmlzQW55QnJvYWRjYXN0TGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgICAgIGxldCBicm9hZGNhc3RMaXN0ZW5lckluZGV4OiBudW1iZXIgPSAtMTtcbiAgICAgICAgICAgICAgICB3aGlsZSggKGJyb2FkY2FzdExpc3RlbmVySW5kZXggPSB0aGlzLmJyb2FkY2FzdExpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAuZmluZEluZGV4KGwgPT4gbC5zdWJzY3JpYmVySWQudG9TdHJpbmcoKSA9PT0gY29ubmVjdGlvbi5nZXRTdWJzY3JpYmVySWQoKSkpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RMaXN0ZW5lcnMuc3BsaWNlKGJyb2FkY2FzdExpc3RlbmVySW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdldEFjdGl2ZUNvbm5lY3Rpb25zKCk6bnVtYmVyIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmliZXJzLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyOiBMaXN0ZW5lcik6dm9pZCB7XG4gICAgICAgICAgICBpZighdGhpcy5saXN0ZW5lcnMuZmluZChsID0+IGwuc3Vic2NyaWJlcklkLnRvU3RyaW5nKCkgPT09IGxpc3RlbmVyLnN1YnNjcmliZXJJZC50b1N0cmluZygpXG4gICAgICAgICAgICAmJiBsLmdyb3VwSWQudG9TdHJpbmcoKSA9PT0gbGlzdGVuZXIuZ3JvdXBJZC50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkQnJvYWRjYXN0TGlzdGVuZXIobGlzdGVuZXI6IExpc3RlbmVyKTp2b2lkIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmJyb2FkY2FzdExpc3RlbmVycy5maW5kKGwgPT4gbC5zdWJzY3JpYmVySWQudG9TdHJpbmcoKSA9PT0gbGlzdGVuZXIuc3Vic2NyaWJlcklkLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcjogTGlzdGVuZXIpOnZvaWQge1xuICAgICAgICAgICAgaWYoIXRoaXMuaXNBbnlMaXN0ZW5lcigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJUb1JlbW92ZUluZGV4OiBudW1iZXIgPSB0aGlzLmxpc3RlbmVyc1xuICAgICAgICAgICAgLmZpbmRJbmRleChsID0+IGwuc3Vic2NyaWJlcklkLnRvU3RyaW5nKCkgPT09IGxpc3RlbmVyLnN1YnNjcmliZXJJZC50b1N0cmluZygpXG4gICAgICAgICAgICAmJiBsLmdyb3VwSWQudG9TdHJpbmcoKSA9PT0gbGlzdGVuZXIuZ3JvdXBJZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmKGxpc3RlbmVyVG9SZW1vdmVJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGxpc3RlbmVyVG9SZW1vdmVJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZW1vdmVCcm9hZGNhc3RMaXN0ZW5lcihzdWJzY3JpYmVySWQ6IHN0cmluZyk6dm9pZCB7XG4gICAgICAgICAgICBpZighdGhpcy5pc0FueUJyb2FkY2FzdExpc3RlbmVyKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lclRvUmVtb3ZlSW5kZXg6IG51bWJlciA9IHRoaXMuYnJvYWRjYXN0TGlzdGVuZXJzXG4gICAgICAgICAgICAuZmluZEluZGV4KGxpc3RlbmVyID0+IGxpc3RlbmVyLnN1YnNjcmliZXJJZC50b1N0cmluZygpID09PSBzdWJzY3JpYmVySWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZihsaXN0ZW5lclRvUmVtb3ZlSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0TGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lclRvUmVtb3ZlSW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2V0SHViTmFtZSgpOnN0cmluZyB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odWJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zdDxUPihtZXNzYWdlOiBNZXNzYWdlPFQ+KTp2b2lkIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzQW55TGlzdGVuZXIoKSAmJiBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlY2lwaWVudHM6IExpc3RlbmVyW10gPSB0aGlzLmxpc3RlbmVycztcblxuICAgICAgICAgICAgaWYoIW1lc3NhZ2UucmVjaXBpZW50SWRzIHx8IG1lc3NhZ2UucmVjaXBpZW50SWRzLmluZGV4T2YobWVzc2FnZS5wdWJsaXNoZXJJZC50b1N0cmluZygpKSA8IDApIHtcbiAgICAgICAgICAgICAgICByZWNpcGllbnRzID0gcmVjaXBpZW50cy5maWx0ZXIobCA9PiBsLnN1YnNjcmliZXJJZC50b1N0cmluZygpICE9PSBtZXNzYWdlLnB1Ymxpc2hlcklkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWVzc2FnZS5yZWNpcGllbnRJZHMgJiYgbWVzc2FnZS5yZWNpcGllbnRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlY2lwaWVudHMgPSByZWNpcGllbnRzLmZpbHRlcihzdWIgPT4gbWVzc2FnZS5yZWNpcGllbnRJZHMuaW5kZXhPZihzdWIuc3Vic2NyaWJlcklkLnRvU3RyaW5nKCkpID49IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWVzc2FnZS5ncm91cElkICYmIG1lc3NhZ2UuZ3JvdXBJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50cyA9IHJlY2lwaWVudHMuZmlsdGVyKHN1YiA9PiBzdWIuZ3JvdXBJZC50b1N0cmluZygpID09PSBtZXNzYWdlLmdyb3VwSWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKCFyZWNpcGllbnRzIHx8IHJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjaXBpZW50cy5mb3JFYWNoKHJlY2lwaWVudCA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIHJlY2lwaWVudC5jYWxsYmFjayhtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHRoaXMuZXJyb3JIYW5uZGxpbmcpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckhhbmRsaW5nRW51bS5Mb2c6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JIYW5kbGluZ0VudW0uVGhyb3c6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JIYW5kbGluZ0VudW0uTm9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyb2FkY2FzdDxUPihtZXNzYWdlOiBNZXNzYWdlPFQ+KTp2b2lkIHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzQW55QnJvYWRjYXN0TGlzdGVuZXIoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0TGlzdGVuZXJzXG4gICAgICAgICAgICAuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyLnN1YnNjcmliZXJJZC50b1N0cmluZygpICE9PSBtZXNzYWdlLnB1Ymxpc2hlcklkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAuZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lci5jYWxsYmFjayhtZXNzYWdlLnBheWxvYWQpKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZGlzcG9zZSgpOnZvaWQge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVycyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmJyb2FkY2FzdExpc3RlbmVycyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmh1Yk5hbWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpdmF0ZSBpc0FueUxpc3RlbmVyKCk6Ym9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMgJiYgdGhpcy5saXN0ZW5lcnMubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaXZhdGUgaXNBbnlCcm9hZGNhc3RMaXN0ZW5lcigpOmJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnJvYWRjYXN0TGlzdGVuZXJzICYmIHRoaXMuYnJvYWRjYXN0TGlzdGVuZXJzLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICB9XG4iXX0=