UNPKG

@kephas/core

Version:

Provides a common infrastructure for all the other Kephas Framework components: ambient services, dynamic reflection, composition, application management, and others.

199 lines 19.6 kB
import { __decorate } from "tslib"; import { AppService } from "../services/appService"; import { SingletonAppServiceContract } from "../services/appServiceContract"; import { Priority } from "../services/appServiceMetadata"; /** * Enumerates the logging levels. * * @enum {number} */ export var LogLevel; (function (LogLevel) { /** * Fatal errors. */ LogLevel[LogLevel["Fatal"] = 0] = "Fatal"; /** * Common errors. */ LogLevel[LogLevel["Error"] = 1] = "Error"; /** * Warning information. */ LogLevel[LogLevel["Warning"] = 2] = "Warning"; /** * Common information. */ LogLevel[LogLevel["Info"] = 3] = "Info"; /** * Debugging information. */ LogLevel[LogLevel["Debug"] = 4] = "Debug"; /** * Tracing information. */ LogLevel[LogLevel["Trace"] = 5] = "Trace"; })(LogLevel || (LogLevel = {})); /** * Base service for logging. * * @class Logger */ let Logger = class Logger { constructor() { this._logLevel = LogLevel.Info; } /** * Logs the information at the provided level. * * @param {LogLevel | string} level The logging level. * @param {Error} exception The error that occured (may not be specified). * @param {string} messageFormat The message format. * @param {...any[]} args The arguments for the message format. * @memberof Logger */ log(level, exception, messageFormat, ...args) { if (typeof level === 'string') { level = LogLevel[level]; } if (this.isEnabled(level)) { this.write(level, exception, messageFormat, args); } } /** * Indicates whether logging at the indicated level is enabled. * @param {LogLevel | string} level The logging level. * @return true if enabled, false if not. */ isEnabled(level) { if (typeof level === 'string') { level = LogLevel[level]; } return level <= this._logLevel; } /** * Sets the logging level to the indicated one. * * @param {(LogLevel | string)} level The new log level. * @memberof Logger */ setLevel(level) { if (typeof level === 'string') { level = LogLevel[level]; } this._logLevel = level; } /** * Logs the event at the fatal level. * * @param {Error | string} event The event to be logged. * @param {...any[]} args The arguments for the event. * @memberof Logger */ fatal(event, ...args) { this._log(LogLevel.Fatal, event, args); } /** * Logs the event at the error level. * * @param {Error | string} event The event to be logged. * @param {...any[]} args The arguments for the event. * @memberof Logger */ error(event, ...args) { this._log(LogLevel.Error, event, args); } /** * Logs the event at the warning level. * * @param {Error | string} event The event to be logged. * @param {...any[]} args The arguments for the event. * @memberof Logger */ warn(event, ...args) { this._log(LogLevel.Warning, event, args); } /** * Logs the event at the information level. * * @param {Error | string} event The event to be logged. * @param {...any[]} args The arguments for the event. * @memberof Logger */ info(event, ...args) { this._log(LogLevel.Info, event, args); } /** * Logs the event at the debug level. * * @param {Error | string} event The event to be logged. * @param {...any[]} args The arguments for the event. * @memberof Logger */ debug(event, ...args) { this._log(LogLevel.Debug, event, args); } /** * Logs the event at the trace level. * * @param {Error | string} event The event to be logged. * @param {...any[]} args The arguments for the event. * @memberof Logger */ trace(event, ...args) { this._log(LogLevel.Trace, event, args); } /** * Overridable method for writing to the log. * * @param {LogLevel} level The logging level. * @param {Error} exception The error that occured (may not be specified). * @param {string} messageFormat The message format. * @param {any[]} args The arguments for the message format. * @memberof Logger */ write(level, exception, messageFormat, args) { const message = exception ? exception.message : messageFormat; switch (level) { case LogLevel.Fatal: console.error('FATAL ' + message, ...args); break; case LogLevel.Error: console.error(message, ...args); break; case LogLevel.Warning: console.warn(message, ...args); break; case LogLevel.Info: console.info(message, ...args); break; case LogLevel.Debug: console.debug(message, ...args); break; case LogLevel.Trace: console.trace(message, ...args); break; default: break; } } _log(level, event, args) { if (!this.isEnabled(level)) { return; } if (typeof event === 'string') { this.write(level, null, event, args); } else { const messageFormat = args && args.length && args[0]; args = (args && args.length && args.splice(0, 1)) || []; this.write(level, event, messageFormat, args); } } }; Logger = __decorate([ AppService({ overridePriority: Priority.Low }), SingletonAppServiceContract() ], Logger); export { Logger }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2VwaGFzL2NvcmUvc3JjL2xpYi9sb2dnaW5nL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFOLElBQVksUUE4Qlg7QUE5QkQsV0FBWSxRQUFRO0lBQ2hCOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtJQUVMOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtJQUVMOztPQUVHO0lBQ0gsNkNBQU8sQ0FBQTtJQUVQOztPQUVHO0lBQ0gsdUNBQUksQ0FBQTtJQUVKOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtJQUVMOztPQUVHO0lBQ0gseUNBQUssQ0FBQTtBQUNULENBQUMsRUE5QlcsUUFBUSxLQUFSLFFBQVEsUUE4Qm5CO0FBRUQ7Ozs7R0FJRztBQUdILElBQWEsTUFBTSxHQUFuQixNQUFhLE1BQU07SUFBbkI7UUFDWSxjQUFTLEdBQWEsUUFBUSxDQUFDLElBQUksQ0FBQztJQWtLaEQsQ0FBQztJQWhLRzs7Ozs7Ozs7T0FRRztJQUNILEdBQUcsQ0FBQyxLQUF3QixFQUFFLFNBQW1DLEVBQUUsYUFBcUIsRUFBRSxHQUFHLElBQVc7UUFDcEcsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsS0FBSyxHQUFJLFFBQW9CLENBQUMsS0FBSyxDQUFhLENBQUM7U0FDcEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxJQUFJ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LE1BQU07WUFDVixLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLE1BQU07WUFDVjtnQkFDSSxNQUFNO1NBQ2I7SUFDTCxDQUFDO0lBRU8sSUFBSSxDQUFDLEtBQWUsRUFBRSxLQUFxQixFQUFFLElBQVc7UUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTztTQUNWO1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDakQ7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQW5LWSxNQUFNO0lBRmxCLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM5QywyQkFBMkIsRUFBRTtHQUNqQixNQUFNLENBbUtsQjtTQW5LWSxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXhwYW5kbyB9IGZyb20gXCIuLi9leHBhbmRvXCI7XHJcbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYXBwU2VydmljZVwiO1xyXG5pbXBvcnQgeyBTaW5nbGV0b25BcHBTZXJ2aWNlQ29udHJhY3QgfSBmcm9tIFwiLi4vc2VydmljZXMvYXBwU2VydmljZUNvbnRyYWN0XCI7XHJcbmltcG9ydCB7IFByaW9yaXR5IH0gZnJvbSBcIi4uL3NlcnZpY2VzL2FwcFNlcnZpY2VNZXRhZGF0YVwiO1xyXG5cclxuLyoqXHJcbiAqIEVudW1lcmF0ZXMgdGhlIGxvZ2dpbmcgbGV2ZWxzLlxyXG4gKlxyXG4gKiBAZW51bSB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBGYXRhbCBlcnJvcnMuXHJcbiAgICAgKi9cclxuICAgIEZhdGFsLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tbW9uIGVycm9ycy5cclxuICAgICAqL1xyXG4gICAgRXJyb3IsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXYXJuaW5nIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBXYXJuaW5nLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tbW9uIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBJbmZvLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVidWdnaW5nIGluZm9ybWF0aW9uLlxyXG4gICAgICovXHJcbiAgICBEZWJ1ZyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNpbmcgaW5mb3JtYXRpb24uXHJcbiAgICAgKi9cclxuICAgIFRyYWNlLFxyXG59XHJcblxyXG4vKipcclxuICogQmFzZSBzZXJ2aWNlIGZvciBsb2dnaW5nLlxyXG4gKlxyXG4gKiBAY2xhc3MgTG9nZ2VyXHJcbiAqL1xyXG5AQXBwU2VydmljZSh7IG92ZXJyaWRlUHJpb3JpdHk6IFByaW9yaXR5LkxvdyB9KVxyXG5AU2luZ2xldG9uQXBwU2VydmljZUNvbnRyYWN0KClcclxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XHJcbiAgICBwcml2YXRlIF9sb2dMZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5JbmZvO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0aGUgaW5mb3JtYXRpb24gYXQgdGhlIHByb3ZpZGVkIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TG9nTGV2ZWwgfCBzdHJpbmd9IGxldmVsIFRoZSBsb2dnaW5nIGxldmVsLlxyXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXhjZXB0aW9uIFRoZSBlcnJvciB0aGF0IG9jY3VyZWQgKG1heSBub3QgYmUgc3BlY2lmaWVkKS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlRm9ybWF0IFRoZSBtZXNzYWdlIGZvcm1hdC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIG1lc3NhZ2UgZm9ybWF0LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBsb2cobGV2ZWw6IExvZ0xldmVsIHwgc3RyaW5nLCBleGNlcHRpb246IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgbWVzc2FnZUZvcm1hdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldmVsID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW2xldmVsXSBhcyBMb2dMZXZlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZChsZXZlbCkpIHtcclxuICAgICAgICAgICAgdGhpcy53cml0ZShsZXZlbCwgZXhjZXB0aW9uLCBtZXNzYWdlRm9ybWF0LCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBsb2dnaW5nIGF0IHRoZSBpbmRpY2F0ZWQgbGV2ZWwgaXMgZW5hYmxlZC5cclxuICAgICAqIEBwYXJhbSB7TG9nTGV2ZWwgfCBzdHJpbmd9IGxldmVsIFRoZSBsb2dnaW5nIGxldmVsLlxyXG4gICAgICogQHJldHVybiB0cnVlIGlmIGVuYWJsZWQsIGZhbHNlIGlmIG5vdC5cclxuICAgICAqL1xyXG4gICAgaXNFbmFibGVkKGxldmVsOiBMb2dMZXZlbCB8IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldmVsID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW2xldmVsXSBhcyBMb2dMZXZlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsZXZlbCA8PSB0aGlzLl9sb2dMZXZlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGxvZ2dpbmcgbGV2ZWwgdG8gdGhlIGluZGljYXRlZCBvbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsoTG9nTGV2ZWwgfCBzdHJpbmcpfSBsZXZlbCBUaGUgbmV3IGxvZyBsZXZlbC5cclxuICAgICAqIEBtZW1iZXJvZiBMb2dnZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldExldmVsKGxldmVsOiBMb2dMZXZlbCB8IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxldmVsID0gKExvZ0xldmVsIGFzIEV4cGFuZG8pW2xldmVsXSBhcyBMb2dMZXZlbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2xvZ0xldmVsID0gbGV2ZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgZmF0YWwgbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIGxvZ2dlZC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBmYXRhbChldmVudDogRXJyb3IgfCBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9nKExvZ0xldmVsLkZhdGFsLCBldmVudCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgZXJyb3IgbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIGxvZ2dlZC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBlcnJvcihldmVudDogRXJyb3IgfCBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9nKExvZ0xldmVsLkVycm9yLCBldmVudCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgd2FybmluZyBsZXZlbC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Vycm9yIHwgc3RyaW5nfSBldmVudCBUaGUgZXZlbnQgdG8gYmUgbG9nZ2VkLlxyXG4gICAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTG9nZ2VyXHJcbiAgICAgKi9cclxuICAgIHdhcm4oZXZlbnQ6IEVycm9yIHwgc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5XYXJuaW5nLCBldmVudCwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2dzIHRoZSBldmVudCBhdCB0aGUgaW5mb3JtYXRpb24gbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFcnJvciB8IHN0cmluZ30gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIGxvZ2dlZC5cclxuICAgICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQG1lbWJlcm9mIExvZ2dlclxyXG4gICAgICovXHJcbiAgICBpbmZvKGV2ZW50OiBFcnJvciB8IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9sb2coTG9nTGV2ZWwuSW5mbywgZXZlbnQsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0aGUgZXZlbnQgYXQgdGhlIGRlYnVnIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGV2ZW50IFRoZSBldmVudCB0byBiZSBsb2dnZWQuXHJcbiAgICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudC5cclxuICAgICAqIEBtZW1iZXJvZiBMb2dnZXJcclxuICAgICAqL1xyXG4gICAgZGVidWcoZXZlbnQ6IEVycm9yIHwgc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5EZWJ1ZywgZXZlbnQsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ncyB0aGUgZXZlbnQgYXQgdGhlIHRyYWNlIGxldmVsLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXJyb3IgfCBzdHJpbmd9IGV2ZW50IFRoZSBldmVudCB0byBiZSBsb2dnZWQuXHJcbiAgICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIFRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudC5cclxuICAgICAqIEBtZW1iZXJvZiBMb2dnZXJcclxuICAgICAqL1xyXG4gICAgdHJhY2UoZXZlbnQ6IEVycm9yIHwgc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvZyhMb2dMZXZlbC5UcmFjZSwgZXZlbnQsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGFibGUgbWV0aG9kIGZvciB3cml0aW5nIHRvIHRoZSBsb2cuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgVGhlIGxvZ2dpbmcgbGV2ZWwuXHJcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBleGNlcHRpb24gVGhlIGVycm9yIHRoYXQgb2NjdXJlZCAobWF5IG5vdCBiZSBzcGVjaWZpZWQpLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VGb3JtYXQgVGhlIG1lc3NhZ2UgZm9ybWF0LlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJncyBUaGUgYXJndW1lbnRzIGZvciB0aGUgbWVzc2FnZSBmb3JtYXQuXHJcbiAgICAgKiBAbWVtYmVyb2YgTG9nZ2VyXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB3cml0ZShsZXZlbDogTG9nTGV2ZWwsIGV4Y2VwdGlvbjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBtZXNzYWdlRm9ybWF0OiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV4Y2VwdGlvbiA/IGV4Y2VwdGlvbi5tZXNzYWdlIDogbWVzc2FnZUZvcm1hdDtcclxuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTG9nTGV2ZWwuRmF0YWw6XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGQVRBTCAnICsgbWVzc2FnZSwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5FcnJvcjpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMb2dMZXZlbC5XYXJuaW5nOlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTG9nTGV2ZWwuSW5mbzpcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlLCAuLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsLkRlYnVnOlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExvZ0xldmVsLlRyYWNlOlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS50cmFjZShtZXNzYWdlLCAuLi5hcmdzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvZyhsZXZlbDogTG9nTGV2ZWwsIGV2ZW50OiBFcnJvciB8IHN0cmluZywgYXJnczogYW55W10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKGxldmVsKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLndyaXRlKGxldmVsLCBudWxsLCBldmVudCwgYXJncyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUZvcm1hdCA9IGFyZ3MgJiYgYXJncy5sZW5ndGggJiYgYXJnc1swXTtcclxuICAgICAgICAgICAgYXJncyA9IChhcmdzICYmIGFyZ3MubGVuZ3RoICYmIGFyZ3Muc3BsaWNlKDAsIDEpKSB8fCBbXTtcclxuICAgICAgICAgICAgdGhpcy53cml0ZShsZXZlbCwgZXZlbnQsIG1lc3NhZ2VGb3JtYXQsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=