angular2-notifications
Version:
> A light and easy to use notifications library for Angular 2. ~~It features both regular page notifications (toasts) and push notifications.~~
209 lines • 30.2 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { NotificationAnimationType } from '../../enums/notification-animation-type.enum';
import * as i0 from "@angular/core";
import * as i1 from "../../services/notifications.service";
import * as i2 from "@angular/common";
import * as i3 from "../notification/notification.component";
export class SimpleNotificationsComponent {
service;
cd;
constructor(service, cd) {
this.service = service;
this.cd = cd;
}
set options(opt) {
this.usingComponentOptions = true;
this.attachChanges(opt);
}
create = new EventEmitter();
destroy = new EventEmitter();
notifications = [];
position = ['bottom', 'right'];
lastNotificationCreated;
listener;
// Received values
lastOnBottom = true;
maxStack = 8;
preventLastDuplicates = false;
preventDuplicates = false;
// Sent values
timeOut = 0;
maxLength = 0;
clickToClose = true;
clickIconToClose = false;
showProgressBar = true;
pauseOnHover = true;
theClass = '';
rtl = false;
animate = NotificationAnimationType.FromRight;
usingComponentOptions = false;
ngOnInit() {
/**
* Only attach global options if config
* options were never sent through input
*/
if (!this.usingComponentOptions) {
this.attachChanges(this.service.globalOptions);
}
this.listener = this.service.emitter
.subscribe(item => {
switch (item.command) {
case 'cleanAll':
this.notifications = [];
break;
case 'clean':
this.cleanSingle(item.id);
break;
case 'set':
if (item.add) {
this.add(item.notification);
}
else {
this.defaultBehavior(item);
}
break;
default:
this.defaultBehavior(item);
break;
}
if (!this.cd.destroyed) {
this.cd.detectChanges();
}
});
}
ngOnDestroy() {
if (this.listener) {
this.listener.unsubscribe();
}
this.cd.detach();
}
// Default behavior on event
defaultBehavior(value) {
this.notifications.splice(this.notifications.indexOf(value.notification), 1);
this.destroy.emit(this.buildEmit(value.notification, false));
}
// Add the new notification to the notification array
add(item) {
item.createdOn = new Date();
const toBlock = this.preventLastDuplicates || this.preventDuplicates ? this.block(item) : false;
// Save this as the last created notification
this.lastNotificationCreated = item;
// Override icon if set
if (item.override && item.override.icons && item.override.icons[item.type]) {
item.icon = item.override.icons[item.type];
}
if (!toBlock) {
// Check if the notification should be added at the start or the end of the array
if (this.lastOnBottom) {
if (this.notifications.length >= this.maxStack) {
this.notifications.splice(0, 1);
}
this.notifications.push(item);
}
else {
if (this.notifications.length >= this.maxStack) {
this.notifications.splice(this.notifications.length - 1, 1);
}
this.notifications.splice(0, 0, item);
}
this.create.emit(this.buildEmit(item, true));
}
}
// Check if notifications should be prevented
block(item) {
const toCheck = item.html ? this.checkHtml : this.checkStandard;
if (this.preventDuplicates && this.notifications.length > 0) {
for (const notification of this.notifications) {
if (toCheck(notification, item)) {
return true;
}
}
}
if (this.preventLastDuplicates) {
let comp;
if (this.preventLastDuplicates === 'visible' && this.notifications.length > 0) {
if (this.lastOnBottom) {
comp = this.notifications[this.notifications.length - 1];
}
else {
comp = this.notifications[0];
}
}
else if (this.preventLastDuplicates === 'all' && this.lastNotificationCreated) {
comp = this.lastNotificationCreated;
}
else {
return false;
}
return toCheck(comp, item);
}
return false;
}
checkStandard(checker, item) {
return checker.type === item.type && checker.title === item.title && checker.content === item.content;
}
checkHtml(checker, item) {
return checker.html ?
checker.type === item.type && checker.title === item.title && checker.content === item.content && checker.html === item.html :
false;
}
// Attach all the changes received in the options object
attachChanges(options) {
for (const key in options) {
if (this.hasOwnProperty(key)) {
this[key] = options[key];
}
else if (key === 'icons') {
this.service.icons = options[key];
}
}
}
buildEmit(notification, to) {
const toEmit = {
createdOn: notification.createdOn,
type: notification.type,
icon: notification.icon,
id: notification.id
};
if (notification.html) {
toEmit.html = notification.html;
}
else {
toEmit.title = notification.title;
toEmit.content = notification.content;
}
if (!to) {
toEmit.destroyedOn = new Date();
}
return toEmit;
}
cleanSingle(id) {
let indexOfDelete = 0;
let doDelete = false;
let noti;
this.notifications.forEach((notification, idx) => {
if (notification.id === id) {
indexOfDelete = idx;
noti = notification;
doDelete = true;
}
});
if (doDelete) {
this.notifications.splice(indexOfDelete, 1);
this.destroy.emit(this.buildEmit(noti, false));
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: SimpleNotificationsComponent, deps: [{ token: i1.NotificationsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: SimpleNotificationsComponent, selector: "simple-notifications", inputs: { options: "options" }, outputs: { create: "create", destroy: "destroy" }, ngImport: i0, template: "<div class=\"simple-notification-wrapper\" [ngClass]=\"position\">\r\n <simple-notification\r\n *ngFor=\"let a of notifications; let i = index\"\r\n [item]=\"a\"\r\n [timeOut]=\"timeOut\"\r\n [clickToClose]=\"clickToClose\"\r\n [clickIconToClose]=\"clickIconToClose\"\r\n [maxLength]=\"maxLength\"\r\n [showProgressBar]=\"showProgressBar\"\r\n [pauseOnHover]=\"pauseOnHover\"\r\n [theClass]=\"theClass\"\r\n [rtl]=\"rtl\"\r\n [animate]=\"animate\"\r\n [position]=\"i\">\r\n </simple-notification>\r\n</div>", styles: [".simple-notification-wrapper{position:fixed;width:300px;z-index:1000}.simple-notification-wrapper.left{left:20px}.simple-notification-wrapper.top{top:20px}.simple-notification-wrapper.right{right:20px}.simple-notification-wrapper.bottom{bottom:20px}.simple-notification-wrapper.center{left:50%;transform:translate(-50%)}.simple-notification-wrapper.middle{top:50%;transform:translateY(-50%)}.simple-notification-wrapper.middle.center{transform:translate(-50%,-50%)}@media (max-width: 340px){.simple-notification-wrapper{width:auto;left:20px;right:20px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.NotificationComponent, selector: "simple-notification", inputs: ["timeOut", "showProgressBar", "pauseOnHover", "clickToClose", "clickIconToClose", "maxLength", "theClass", "rtl", "animate", "position", "item"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: SimpleNotificationsComponent, decorators: [{
type: Component,
args: [{ selector: 'simple-notifications', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"simple-notification-wrapper\" [ngClass]=\"position\">\r\n <simple-notification\r\n *ngFor=\"let a of notifications; let i = index\"\r\n [item]=\"a\"\r\n [timeOut]=\"timeOut\"\r\n [clickToClose]=\"clickToClose\"\r\n [clickIconToClose]=\"clickIconToClose\"\r\n [maxLength]=\"maxLength\"\r\n [showProgressBar]=\"showProgressBar\"\r\n [pauseOnHover]=\"pauseOnHover\"\r\n [theClass]=\"theClass\"\r\n [rtl]=\"rtl\"\r\n [animate]=\"animate\"\r\n [position]=\"i\">\r\n </simple-notification>\r\n</div>", styles: [".simple-notification-wrapper{position:fixed;width:300px;z-index:1000}.simple-notification-wrapper.left{left:20px}.simple-notification-wrapper.top{top:20px}.simple-notification-wrapper.right{right:20px}.simple-notification-wrapper.bottom{bottom:20px}.simple-notification-wrapper.center{left:50%;transform:translate(-50%)}.simple-notification-wrapper.middle{top:50%;transform:translateY(-50%)}.simple-notification-wrapper.middle.center{transform:translate(-50%,-50%)}@media (max-width: 340px){.simple-notification-wrapper{width:auto;left:20px;right:20px}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.NotificationsService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { options: [{
type: Input
}], create: [{
type: Output
}], destroy: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLW5vdGlmaWNhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjItbm90aWZpY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvc2ltcGxlLW5vdGlmaWNhdGlvbnMvc2ltcGxlLW5vdGlmaWNhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjItbm90aWZpY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvc2ltcGxlLW5vdGlmaWNhdGlvbnMvc2ltcGxlLW5vdGlmaWNhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsaUJBQWlCLEVBQThCLE1BQU0sZUFBZSxDQUFDO0FBRWxLLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7OztBQVl6RixNQUFNLE9BQU8sNEJBQTRCO0lBRTdCO0lBQ0E7SUFGVixZQUNVLE9BQTZCLEVBQzdCLEVBQXFCO1FBRHJCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzdCLE9BQUUsR0FBRixFQUFFLENBQW1CO0lBQzNCLENBQUM7SUFFTCxJQUFhLE9BQU8sQ0FBQyxHQUFZO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRVMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDNUIsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFdkMsYUFBYSxHQUFtQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWpDLHVC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TTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIENoYW5nZURldGVjdG9yUmVmLCBWaWV3UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25BbmltYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvbm90aWZpY2F0aW9uLWFuaW1hdGlvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL25vdGlmaWNhdGlvbi50eXBlJztcclxuaW1wb3J0IHsgT3B0aW9ucywgUG9zaXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL29wdGlvbnMudHlwZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcGxlLW5vdGlmaWNhdGlvbnMnLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXBsZS1ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zaW1wbGUtbm90aWZpY2F0aW9ucy5jb21wb25lbnQuY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZU5vdGlmaWNhdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IE5vdGlmaWNhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgb3B0aW9ucyhvcHQ6IE9wdGlvbnMpIHtcclxuICAgIHRoaXMudXNpbmdDb21wb25lbnRPcHRpb25zID0gdHJ1ZTtcclxuICAgIHRoaXMuYXR0YWNoQ2hhbmdlcyhvcHQpO1xyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIGNyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZGVzdHJveSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW10gPSBbXTtcclxuICBwb3NpdGlvbjogUG9zaXRpb24gPSBbJ2JvdHRvbScsICdyaWdodCddO1xyXG5cclxuICBwcml2YXRlIGxhc3ROb3RpZmljYXRpb25DcmVhdGVkOiBOb3RpZmljYXRpb247XHJcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvLyBSZWNlaXZlZCB2YWx1ZXNcclxuICBwcml2YXRlIGxhc3RPbkJvdHRvbSA9IHRydWU7XHJcbiAgcHJpdmF0ZSBtYXhTdGFjayA9IDg7XHJcbiAgcHJpdmF0ZSBwcmV2ZW50TGFzdER1cGxpY2F0ZXM6IGFueSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcHJldmVudER1cGxpY2F0ZXMgPSBmYWxzZTtcclxuXHJcbiAgLy8gU2VudCB2YWx1ZXNcclxuICB0aW1lT3V0ID0gMDtcclxuICBtYXhMZW5ndGggPSAwO1xyXG4gIGNsaWNrVG9DbG9zZSA9IHRydWU7XHJcbiAgY2xpY2tJY29uVG9DbG9zZSA9IGZhbHNlO1xyXG4gIHNob3dQcm9ncmVzc0JhciA9IHRydWU7XHJcbiAgcGF1c2VPbkhvdmVyID0gdHJ1ZTtcclxuICB0aGVDbGFzcyA9ICcnO1xyXG4gIHJ0bCA9IGZhbHNlO1xyXG4gIGFuaW1hdGU6IE5vdGlmaWNhdGlvbkFuaW1hdGlvblR5cGUgPSBOb3RpZmljYXRpb25BbmltYXRpb25UeXBlLkZyb21SaWdodDtcclxuXHJcbiAgcHJpdmF0ZSB1c2luZ0NvbXBvbmVudE9wdGlvbnMgPSBmYWxzZTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPbmx5IGF0dGFjaCBnbG9iYWwgb3B0aW9ucyBpZiBjb25maWdcclxuICAgICAqIG9wdGlvbnMgd2VyZSBuZXZlciBzZW50IHRocm91Z2ggaW5wdXRcclxuICAgICAqL1xyXG4gICAgaWYgKCF0aGlzLnVzaW5nQ29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICB0aGlzLmF0dGFjaENoYW5nZXMoXHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdsb2JhbE9wdGlvbnNcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxpc3RlbmVyID0gdGhpcy5zZXJ2aWNlLmVtaXR0ZXJcclxuICAgICAgLnN1YnNjcmliZShpdGVtID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW0uY29tbWFuZCkge1xyXG4gICAgICAgICAgY2FzZSAnY2xlYW5BbGwnOlxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnY2xlYW4nOlxyXG4gICAgICAgICAgICB0aGlzLmNsZWFuU2luZ2xlKGl0ZW0uaWQhKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnc2V0JzpcclxuICAgICAgICAgICAgaWYgKGl0ZW0uYWRkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGQoaXRlbS5ub3RpZmljYXRpb24hKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvcihpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvcihpdGVtKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKHRoaXMuY2QgYXMgVmlld1JlZikuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICB0aGlzLmxpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkLmRldGFjaCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVmYXVsdCBiZWhhdmlvciBvbiBldmVudFxyXG4gIGRlZmF1bHRCZWhhdmlvcih2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKHRoaXMubm90aWZpY2F0aW9ucy5pbmRleE9mKHZhbHVlLm5vdGlmaWNhdGlvbiksIDEpO1xyXG4gICAgdGhpcy5kZXN0cm95LmVtaXQodGhpcy5idWlsZEVtaXQodmFsdWUubm90aWZpY2F0aW9uLCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEFkZCB0aGUgbmV3IG5vdGlmaWNhdGlvbiB0byB0aGUgbm90aWZpY2F0aW9uIGFycmF5XHJcbiAgYWRkKGl0ZW06IE5vdGlmaWNhdGlvbik6IHZvaWQge1xyXG4gICAgaXRlbS5jcmVhdGVkT24gPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGNvbnN0IHRvQmxvY2s6IGJvb2xlYW4gPSB0aGlzLnByZXZlbnRMYXN0RHVwbGljYXRlcyB8fCB0aGlzLnByZXZlbnREdXBsaWNhdGVzID8gdGhpcy5ibG9jayhpdGVtKSA6IGZhbHNlO1xyXG5cclxuICAgIC8vIFNhdmUgdGhpcyBhcyB0aGUgbGFzdCBjcmVhdGVkIG5vdGlmaWNhdGlvblxyXG4gICAgdGhpcy5sYXN0Tm90aWZpY2F0aW9uQ3JlYXRlZCA9IGl0ZW07XHJcbiAgICAvLyBPdmVycmlkZSBpY29uIGlmIHNldFxyXG4gICAgaWYgKGl0ZW0ub3ZlcnJpZGUgJiYgaXRlbS5vdmVycmlkZS5pY29ucyAmJiBpdGVtLm92ZXJyaWRlLmljb25zW2l0ZW0udHlwZV0pIHtcclxuICAgICAgaXRlbS5pY29uID0gaXRlbS5vdmVycmlkZS5pY29uc1tpdGVtLnR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdG9CbG9jaykge1xyXG4gICAgICAvLyBDaGVjayBpZiB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgc3RhcnQgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXlcclxuICAgICAgaWYgKHRoaXMubGFzdE9uQm90dG9tKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggPj0gdGhpcy5tYXhTdGFjaykge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoID49IHRoaXMubWF4U3RhY2spIHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UodGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAtIDEsIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jcmVhdGUuZW1pdCh0aGlzLmJ1aWxkRW1pdChpdGVtLCB0cnVlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiBub3RpZmljYXRpb25zIHNob3VsZCBiZSBwcmV2ZW50ZWRcclxuICBibG9jayhpdGVtOiBOb3RpZmljYXRpb24pOiBib29sZWFuIHtcclxuXHJcbiAgICBjb25zdCB0b0NoZWNrID0gaXRlbS5odG1sID8gdGhpcy5jaGVja0h0bWwgOiB0aGlzLmNoZWNrU3RhbmRhcmQ7XHJcblxyXG4gICAgaWYgKHRoaXMucHJldmVudER1cGxpY2F0ZXMgJiYgdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChjb25zdCBub3RpZmljYXRpb24gb2YgdGhpcy5ub3RpZmljYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKHRvQ2hlY2sobm90aWZpY2F0aW9uLCBpdGVtKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucHJldmVudExhc3REdXBsaWNhdGVzKSB7XHJcblxyXG4gICAgICBsZXQgY29tcDogTm90aWZpY2F0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMucHJldmVudExhc3REdXBsaWNhdGVzID09PSAndmlzaWJsZScgJiYgdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAodGhpcy5sYXN0T25Cb3R0b20pIHtcclxuICAgICAgICAgIGNvbXAgPSB0aGlzLm5vdGlmaWNhdGlvbnNbdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb21wID0gdGhpcy5ub3RpZmljYXRpb25zWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXZlbnRMYXN0RHVwbGljYXRlcyA9PT0gJ2FsbCcgJiYgdGhpcy5sYXN0Tm90aWZpY2F0aW9uQ3JlYXRlZCkge1xyXG4gICAgICAgIGNvbXAgPSB0aGlzLmxhc3ROb3RpZmljYXRpb25DcmVhdGVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdG9DaGVjayhjb21wLCBpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjaGVja1N0YW5kYXJkKGNoZWNrZXI6IE5vdGlmaWNhdGlvbiwgaXRlbTogTm90aWZpY2F0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY2hlY2tlci50eXBlID09PSBpdGVtLnR5cGUgJiYgY2hlY2tlci50aXRsZSA9PT0gaXRlbS50aXRsZSAmJiBjaGVja2VyLmNvbnRlbnQgPT09IGl0ZW0uY29udGVudDtcclxuICB9XHJcblxyXG4gIGNoZWNrSHRtbChjaGVja2VyOiBOb3RpZmljYXRpb24sIGl0ZW06IE5vdGlmaWNhdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNoZWNrZXIuaHRtbCA/XHJcbiAgICAgIGNoZWNrZXIudHlwZSA9PT0gaXRlbS50eXBlICYmIGNoZWNrZXIudGl0bGUgPT09IGl0ZW0udGl0bGUgJiYgY2hlY2tlci5jb250ZW50ID09PSBpdGVtLmNvbnRlbnQgJiYgY2hlY2tlci5odG1sID09PSBpdGVtLmh0bWwgOlxyXG4gICAgICBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIEF0dGFjaCBhbGwgdGhlIGNoYW5nZXMgcmVjZWl2ZWQgaW4gdGhlIG9wdGlvbnMgb2JqZWN0XHJcbiAgYXR0YWNoQ2hhbmdlcyhvcHRpb25zOiBhbnkpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IG9wdGlvbnNba2V5XTtcclxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpY29ucycpIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2UuaWNvbnMgPSBvcHRpb25zW2tleV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1aWxkRW1pdChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbiwgdG86IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHRvRW1pdDogTm90aWZpY2F0aW9uID0ge1xyXG4gICAgICBjcmVhdGVkT246IG5vdGlmaWNhdGlvbi5jcmVhdGVkT24sXHJcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlLFxyXG4gICAgICBpY29uOiBub3RpZmljYXRpb24uaWNvbixcclxuICAgICAgaWQ6IG5vdGlmaWNhdGlvbi5pZFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAobm90aWZpY2F0aW9uLmh0bWwpIHtcclxuICAgICAgdG9FbWl0Lmh0bWwgPSBub3RpZmljYXRpb24uaHRtbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvRW1pdC50aXRsZSA9IG5vdGlmaWNhdGlvbi50aXRsZTtcclxuICAgICAgdG9FbWl0LmNvbnRlbnQgPSBub3RpZmljYXRpb24uY29udGVudDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRvKSB7XHJcbiAgICAgIHRvRW1pdC5kZXN0cm95ZWRPbiA9IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRvRW1pdDtcclxuICB9XHJcblxyXG4gIGNsZWFuU2luZ2xlKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbmRleE9mRGVsZXRlID0gMDtcclxuICAgIGxldCBkb0RlbGV0ZSA9IGZhbHNlO1xyXG4gICAgbGV0IG5vdGk7XHJcblxyXG4gICAgdGhpcy5ub3RpZmljYXRpb25zLmZvckVhY2goKG5vdGlmaWNhdGlvbiwgaWR4KSA9PiB7XHJcbiAgICAgIGlmIChub3RpZmljYXRpb24uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgaW5kZXhPZkRlbGV0ZSA9IGlkeDtcclxuICAgICAgICBub3RpID0gbm90aWZpY2F0aW9uO1xyXG4gICAgICAgIGRvRGVsZXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGRvRGVsZXRlKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoaW5kZXhPZkRlbGV0ZSwgMSk7XHJcbiAgICAgIHRoaXMuZGVzdHJveS5lbWl0KHRoaXMuYnVpbGRFbWl0KG5vdGksIGZhbHNlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzaW1wbGUtbm90aWZpY2F0aW9uLXdyYXBwZXJcIiBbbmdDbGFzc109XCJwb3NpdGlvblwiPlxyXG4gICAgPHNpbXBsZS1ub3RpZmljYXRpb25cclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGEgb2Ygbm90aWZpY2F0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgIFtpdGVtXT1cImFcIlxyXG4gICAgICAgICAgICBbdGltZU91dF09XCJ0aW1lT3V0XCJcclxuICAgICAgICAgICAgW2NsaWNrVG9DbG9zZV09XCJjbGlja1RvQ2xvc2VcIlxyXG4gICAgICAgICAgICBbY2xpY2tJY29uVG9DbG9zZV09XCJjbGlja0ljb25Ub0Nsb3NlXCJcclxuICAgICAgICAgICAgW21heExlbmd0aF09XCJtYXhMZW5ndGhcIlxyXG4gICAgICAgICAgICBbc2hvd1Byb2dyZXNzQmFyXT1cInNob3dQcm9ncmVzc0JhclwiXHJcbiAgICAgICAgICAgIFtwYXVzZU9uSG92ZXJdPVwicGF1c2VPbkhvdmVyXCJcclxuICAgICAgICAgICAgW3RoZUNsYXNzXT1cInRoZUNsYXNzXCJcclxuICAgICAgICAgICAgW3J0bF09XCJydGxcIlxyXG4gICAgICAgICAgICBbYW5pbWF0ZV09XCJhbmltYXRlXCJcclxuICAgICAgICAgICAgW3Bvc2l0aW9uXT1cImlcIj5cclxuICAgIDwvc2ltcGxlLW5vdGlmaWNhdGlvbj5cclxuPC9kaXY+Il19