UNPKG

ionic-logging-service

Version:

Logging functionalities for apps built with Ionic framework

191 lines 19.5 kB
import * as log4javascript from "log4javascript"; import { LogLevelConverter } from "./log-level.converter"; /** * Logger for writing log messages. */ export class Logger { /** * Creates a new instance of a logger. */ constructor(logger) { if (typeof logger === "undefined") { this.logger = log4javascript.getRootLogger(); } else if (typeof logger === "string") { this.logger = log4javascript.getLogger(logger); } else { this.logger = logger; } } /** * Get the log level. */ getLogLevel() { return LogLevelConverter.levelFromLog4Javascript(this.logger.getLevel()); } /** * Set the log level. * * @param level the new log level */ setLogLevel(level) { this.logger.setLevel(LogLevelConverter.levelToLog4Javascript(level)); } /** * Logs a message at level TRACE. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ trace(methodName, ...params) { if (this.logger.isTraceEnabled()) { const args = [methodName]; for (const param of params) { args.push(this.formatArgument(param)); } this.logger.trace.apply(this.logger, args); } } /** * Logs a message at level DEBUG. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ debug(methodName, ...params) { if (this.logger.isDebugEnabled()) { const args = [methodName]; for (const param of params) { args.push(this.formatArgument(param)); } this.logger.debug.apply(this.logger, args); } } /** * Logs a message at level INFO. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ info(methodName, ...params) { if (this.logger.isInfoEnabled()) { const args = [methodName]; for (const param of params) { args.push(this.formatArgument(param)); } this.logger.info.apply(this.logger, args); } } /** * Logs a message at level WARN. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ warn(methodName, ...params) { if (this.logger.isWarnEnabled()) { const args = [methodName]; for (const param of params) { args.push(this.formatArgument(param)); } this.logger.warn.apply(this.logger, args); } } /** * Logs a message at level ERROR. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ error(methodName, ...params) { if (this.logger.isErrorEnabled()) { const args = [methodName]; for (const param of params) { args.push(this.formatArgument(param)); } this.logger.error.apply(this.logger, args); } } /** * Logs a message at level FATAL. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ fatal(methodName, ...params) { if (this.logger.isFatalEnabled()) { const args = [methodName]; for (const param of params) { args.push(this.formatArgument(param)); } this.logger.fatal.apply(this.logger, args); } } /** * Logs the entry into a method. * The method name will be logged at level INFO, the parameters at level DEBUG. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ entry(methodName, ...params) { if (this.logger.isInfoEnabled()) { const args = [methodName, "entry"]; if (this.logger.isDebugEnabled()) { for (const param of params) { args.push(this.formatArgument(param)); } } this.logger.info.apply(this.logger, args); } } /** * Logs the exit of a method. * The method name will be logged at level INFO, the parameters at level DEBUG. * * @param methodName name of the method * @param params optional parameters to be logged; objects will be formatted as JSON */ exit(methodName, ...params) { if (this.logger.isInfoEnabled()) { const args = [methodName, "exit"]; if (this.logger.isDebugEnabled()) { for (const param of params) { args.push(this.formatArgument(param)); } } this.logger.info.apply(this.logger, args); } } /** * Formats the given argument. */ formatArgument(arg) { if (typeof arg === "string") { return arg; } else if (typeof arg === "number") { return arg.toString(); } else if (arg instanceof Error) { // JSON.stringify() returns here "{ }" return arg.toString(); } else { try { return JSON.stringify(arg); } catch (e) { return e.message; } } } /** * Returns the internal Logger (for unit tests only). */ getInternalLogger() { return this.logger; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW9uaWMtbG9nZ2luZy1zZXJ2aWNlL3NyYy9saWIvbG9nZ2VyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxjQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHMUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sTUFBTTtJQUlsQjs7T0FFRztJQUNILFlBQVksTUFBcUI7UUFDaEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM5QyxDQUFDO2FBQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN0QixDQUFDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNqQixPQUFPLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxLQUFlO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFVBQWtCLEVBQUUsR0FBRyxNQUFhO1FBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVB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QUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0YsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQUMsR0FBUTtRQUM3QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQ2pDLHNDQUFzQztZQUN0QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNQLElBQUksQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2xCLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBsb2c0amF2YXNjcmlwdCBmcm9tIFwibG9nNGphdmFzY3JpcHRcIjtcblxuaW1wb3J0IHsgTG9nTGV2ZWxDb252ZXJ0ZXIgfSBmcm9tIFwiLi9sb2ctbGV2ZWwuY29udmVydGVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2xvZy1sZXZlbC5tb2RlbFwiO1xuXG4vKipcbiAqIExvZ2dlciBmb3Igd3JpdGluZyBsb2cgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuXG5cdHByaXZhdGUgbG9nZ2VyOiBsb2c0amF2YXNjcmlwdC5Mb2dnZXI7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSBsb2dnZXIuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihsb2dnZXI/OiBzdHJpbmcgfCBhbnkpIHtcblx0XHRpZiAodHlwZW9mIGxvZ2dlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIgPSBsb2c0amF2YXNjcmlwdC5nZXRSb290TG9nZ2VyKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgbG9nZ2VyID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IGxvZzRqYXZhc2NyaXB0LmdldExvZ2dlcihsb2dnZXIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsb2cgbGV2ZWwuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuXHRcdHJldHVybiBMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21Mb2c0SmF2YXNjcmlwdCh0aGlzLmxvZ2dlci5nZXRMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGxvZyBsZXZlbC5cblx0ICpcblx0ICogQHBhcmFtIGxldmVsIHRoZSBuZXcgbG9nIGxldmVsXG5cdCAqL1xuXHRwdWJsaWMgc2V0TG9nTGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG5cdFx0dGhpcy5sb2dnZXIuc2V0TGV2ZWwoTG9nTGV2ZWxDb252ZXJ0ZXIubGV2ZWxUb0xvZzRKYXZhc2NyaXB0KGxldmVsKSk7XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyBhIG1lc3NhZ2UgYXQgbGV2ZWwgVFJBQ0UuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZFxuXHQgKiBAcGFyYW0gcGFyYW1zIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgbG9nZ2VkOyBvYmplY3RzIHdpbGwgYmUgZm9ybWF0dGVkIGFzIEpTT05cblx0ICovXG5cdHB1YmxpYyB0cmFjZShtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IFttZXRob2ROYW1lXTtcblx0XHRcdGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG5cdFx0XHRcdGFyZ3MucHVzaCh0aGlzLmZvcm1hdEFyZ3VtZW50KHBhcmFtKSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZS5hcHBseSh0aGlzLmxvZ2dlciwgYXJncyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgYSBtZXNzYWdlIGF0IGxldmVsIERFQlVHLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Rcblx0ICogQHBhcmFtIHBhcmFtcyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGxvZ2dlZDsgb2JqZWN0cyB3aWxsIGJlIGZvcm1hdHRlZCBhcyBKU09OXG5cdCAqL1xuXHRwdWJsaWMgZGVidWcobWV0aG9kTmFtZTogc3RyaW5nLCAuLi5wYXJhbXM6IGFueVtdKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IGFyZ3MgPSBbbWV0aG9kTmFtZV07XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0XHRhcmdzLnB1c2godGhpcy5mb3JtYXRBcmd1bWVudChwYXJhbSkpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2dnZXIuZGVidWcuYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGEgbWVzc2FnZSBhdCBsZXZlbCBJTkZPLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Rcblx0ICogQHBhcmFtIHBhcmFtcyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGxvZ2dlZDsgb2JqZWN0cyB3aWxsIGJlIGZvcm1hdHRlZCBhcyBKU09OXG5cdCAqL1xuXHRwdWJsaWMgaW5mbyhtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNJbmZvRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gW21ldGhvZE5hbWVdO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmluZm8uYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGEgbWVzc2FnZSBhdCBsZXZlbCBXQVJOLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2Rcblx0ICogQHBhcmFtIHBhcmFtcyBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGJlIGxvZ2dlZDsgb2JqZWN0cyB3aWxsIGJlIGZvcm1hdHRlZCBhcyBKU09OXG5cdCAqL1xuXHRwdWJsaWMgd2FybihtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNXYXJuRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gW21ldGhvZE5hbWVdO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLndhcm4uYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIGEgbWVzc2FnZSBhdCBsZXZlbCBFUlJPUi5cblx0ICpcblx0ICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kXG5cdCAqIEBwYXJhbSBwYXJhbXMgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBsb2dnZWQ7IG9iamVjdHMgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgSlNPTlxuXHQgKi9cblx0cHVibGljIGVycm9yKG1ldGhvZE5hbWU6IHN0cmluZywgLi4ucGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmxvZ2dlci5pc0Vycm9yRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBhcmdzID0gW21ldGhvZE5hbWVdO1xuXHRcdFx0Zm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcblx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yLmFwcGx5KHRoaXMubG9nZ2VyLCBhcmdzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyBhIG1lc3NhZ2UgYXQgbGV2ZWwgRkFUQUwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZFxuXHQgKiBAcGFyYW0gcGFyYW1zIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgbG9nZ2VkOyBvYmplY3RzIHdpbGwgYmUgZm9ybWF0dGVkIGFzIEpTT05cblx0ICovXG5cdHB1YmxpYyBmYXRhbChtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2dnZXIuaXNGYXRhbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IFttZXRob2ROYW1lXTtcblx0XHRcdGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG5cdFx0XHRcdGFyZ3MucHVzaCh0aGlzLmZvcm1hdEFyZ3VtZW50KHBhcmFtKSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmxvZ2dlci5mYXRhbC5hcHBseSh0aGlzLmxvZ2dlciwgYXJncyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgdGhlIGVudHJ5IGludG8gYSBtZXRob2QuXG5cdCAqIFRoZSBtZXRob2QgbmFtZSB3aWxsIGJlIGxvZ2dlZCBhdCBsZXZlbCBJTkZPLCB0aGUgcGFyYW1ldGVycyBhdCBsZXZlbCBERUJVRy5cblx0ICpcblx0ICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kXG5cdCAqIEBwYXJhbSBwYXJhbXMgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBsb2dnZWQ7IG9iamVjdHMgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgSlNPTlxuXHQgKi9cblx0cHVibGljIGVudHJ5KG1ldGhvZE5hbWU6IHN0cmluZywgLi4ucGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmxvZ2dlci5pc0luZm9FbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IGFyZ3MgPSBbbWV0aG9kTmFtZSwgXCJlbnRyeVwiXTtcblx0XHRcdGlmICh0aGlzLmxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG5cdFx0XHRcdFx0YXJncy5wdXNoKHRoaXMuZm9ybWF0QXJndW1lbnQocGFyYW0pKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5sb2dnZXIuaW5mby5hcHBseSh0aGlzLmxvZ2dlciwgYXJncyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgdGhlIGV4aXQgb2YgYSBtZXRob2QuXG5cdCAqIFRoZSBtZXRob2QgbmFtZSB3aWxsIGJlIGxvZ2dlZCBhdCBsZXZlbCBJTkZPLCB0aGUgcGFyYW1ldGVycyBhdCBsZXZlbCBERUJVRy5cblx0ICpcblx0ICogQHBhcmFtIG1ldGhvZE5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kXG5cdCAqIEBwYXJhbSBwYXJhbXMgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBiZSBsb2dnZWQ7IG9iamVjdHMgd2lsbCBiZSBmb3JtYXR0ZWQgYXMgSlNPTlxuXHQgKi9cblx0cHVibGljIGV4aXQobWV0aG9kTmFtZTogc3RyaW5nLCAuLi5wYXJhbXM6IGFueVtdKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubG9nZ2VyLmlzSW5mb0VuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgYXJncyA9IFttZXRob2ROYW1lLCBcImV4aXRcIl07XG5cdFx0XHRpZiAodGhpcy5sb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0XHRcdGFyZ3MucHVzaCh0aGlzLmZvcm1hdEFyZ3VtZW50KHBhcmFtKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMubG9nZ2VyLmluZm8uYXBwbHkodGhpcy5sb2dnZXIsIGFyZ3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGb3JtYXRzIHRoZSBnaXZlbiBhcmd1bWVudC5cblx0ICovXG5cdHB1YmxpYyBmb3JtYXRBcmd1bWVudChhcmc6IGFueSk6IHN0cmluZyB7XG5cdFx0aWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBhcmc7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRyZXR1cm4gYXJnLnRvU3RyaW5nKCk7XG5cdFx0fSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0Ly8gSlNPTi5zdHJpbmdpZnkoKSByZXR1cm5zIGhlcmUgXCJ7IH1cIlxuXHRcdFx0cmV0dXJuIGFyZy50b1N0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIGUubWVzc2FnZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaW50ZXJuYWwgTG9nZ2VyIChmb3IgdW5pdCB0ZXN0cyBvbmx5KS5cblx0ICovXG5cdHB1YmxpYyBnZXRJbnRlcm5hbExvZ2dlcigpOiBsb2c0amF2YXNjcmlwdC5Mb2dnZXIge1xuXHRcdHJldHVybiB0aGlzLmxvZ2dlcjtcblx0fVxufVxuIl19