UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

530 lines (529 loc) 44.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { UISystemClock } from './UISystemClock.service'; /** * <p style="text-indent: 2em;"> * A <code>ng</code> service class which is an implementation of [[INotificationManager]] service interface. For more information, * please see [[INotificationManager]]. * </p> * * @author shiorin, tee4cute * @see [[INotificationManager]] */ var NotificationManager = /** @class */ (function () { function NotificationManager(uiSystemClock) { this.notifications = []; this.pinNotifications = []; this.readNotifications = []; this.uiSystemClock = uiSystemClock; } /** * @param {?} notification * @return {?} */ NotificationManager.prototype.isPinedNotification = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return false; } return this.pinNotifications.indexOf(notification) >= 0; }; /** * @param {?} notification * @return {?} */ NotificationManager.prototype.isReadNotification = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return false; } return this.readNotifications.indexOf(notification) >= 0; }; /** * @param {?} notification * @return {?} */ NotificationManager.prototype.notify = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return; } this.notifications.push(notification); }; /** * @param {?} notification * @return {?} */ NotificationManager.prototype.clear = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return; } var /** @type {?} */ index = this.notifications.indexOf(notification); if (index >= 0) { this.notifications.splice(index, 1); } var /** @type {?} */ pinIndex = this.pinNotifications.indexOf(notification); if (pinIndex >= 0) { this.pinNotifications.splice(pinIndex, 1); } var /** @type {?} */ readIndex = this.readNotifications.indexOf(notification); if (readIndex >= 0) { this.readNotifications.splice(readIndex, 1); } }; /** * @param {?} notificationType * @param {?} name * @return {?} */ NotificationManager.prototype.clearBy = /** * @param {?} notificationType * @param {?} name * @return {?} */ function (notificationType, name) { if ((notificationType === null || typeof notificationType === 'undefined') && (name === null || typeof name === 'undefined')) { this.clearAll(); return; } var /** @type {?} */ cancelNotifyArray = []; try { for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) { var notify = _b.value; var /** @type {?} */ nameCheck = notify.name; var /** @type {?} */ typeName = notify.type; var /** @type {?} */ notifyPass = true; var /** @type {?} */ namePass = true; if (notificationType !== null && typeof notificationType !== 'undefined') { if (typeName !== notificationType) { notifyPass = false; } } if (name !== null && typeof name !== 'undefined') { if (nameCheck !== name) { namePass = false; } } if (notifyPass && namePass) { cancelNotifyArray.push(notify); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } try { // remove from Array for (var cancelNotifyArray_1 = tslib_1.__values(cancelNotifyArray), cancelNotifyArray_1_1 = cancelNotifyArray_1.next(); !cancelNotifyArray_1_1.done; cancelNotifyArray_1_1 = cancelNotifyArray_1.next()) { var notify = cancelNotifyArray_1_1.value; this.clear(notify); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (cancelNotifyArray_1_1 && !cancelNotifyArray_1_1.done && (_d = cancelNotifyArray_1.return)) _d.call(cancelNotifyArray_1); } finally { if (e_2) throw e_2.error; } } var e_1, _c, e_2, _d; }; /** * @return {?} */ NotificationManager.prototype.clearAll = /** * @return {?} */ function () { var /** @type {?} */ cloneList = this.notifications.slice(0); try { for (var cloneList_1 = tslib_1.__values(cloneList), cloneList_1_1 = cloneList_1.next(); !cloneList_1_1.done; cloneList_1_1 = cloneList_1.next()) { var notify = cloneList_1_1.value; this.clear(notify); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (cloneList_1_1 && !cloneList_1_1.done && (_a = cloneList_1.return)) _a.call(cloneList_1); } finally { if (e_3) throw e_3.error; } } var e_3, _a; }; /** * @return {?} */ NotificationManager.prototype.getNotifications = /** * @return {?} */ function () { return this.notifications; }; /** * @param {?} notificationType * @param {?} name * @return {?} */ NotificationManager.prototype.getNotificationsBy = /** * @param {?} notificationType * @param {?} name * @return {?} */ function (notificationType, name) { var /** @type {?} */ result = []; try { for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) { var notify = _b.value; var /** @type {?} */ nameCheck = notify.name; var /** @type {?} */ typeName = notify.type; var /** @type {?} */ notifyPass = true; var /** @type {?} */ namePass = true; if (notificationType !== null && typeof notificationType !== 'undefined') { if (typeName !== notificationType) { notifyPass = false; } } if (name !== null && typeof name !== 'undefined') { if (nameCheck !== name) { namePass = false; } } if (notifyPass && namePass) { result.push(notify); } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_4) throw e_4.error; } } return result; var e_4, _c; }; /** * @return {?} */ NotificationManager.prototype.getShowingNotifications = /** * @return {?} */ function () { return this.getShowingNotificationsBy(null, null); }; /** * @param {?} notificationType * @param {?} name * @return {?} */ NotificationManager.prototype.getShowingNotificationsBy = /** * @param {?} notificationType * @param {?} name * @return {?} */ function (notificationType, name) { var /** @type {?} */ result = []; try { for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) { var notify = _b.value; var /** @type {?} */ nameCheck = notify.name; var /** @type {?} */ typeName = notify.type; var /** @type {?} */ isShow = notify.show; var /** @type {?} */ notifyPass = true; var /** @type {?} */ namePass = true; var /** @type {?} */ timePass = false; if (notificationType !== null && typeof notificationType !== 'undefined') { if (typeName !== notificationType) { notifyPass = false; } } if (name !== null && typeof name !== 'undefined') { if (nameCheck !== name) { namePass = false; } } var /** @type {?} */ createdTime = notify.createdTime; var /** @type {?} */ timeOut = notify.timeout; if (createdTime === null || typeof createdTime === 'undefined') { continue; } if (timeOut === null || typeof timeOut !== 'number') { timeOut = null; } var /** @type {?} */ finalTime = new Date(createdTime); if (timeOut !== null) { finalTime.addMilliseconds(timeOut); } var /** @type {?} */ curDate = this.uiSystemClock.getCurrentClockDateTime(); if (curDate !== null && finalTime.isAfter(curDate)) { timePass = true; } if (notifyPass && namePass && isShow) { if (timePass) { result.push(notify); } else { if (this.isPinedNotification(notify)) { result.push(notify); } } } } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_5) throw e_5.error; } } return result; var e_5, _c; }; /** * @return {?} */ NotificationManager.prototype.getUnreadNotifications = /** * @return {?} */ function () { return this.getUnreadNotificationsBy(null, null); }; /** * @param {?} notificationType * @param {?} name * @return {?} */ NotificationManager.prototype.getUnreadNotificationsBy = /** * @param {?} notificationType * @param {?} name * @return {?} */ function (notificationType, name) { var /** @type {?} */ result = []; try { for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) { var notify = _b.value; var /** @type {?} */ nameCheck = notify.name; var /** @type {?} */ typeName = notify.type; var /** @type {?} */ notifyPass = true; var /** @type {?} */ namePass = true; if (notificationType !== null && typeof notificationType !== 'undefined') { if (typeName !== notificationType) { notifyPass = false; } } if (name !== null && typeof name !== 'undefined') { if (nameCheck !== name) { namePass = false; } } if (notifyPass && namePass) { if (!this.isReadNotification(notify)) { result.push(notify); } } } } catch (e_6_1) { e_6 = { error: e_6_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_6) throw e_6.error; } } return result; var e_6, _c; }; /** * @param {?} notification * @return {?} */ NotificationManager.prototype.markAsRead = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return; } var /** @type {?} */ isRead = this.isReadNotification(notification); if (isRead) { return; } this.readNotifications.push(notification); }; /** * @param {?} notificationType * @param {?} name * @return {?} */ NotificationManager.prototype.markAsReadBy = /** * @param {?} notificationType * @param {?} name * @return {?} */ function (notificationType, name) { if ((notificationType === null || typeof notificationType === 'undefined') && (name === null || typeof name === 'undefined')) { this.markAsReadAll(); return; } var /** @type {?} */ readNotifyArray = []; try { for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) { var notify = _b.value; var /** @type {?} */ nameCheck = notify.name; var /** @type {?} */ typeName = notify.type; var /** @type {?} */ notifyPass = true; var /** @type {?} */ namePass = true; if (notificationType !== null && typeof notificationType !== 'undefined') { if (typeName !== notificationType) { notifyPass = false; } } if (name !== null && typeof name !== 'undefined') { if (nameCheck !== name) { namePass = false; } } if (notifyPass && namePass) { readNotifyArray.push(notify); } } } catch (e_7_1) { e_7 = { error: e_7_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_7) throw e_7.error; } } try { // set mark read from Array for (var readNotifyArray_1 = tslib_1.__values(readNotifyArray), readNotifyArray_1_1 = readNotifyArray_1.next(); !readNotifyArray_1_1.done; readNotifyArray_1_1 = readNotifyArray_1.next()) { var notify = readNotifyArray_1_1.value; this.markAsRead(notify); } } catch (e_8_1) { e_8 = { error: e_8_1 }; } finally { try { if (readNotifyArray_1_1 && !readNotifyArray_1_1.done && (_d = readNotifyArray_1.return)) _d.call(readNotifyArray_1); } finally { if (e_8) throw e_8.error; } } var e_7, _c, e_8, _d; }; /** * @return {?} */ NotificationManager.prototype.markAsReadAll = /** * @return {?} */ function () { try { for (var _a = tslib_1.__values(this.notifications), _b = _a.next(); !_b.done; _b = _a.next()) { var notify = _b.value; var /** @type {?} */ isRead = this.isReadNotification(notify); if (!isRead) { this.readNotifications.push(notify); } } } catch (e_9_1) { e_9 = { error: e_9_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_9) throw e_9.error; } } var e_9, _c; }; /** * @param {?} notification * @return {?} */ NotificationManager.prototype.pinNotification = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return; } var /** @type {?} */ isPined = this.isPinedNotification(notification); if (isPined) { return; } this.pinNotifications.push(notification); }; /** * @param {?} notification * @return {?} */ NotificationManager.prototype.unpinNotification = /** * @param {?} notification * @return {?} */ function (notification) { if (notification === null || typeof notification === 'undefined') { return; } var /** @type {?} */ index = this.pinNotifications.indexOf(notification); if (index >= 0) { this.pinNotifications.splice(index, 1); } }; NotificationManager.decorators = [ { type: Injectable }, ]; /** @nocollapse */ NotificationManager.ctorParameters = function () { return [ { type: UISystemClock, }, ]; }; return NotificationManager; }()); export { NotificationManager }; function NotificationManager_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ NotificationManager.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ NotificationManager.ctorParameters; /** @type {?} */ NotificationManager.prototype.notifications; /** @type {?} */ NotificationManager.prototype.pinNotifications; /** @type {?} */ NotificationManager.prototype.readNotifications; /** @type {?} */ NotificationManager.prototype.showDelayTimer; /** @type {?} */ NotificationManager.prototype.uiSystemClock; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90aWZpY2F0aW9uTWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZS9Ob3RpZmljYXRpb25NYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7SUFvQnBELDZCQUFZLGFBQTRCO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztLQUN0Qzs7Ozs7SUFFTyxpREFBbUI7Ozs7Y0FBQyxZQUEwQjtRQUNsRCxFQUFFLENBQUEsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFBLENBQUM7WUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoQjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7O0lBR3BELGdEQUFrQjs7OztjQUFDLFlBQTBCO1FBQ2pELEVBQUUsQ0FBQSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUEsQ0FBQztZQUM3RCxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7Ozs7SUFHdEQsb0NBQU07Ozs7Y0FBQyxZQUEwQjtRQUNwQyxFQUFF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ZWEsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU5vdGlmaWNhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9zaGFyZS9JTm90aWZpY2F0aW9uTWFuYWdlcic7XG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuLi9jb21wb25lbnQvbW9kZWwvTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFVJU3lzdGVtQ2xvY2sgfSBmcm9tICcuL1VJU3lzdGVtQ2xvY2suc2VydmljZSc7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQSA8Y29kZT5uZzwvY29kZT4gc2VydmljZSBjbGFzcyB3aGljaCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV0gc2VydmljZSBpbnRlcmZhY2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLFxuICogcGxlYXNlIHNlZSBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV0uXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICogQHNlZSBbW0lOb3RpZmljYXRpb25NYW5hZ2VyXV1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJTm90aWZpY2F0aW9uTWFuYWdlciB7XG5cbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbltdO1xuICAgIHByaXZhdGUgcGluTm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW107XG4gICAgcHJpdmF0ZSByZWFkTm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW107XG4gICAgcHJpdmF0ZSBzaG93RGVsYXlUaW1lcjogYW55O1xuICAgIHByaXZhdGUgdWlTeXN0ZW1DbG9jazogVUlTeXN0ZW1DbG9jaztcblxuICAgIGNvbnN0cnVjdG9yKHVpU3lzdGVtQ2xvY2s6IFVJU3lzdGVtQ2xvY2spIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gW107XG4gICAgICAgIHRoaXMucGluTm90aWZpY2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnJlYWROb3RpZmljYXRpb25zID0gW107XG4gICAgICAgIHRoaXMudWlTeXN0ZW1DbG9jayA9IHVpU3lzdGVtQ2xvY2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpbmVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGluTm90aWZpY2F0aW9ucy5pbmRleE9mKG5vdGlmaWNhdGlvbikgPj0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZihub3RpZmljYXRpb24gPT09IG51bGwgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWROb3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKSA+PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3RpZnkobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnB1c2gobm90aWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGluSW5kZXggPSB0aGlzLnBpbk5vdGlmaWNhdGlvbnMuaW5kZXhPZihub3RpZmljYXRpb24pO1xuXG4gICAgICAgIGlmIChwaW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBpbk5vdGlmaWNhdGlvbnMuc3BsaWNlKHBpbkluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWFkSW5kZXggPSB0aGlzLnJlYWROb3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcblxuICAgICAgICBpZiAocmVhZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMuc3BsaWNlKHJlYWRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJCeShub3RpZmljYXRpb25UeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoKG5vdGlmaWNhdGlvblR5cGUgPT09IG51bGwgfHwgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgPT09ICd1bmRlZmluZWQnKSAmJiAobmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuY2VsTm90aWZ5QXJyYXk6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uVHlwZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT09IG5vdGlmaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQ2hlY2sgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsTm90aWZ5QXJyYXkucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGZyb20gQXJyYXlcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIGNhbmNlbE5vdGlmeUFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKG5vdGlmeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGxldCBjbG9uZUxpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbnMuc2xpY2UoMCk7XG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiBjbG9uZUxpc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIobm90aWZ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm90aWZpY2F0aW9uc0J5KG5vdGlmaWNhdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogTm90aWZpY2F0aW9uW10ge1xuICAgICAgICBsZXQgcmVzdWx0OiBOb3RpZmljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBuYW1lQ2hlY2s6IHN0cmluZyA9IG5vdGlmeS5uYW1lO1xuICAgICAgICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBub3RpZnkudHlwZTtcblxuICAgICAgICAgICAgbGV0IG5vdGlmeVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5hbWVQYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvblR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9PSBub3RpZmljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZUNoZWNrICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm90aWZ5UGFzcyAmJiBuYW1lUGFzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaG93aW5nTm90aWZpY2F0aW9ucygpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNob3dpbmdOb3RpZmljYXRpb25zQnkobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNob3dpbmdOb3RpZmljYXRpb25zQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuICAgICAgICAgICAgbGV0IGlzU2hvdzogYm9vbGVhbiA9IG5vdGlmeS5zaG93O1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHRpbWVQYXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25UeXBlICE9PSBudWxsICYmIHR5cGVvZiBub3RpZmljYXRpb25UeXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlTmFtZSAhPT0gbm90aWZpY2F0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBub3RpZnlQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVDaGVjayAhPT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lUGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNyZWF0ZWRUaW1lOiBEYXRlID0gbm90aWZ5LmNyZWF0ZWRUaW1lO1xuICAgICAgICAgICAgbGV0IHRpbWVPdXQ6IG51bWJlciA9IG5vdGlmeS50aW1lb3V0O1xuICAgICAgICAgICAgaWYgKGNyZWF0ZWRUaW1lID09PSBudWxsIHx8IHR5cGVvZiBjcmVhdGVkVGltZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aW1lT3V0ID09PSBudWxsIHx8IHR5cGVvZiB0aW1lT3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRpbWVPdXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmluYWxUaW1lID0gbmV3IERhdGUoY3JlYXRlZFRpbWUpO1xuICAgICAgICAgICAgaWYgKHRpbWVPdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaW5hbFRpbWUuYWRkTWlsbGlzZWNvbmRzKHRpbWVPdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY3VyRGF0ZTogRGF0ZSA9IHRoaXMudWlTeXN0ZW1DbG9jay5nZXRDdXJyZW50Q2xvY2tEYXRlVGltZSgpO1xuICAgICAgICAgICAgaWYgKGN1ckRhdGUgIT09IG51bGwgJiYgZmluYWxUaW1lLmlzQWZ0ZXIoY3VyRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lUGFzcyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzICYmIGlzU2hvdykge1xuICAgICAgICAgICAgICAgIGlmICh0aW1lUGFzcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNQaW5lZE5vdGlmaWNhdGlvbihub3RpZnkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VW5yZWFkTm90aWZpY2F0aW9uc0J5KG51bGwsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBOb3RpZmljYXRpb25bXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IE5vdGlmaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IG5hbWVDaGVjazogc3RyaW5nID0gbm90aWZ5Lm5hbWU7XG4gICAgICAgICAgICBsZXQgdHlwZU5hbWU6IHN0cmluZyA9IG5vdGlmeS50eXBlO1xuXG4gICAgICAgICAgICBsZXQgbm90aWZ5UGFzczogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmFtZVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uVHlwZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZU5hbWUgIT09IG5vdGlmaWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGFzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQ2hlY2sgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub3RpZnlQYXNzICYmIG5hbWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVhZE5vdGlmaWNhdGlvbihub3RpZnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya0FzUmVhZChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNSZWFkID0gdGhpcy5pc1JlYWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYoaXNSZWFkKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBtYXJrQXNSZWFkQnkobm90aWZpY2F0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKChub3RpZmljYXRpb25UeXBlID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb25UeXBlID09PSAndW5kZWZpbmVkJykgJiYgKG5hbWUgPT09IG51bGwgfHwgdHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNSZWFkQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVhZE5vdGlmeUFycmF5OiBOb3RpZmljYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG5vdGlmeSBvZiB0aGlzLm5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBuYW1lQ2hlY2s6IHN0cmluZyA9IG5vdGlmeS5uYW1lO1xuICAgICAgICAgICAgbGV0IHR5cGVOYW1lOiBzdHJpbmcgPSBub3RpZnkudHlwZTtcblxuICAgICAgICAgICAgbGV0IG5vdGlmeVBhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5hbWVQYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvblR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9PSBub3RpZmljYXRpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmeVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZUNoZWNrICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVQYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm90aWZ5UGFzcyAmJiBuYW1lUGFzcykge1xuICAgICAgICAgICAgICAgIHJlYWROb3RpZnlBcnJheS5wdXNoKG5vdGlmeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgbWFyayByZWFkIGZyb20gQXJyYXlcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHJlYWROb3RpZnlBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNSZWFkKG5vdGlmeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbWFya0FzUmVhZEFsbCgpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgbm90aWZ5IG9mIHRoaXMubm90aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgbGV0IGlzUmVhZCA9IHRoaXMuaXNSZWFkTm90aWZpY2F0aW9uKG5vdGlmeSk7XG4gICAgICAgICAgICBpZiAoIWlzUmVhZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZE5vdGlmaWNhdGlvbnMucHVzaChub3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBpbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzUGluZWQ6IGJvb2xlYW4gPSB0aGlzLmlzUGluZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYoaXNQaW5lZCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBpbk5vdGlmaWNhdGlvbnMucHVzaChub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnBpbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uID09PSBudWxsIHx8IHR5cGVvZiBub3RpZmljYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5waW5Ob3RpZmljYXRpb25zLmluZGV4T2Yobm90aWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMucGluTm90aWZpY2F0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19