ng2-logger
Version:
isomorphic logger for browser/server in typescript
237 lines • 26.9 kB
JavaScript
import { Level } from './level';
import { Display } from './display';
import { Helpers } from 'tnp-core/browser';
export class Logger {
setLevel(l) {
this._level = l;
return this;
}
get isProductionMode() {
return !this.developmentMode;
}
setProductionMode(productionMode) {
this.developmentMode = !productionMode;
return this;
}
mute() {
this.isMuted = true;
return this;
}
constructor(name, color, developmentMode, allowed, isMuted, fixedWidth) {
this.name = name;
this.color = color;
this.developmentMode = developmentMode;
this.allowed = allowed;
this.isMuted = isMuted;
this.fixedWidth = fixedWidth;
/**
* @see data
*/
this.d = (name, ...data) => this._data(name, data);
/**
* @see error
*/
this.er = (name, ...data) => this._error(name, data);
/**
* @see info
*/
this.i = (name, ...data) => this._info(name, data);
/**
* @see warn
*/
this.w = (name, ...data) => this._warn(name, data);
/**
* Logs message and data with the level=data
* @param message The message
* @param otherParams Additional parameters
*/
this.data = (message, ...otherParams) => { return this._data(message, otherParams); };
/**
* Logs message and data with the level=error
* @param message The message
* @param otherParams Additional parameters
*/
this.error = (message, ...otherParams) => this._error(message, otherParams);
/**
* Logs message and data with the level=info
* @param message The message
* @param otherParams Additional parameters
*/
this.info = (message, ...otherParams) => this._info(message, otherParams);
/**
* Logs message and data with the level=success
* @param message The message
* @param otherParams Additional parameters
*/
this.success = (message, ...otherParams) => this._success(message, otherParams);
/**
* Logs message and data with the level=taskStarted
* @param message The message
* @param otherParams Additional parameters
*/
this.taskStarted = (message, ...otherParams) => this._taskStarted(message, otherParams);
/**
* Logs message and data with the level=taskDone
* @param message The message
* @param otherParams Additional parameters
*/
this.taskDone = (message, ...otherParams) => this._taskDone(message, otherParams);
/**
* Logs message and data with the level=warn
* @param message The message
* @param otherParams Additional parameters
*/
this.warn = (message, ...otherParams) => this._warn(message, otherParams);
}
onlyWhen(expression) {
if (typeof expression === 'function') {
this.isMuted = !expression();
}
else if (typeof expression === 'boolean') {
this.isMuted = !expression;
}
}
_data(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.DATA))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.DATA)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.DATA,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
_error(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.ERROR))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.ERROR)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.ERROR,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
_info(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.INFO))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.INFO)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.INFO,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
_success(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.SUCCESS))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.SUCCESS)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.SUCCESS,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
_taskStarted(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.TASK_STARTED))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.TASK_STARTED)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.TASK_STARTED,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
_taskDone(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.TASK_DONE))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.TASK_DONE)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.TASK_DONE,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
_warn(name, ...data) {
if (this.isMuted)
return this;
if (this.allowed.length >= 1 && Helpers.contain(this.allowed, Level.__NOTHING)
&& !Helpers.contain(this.allowed, Level.WARN))
return this;
if (this.allowed.length === 0 || Helpers.contain(this.allowed, Level.WARN)) {
// @ts-ignore
Display.msg.apply(void 0, [
name,
...data,
this.name,
this.color,
Level.WARN,
this.fixedWidth,
this.isProductionMode,
]);
}
return this;
}
}
;
({}); // @--end-of-file-for-module=ng2-logger lib/logger.ts
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3QvbmcyLWxvZ2dlci9wcm9qZWN0cy9uZzItbG9nZ2VyL3NyYy9saWIvbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0MsTUFBTSxPQUFPLE1BQU07SUFHVixRQUFRLENBQUMsQ0FBUTtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUMvQixDQUFDO0lBRU0saUJBQWlCLENBQUMsY0FBdUI7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFDVSxJQUFZLEVBQ2IsS0FBYSxFQUNaLGVBQXdCLEVBQ3hCLE9BQWdCLEVBQ2hCLE9BQWdCLEVBQ2pCLFVBQThCO1FBTDdCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ1osb0JBQWUsR0FBZixlQUFlLENBQVM7UUFDeEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2pCLGVBQVUsR0FBVixVQUFVLENBQW9CO1FBeUp2Qzs7VUFFRTtRQUNGLE1BQUMsR0FBRyxDQUFDLElBQWtCLEVB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SUFBSSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO2VBQ3pFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU3RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzFFLGFBQWE7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsSUFBSTtnQkFDSixHQUFHLElBQUk7Z0JBQ1AsSUFBSSxDQUFDLElBQUk7Z0JBQ1QsSUFBSSxDQUFDLEtBQUs7Z0JBQ1YsS0FBSyxDQUFDLElBQUk7Z0JBQ1YsSUFBSSxDQUFDLFVBQVU7Z0JBQ2YsSUFBSSxDQUFDLGdCQUFnQjthQUN0QixDQUFDLENBQUE7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQTBFRjtBQUVBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMscURBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IExldmVsIH0gZnJvbSAnLi9sZXZlbCc7XG5pbXBvcnQgeyBEaXNwbGF5IH0gZnJvbSAnLi9kaXNwbGF5JztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd0bnAtY29yZS9icm93c2VyJztcblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG5cbiAgcHJpdmF0ZSBfbGV2ZWw6IExldmVsO1xuICBwdWJsaWMgc2V0TGV2ZWwobDogTGV2ZWwpIHtcbiAgICB0aGlzLl9sZXZlbCA9IGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHJvZHVjdGlvbk1vZGUoKSB7XG4gICAgcmV0dXJuICF0aGlzLmRldmVsb3BtZW50TW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQcm9kdWN0aW9uTW9kZShwcm9kdWN0aW9uTW9kZTogYm9vbGVhbikge1xuICAgIHRoaXMuZGV2ZWxvcG1lbnRNb2RlID0gIXByb2R1Y3Rpb25Nb2RlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIG11dGUoKSB7XG4gICAgdGhpcy5pc011dGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBjb2xvcjogc3RyaW5nLFxuICAgIHByaXZhdGUgZGV2ZWxvcG1lbnRNb2RlOiBib29sZWFuLFxuICAgIHByaXZhdGUgYWxsb3dlZDogTGV2ZWxbXSxcbiAgICBwcml2YXRlIGlzTXV0ZWQ6IGJvb2xlYW4sXG4gICAgcHVibGljIGZpeGVkV2lkdGg6IG51bWJlciB8IHVuZGVmaW5lZFxuICApIHsgfVxuXG4gIG9ubHlXaGVuKGV4cHJlc3Npb246ICgoKSA9PiBib29sZWFuKSB8IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuaXNNdXRlZCA9ICFleHByZXNzaW9uKClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuaXNNdXRlZCA9ICFleHByZXNzaW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RhdGEobmFtZTogc3RyaW5nLCAuLi5kYXRhOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmlzTXV0ZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID49IDEgJiYgSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuX19OT1RISU5HKVxuICAgICAgJiYgIUhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLkRBVEEpKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID09PSAwIHx8IEhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLkRBVEEpKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBEaXNwbGF5Lm1zZy5hcHBseSh2b2lkIDAsIFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLmNvbG9yLFxuICAgICAgICBMZXZlbC5EQVRBLFxuICAgICAgICB0aGlzLmZpeGVkV2lkdGgsXG4gICAgICAgIHRoaXMuaXNQcm9kdWN0aW9uTW9kZSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfZXJyb3IobmFtZTogc3RyaW5nLCAuLi5kYXRhOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmlzTXV0ZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID49IDEgJiYgSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuX19OT1RISU5HKVxuICAgICAgJiYgIUhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLkVSUk9SKSkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodGhpcy5hbGxvd2VkLmxlbmd0aCA9PT0gMCB8fCBIZWxwZXJzLmNvbnRhaW4odGhpcy5hbGxvd2VkLCBMZXZlbC5FUlJPUikpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIERpc3BsYXkubXNnLmFwcGx5KHZvaWQgMCwgW1xuICAgICAgICBuYW1lLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMuY29sb3IsXG4gICAgICAgIExldmVsLkVSUk9SLFxuICAgICAgICB0aGlzLmZpeGVkV2lkdGgsXG4gICAgICAgIHRoaXMuaXNQcm9kdWN0aW9uTW9kZSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX2luZm8obmFtZTogc3RyaW5nLCAuLi5kYXRhOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmlzTXV0ZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID49IDEgJiYgSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuX19OT1RISU5HKVxuICAgICAgJiYgIUhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLklORk8pKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID09PSAwIHx8IEhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLklORk8pKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBEaXNwbGF5Lm1zZy5hcHBseSh2b2lkIDAsIFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLmNvbG9yLFxuICAgICAgICBMZXZlbC5JTkZPLFxuICAgICAgICB0aGlzLmZpeGVkV2lkdGgsXG4gICAgICAgIHRoaXMuaXNQcm9kdWN0aW9uTW9kZSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX3N1Y2Nlc3MobmFtZTogc3RyaW5nLCAuLi5kYXRhOiBhbnlbXSkge1xuICAgIGlmICh0aGlzLmlzTXV0ZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID49IDEgJiYgSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuX19OT1RISU5HKVxuICAgICAgJiYgIUhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLlNVQ0NFU1MpKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID09PSAwIHx8IEhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLlNVQ0NFU1MpKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBEaXNwbGF5Lm1zZy5hcHBseSh2b2lkIDAsIFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLmNvbG9yLFxuICAgICAgICBMZXZlbC5TVUNDRVNTLFxuICAgICAgICB0aGlzLmZpeGVkV2lkdGgsXG4gICAgICAgIHRoaXMuaXNQcm9kdWN0aW9uTW9kZSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX3Rhc2tTdGFydGVkKG5hbWU6IHN0cmluZywgLi4uZGF0YTogYW55W10pIHtcbiAgICBpZiAodGhpcy5pc011dGVkKSByZXR1cm4gdGhpcztcbiAgICBpZiAodGhpcy5hbGxvd2VkLmxlbmd0aCA+PSAxICYmIEhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLl9fTk9USElORylcbiAgICAgICYmICFIZWxwZXJzLmNvbnRhaW4odGhpcy5hbGxvd2VkLCBMZXZlbC5UQVNLX1NUQVJURUQpKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh0aGlzLmFsbG93ZWQubGVuZ3RoID09PSAwIHx8IEhlbHBlcnMuY29udGFpbih0aGlzLmFsbG93ZWQsIExldmVsLlRBU0tfU1RBUlRFRCkpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIERpc3BsYXkubXNnLmFwcGx5KHZvaWQgMCwgW1xuICAgICAgICBuYW1lLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMuY29sb3IsXG4gICAgICAgIExldmVsLlRBU0tfU1RBUlRFRCxcbiAgICAgICAgdGhpcy5maXhlZFdpZHRoLFxuICAgICAgICB0aGlzLmlzUHJvZHVjdGlvbk1vZGUsXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF90YXNrRG9uZShuYW1lOiBzdHJpbmcsIC4uLmRhdGE6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMuaXNNdXRlZCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKHRoaXMuYWxsb3dlZC5sZW5ndGggPj0gMSAmJiBIZWxwZXJzLmNvbnRhaW4odGhpcy5hbGxvd2VkLCBMZXZlbC5fX05PVEhJTkcpXG4gICAgICAmJiAhSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuVEFTS19ET05FKSkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodGhpcy5hbGxvd2VkLmxlbmd0aCA9PT0gMCB8fCBIZWxwZXJzLmNvbnRhaW4odGhpcy5hbGxvd2VkLCBMZXZlbC5UQVNLX0RPTkUpKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBEaXNwbGF5Lm1zZy5hcHBseSh2b2lkIDAsIFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLmNvbG9yLFxuICAgICAgICBMZXZlbC5UQVNLX0RPTkUsXG4gICAgICAgIHRoaXMuZml4ZWRXaWR0aCxcbiAgICAgICAgdGhpcy5pc1Byb2R1Y3Rpb25Nb2RlLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfd2FybihuYW1lOiBzdHJpbmcsIC4uLmRhdGE6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMuaXNNdXRlZCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKHRoaXMuYWxsb3dlZC5sZW5ndGggPj0gMSAmJiBIZWxwZXJzLmNvbnRhaW4odGhpcy5hbGxvd2VkLCBMZXZlbC5fX05PVEhJTkcpXG4gICAgICAmJiAhSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuV0FSTikpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHRoaXMuYWxsb3dlZC5sZW5ndGggPT09IDAgfHwgSGVscGVycy5jb250YWluKHRoaXMuYWxsb3dlZCwgTGV2ZWwuV0FSTikpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIERpc3BsYXkubXNnLmFwcGx5KHZvaWQgMCwgW1xuICAgICAgICBuYW1lLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMuY29sb3IsXG4gICAgICAgIExldmVsLldBUk4sXG4gICAgICAgIHRoaXMuZml4ZWRXaWR0aCxcbiAgICAgICAgdGhpcy5pc1Byb2R1Y3Rpb25Nb2RlLFxuICAgICAgXSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAc2VlIGRhdGFcbiAgKi9cbiAgZCA9IChuYW1lOiBzdHJpbmcgfCBhbnksIC4uLmRhdGE6IGFueVtdKSA9PiB0aGlzLl9kYXRhKG5hbWUsIGRhdGEpO1xuXG4gIC8qKlxuICAgKiBAc2VlIGVycm9yXG4gICovXG5cbiAgZXIgPSAobmFtZTogc3RyaW5nIHwgYW55LCAuLi5kYXRhOiBhbnlbXSkgPT4gdGhpcy5fZXJyb3IobmFtZSwgZGF0YSk7XG5cbiAgLyoqXG4gICAqIEBzZWUgaW5mb1xuICAqL1xuICBpID0gKG5hbWU6IHN0cmluZyB8IGFueSwgLi4uZGF0YTogYW55W10pID0+IHRoaXMuX2luZm8obmFtZSwgZGF0YSk7XG5cbiAgLyoqXG4gICAqIEBzZWUgd2FyblxuICAqL1xuICB3ID0gKG5hbWU6IHN0cmluZyB8IGFueSwgLi4uZGF0YTogYW55W10pID0+IHRoaXMuX3dhcm4obmFtZSwgZGF0YSk7XG5cbiAgLyoqXG4gICAqIExvZ3MgbWVzc2FnZSBhbmQgZGF0YSB3aXRoIHRoZSBsZXZlbD1kYXRhXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBvdGhlclBhcmFtcyBBZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICovXG4gIGRhdGEgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5vdGhlclBhcmFtczogYW55W10pID0+IHsgcmV0dXJuIHRoaXMuX2RhdGEobWVzc2FnZSwgb3RoZXJQYXJhbXMpOyB9O1xuXG4gIC8qKlxuICAgKiBMb2dzIG1lc3NhZ2UgYW5kIGRhdGEgd2l0aCB0aGUgbGV2ZWw9ZXJyb3JcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIG90aGVyUGFyYW1zIEFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgKi9cbiAgZXJyb3IgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5vdGhlclBhcmFtczogYW55W10pID0+IHRoaXMuX2Vycm9yKG1lc3NhZ2UsIG90aGVyUGFyYW1zKTtcblxuICAvKipcbiAgICogTG9ncyBtZXNzYWdlIGFuZCBkYXRhIHdpdGggdGhlIGxldmVsPWluZm9cbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIG90aGVyUGFyYW1zIEFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgKi9cbiAgaW5mbyA9IChtZXNzYWdlOiBzdHJpbmcsIC4uLm90aGVyUGFyYW1zOiBhbnlbXSkgPT4gdGhpcy5faW5mbyhtZXNzYWdlLCBvdGhlclBhcmFtcyk7XG5cbiAgLyoqXG4gICAqIExvZ3MgbWVzc2FnZSBhbmQgZGF0YSB3aXRoIHRoZSBsZXZlbD1zdWNjZXNzXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBvdGhlclBhcmFtcyBBZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICovXG4gIHN1Y2Nlc3MgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5vdGhlclBhcmFtczogYW55W10pID0+IHRoaXMuX3N1Y2Nlc3MobWVzc2FnZSwgb3RoZXJQYXJhbXMpO1xuXG5cbiAgLyoqXG4gICogTG9ncyBtZXNzYWdlIGFuZCBkYXRhIHdpdGggdGhlIGxldmVsPXRhc2tTdGFydGVkXG4gICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2VcbiAgKiBAcGFyYW0gb3RoZXJQYXJhbXMgQWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICovXG4gIHRhc2tTdGFydGVkID0gKG1lc3NhZ2U6IHN0cmluZywgLi4ub3RoZXJQYXJhbXM6IGFueVtdKSA9PiB0aGlzLl90YXNrU3RhcnRlZChtZXNzYWdlLCBvdGhlclBhcmFtcyk7XG5cbiAgLyoqXG4gICogTG9ncyBtZXNzYWdlIGFuZCBkYXRhIHdpdGggdGhlIGxldmVsPXRhc2tEb25lXG4gICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2VcbiAgKiBAcGFyYW0gb3RoZXJQYXJhbXMgQWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICovXG4gIHRhc2tEb25lID0gKG1lc3NhZ2U/OiBzdHJpbmcsIC4uLm90aGVyUGFyYW1zOiBhbnlbXSkgPT4gdGhpcy5fdGFza0RvbmUobWVzc2FnZSwgb3RoZXJQYXJhbXMpO1xuXG4gIC8qKlxuICAgKiBMb2dzIG1lc3NhZ2UgYW5kIGRhdGEgd2l0aCB0aGUgbGV2ZWw9d2FyblxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gb3RoZXJQYXJhbXMgQWRkaXRpb25hbCBwYXJhbWV0ZXJzXG4gICAqL1xuICB3YXJuID0gKG1lc3NhZ2U6IHN0cmluZywgLi4ub3RoZXJQYXJhbXM6IGFueVtdKSA9PiB0aGlzLl93YXJuKG1lc3NhZ2UsIG90aGVyUGFyYW1zKTtcblxufVxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9bmcyLWxvZ2dlciBsaWIvbG9nZ2VyLnRzIl19