aws-cdk
Version:
AWS CDK CLI, the command line tool for CDK apps
162 lines • 19.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.highlight = exports.success = exports.trace = exports.debug = exports.result = exports.info = exports.warning = exports.error = void 0;
const chalk = require("chalk");
const cli_io_host_1 = require("./cli/io-host/cli-io-host");
const private_1 = require("../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private");
/**
* Logs messages to the global CliIoHost
*
* Internal helper that processes log inputs into a consistent format.
* Handles string interpolation, format strings, and object parameter styles.
* Applies optional styling and sends the message to the IoHost.
*/
function formatMessageAndLog(level, input, ...args) {
const singletonHost = cli_io_host_1.CliIoHost.instance();
// ALARM: forcing a CliAction into a ToolkitAction.
const helper = (0, private_1.asIoHelper)(singletonHost, singletonHost.currentAction);
if (typeof input === 'string') {
const messages = new private_1.IoDefaultMessages(helper);
messages[level](input, ...args);
}
else {
void helper.notify({
data: undefined,
time: new Date(),
level,
...input,
});
}
}
// Exported logging functions. If any additional logging functionality is required, it should be added as
// a new logging function here.
/**
* Logs an error level message.
*
* Can be used in multiple ways:
* ```ts
* error(`operation failed: ${e}`) // infers default error code `CDK_TOOLKIT_E000`
* error('operation failed: %s', e) // infers default error code `CDK_TOOLKIT_E000`
* error({ message: 'operation failed', code: 'CDK_SDK_E001' }) // specifies error code `CDK_SDK_E001`
* error({ message: 'operation failed: %s', code: 'CDK_SDK_E001' }, e) // specifies error code `CDK_SDK_E001`
* ```
*/
const error = (input, ...args) => {
return formatMessageAndLog('error', input, ...args);
};
exports.error = error;
/**
* Logs an warning level message.
*
* Can be used in multiple ways:
* ```ts
* warning(`deprected feature: ${message}`) // infers default warning code `CDK_TOOLKIT_W000`
* warning('deprected feature: %s', message) // infers default warning code `CDK_TOOLKIT_W000`
* warning({ message: 'deprected feature', code: 'CDK_SDK_W001' }) // specifies warning code `CDK_SDK_W001`
* warning({ message: 'deprected feature: %s', code: 'CDK_SDK_W001' }, message) // specifies warning code `CDK_SDK_W001`
* ```
*/
const warning = (input, ...args) => {
return formatMessageAndLog('warn', input, ...args);
};
exports.warning = warning;
/**
* Logs an info level message.
*
* Can be used in multiple ways:
* ```ts
* info(`processing: ${message}`) // infers default info code `CDK_TOOLKIT_I000`
* info('processing: %s', message) // infers default info code `CDK_TOOLKIT_I000`
* info({ message: 'processing', code: 'CDK_TOOLKIT_I001' }) // specifies info code `CDK_TOOLKIT_I001`
* info({ message: 'processing: %s', code: 'CDK_TOOLKIT_I001' }, message) // specifies info code `CDK_TOOLKIT_I001`
* ```
*/
const info = (input, ...args) => {
return formatMessageAndLog('info', input, ...args);
};
exports.info = info;
/**
* Logs an result. In the CLI, this always goes to stdout.
*
* Can be used in multiple ways:
* ```ts
* result(`${JSON.stringify(stats)}`) // infers default info code `CDK_TOOLKIT_I000`
* result('{"count": %d}', count) // infers default info code `CDK_TOOLKIT_I000`
* result({ message: 'stats: %j', code: 'CDK_DATA_I001' }) // specifies info code `CDK_DATA_I001`
* result({ message: 'stats: %j', code: 'CDK_DATA_I001' }, stats) // specifies info code `CDK_DATA_I001`
* ```
*/
const result = (input, ...args) => {
return formatMessageAndLog('result', input, ...args);
};
exports.result = result;
/**
* Logs a debug level message.
*
* Can be used in multiple ways:
* ```ts
* debug(`state: ${JSON.stringify(state)}`) // infers default info code `CDK_TOOLKIT_I000`
* debug('cache hit ratio: %d%%', ratio) // infers default info code `CDK_TOOLKIT_I000`
* debug({ message: 'state update', code: 'CDK_TOOLKIT_I001' }) // specifies info code `CDK_TOOLKIT_I001`
* debug({ message: 'ratio: %d%%', code: 'CDK_TOOLKIT_I001' }, ratio) // specifies info code `CDK_TOOLKIT_I001`
* ```
*/
const debug = (input, ...args) => {
return formatMessageAndLog('debug', input, ...args);
};
exports.debug = debug;
/**
* Logs a trace level message.
*
* Can be used in multiple ways:
* ```ts
* trace(`entered ${name} with ${args}`) // infers default info code `CDK_TOOLKIT_I000`
* trace('method: %s, args: %j', name, args) // infers default info code `CDK_TOOLKIT_I000`
* trace({ message: 'entered', code: 'CDK_TOOLKIT_I001' }) // specifies info code `CDK_TOOLKIT_I001`
* trace({ message: 'method: %s', code: 'CDK_TOOLKIT_I001' }, name) // specifies info code `CDK_TOOLKIT_I001`
* ```
*/
const trace = (input, ...args) => {
return formatMessageAndLog('trace', input, ...args);
};
exports.trace = trace;
/**
* Logs an info level success message in green text.
*
* Can be used in multiple ways:
* ```ts
* success(`deployment completed: ${name}`) // infers default info code `CDK_TOOLKIT_I000`
* success('processed %d items', count) // infers default info code `CDK_TOOLKIT_I000`
* success({ message: 'completed', code: 'CDK_TOOLKIT_I001' }) // specifies info code `CDK_TOOLKIT_I001`
* success({ message: 'items: %d', code: 'CDK_TOOLKIT_I001' }, count) // specifies info code `CDK_TOOLKIT_I001`
* ```
*/
const success = (input, ...args) => {
return formatMessageAndLog('info', chalkInput(input, chalk.green), ...args);
};
exports.success = success;
/**
* Logs an info level message in bold text.
*
* Can be used in multiple ways:
* ```ts
* highlight(`important: ${msg}`) // infers default info code `CDK_TOOLKIT_I000`
* highlight('attention required: %s', reason) // infers default info code `CDK_TOOLKIT_I000`
* highlight({ message: 'notice', code: 'CDK_TOOLKIT_I001' }) // specifies info code `CDK_TOOLKIT_I001`
* highlight({ message: 'notice: %s', code: 'CDK_TOOLKIT_I001' }, msg) // specifies info code `CDK_TOOLKIT_I001`
* ```
*/
const highlight = (input, ...args) => {
return formatMessageAndLog('info', chalkInput(input, chalk.bold), ...args);
};
exports.highlight = highlight;
function chalkInput(i, style) {
if (typeof i === 'string') {
return style(i);
}
return {
...i,
message: style(i.message),
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRS9CLDJEQUFzRDtBQUN0RCxtRkFBc0c7QUFNdEc7Ozs7OztHQU1HO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBcUIsRUFDckIsS0FBNEIsRUFDNUIsR0FBRyxJQUFlO0lBRWxCLE1BQU0sYUFBYSxHQUFHLHVCQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsbURBQW1EO0lBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQVUsRUFBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQW9CLENBQUMsQ0FBQztJQUU3RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksMkJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ2hCLEtBQUs7WUFDTCxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQztBQWlCRCx5R0FBeUc7QUFDekcsK0JBQStCO0FBRS9COzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQW9CLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtJQUNoRSxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFGVyxRQUFBLEtBQUssU0FFaEI7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7SUFDbEUsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxPQUFPLFdBRWxCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQy9ELE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUZXLFFBQUEsSUFBSSxRQUVmO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZELENBQUMsQ0FBQztBQUZXLFFBQUEsTUFBTSxVQUVqQjtBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQW9CLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtJQUNoRSxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0RCxDQUFDLENBQUM7QUFGVyxRQUFBLEtBQUssU0FFaEI7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7SUFDaEUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRlcsUUFBQSxLQUFLLFNBRWhCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ2xFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUFDO0FBRlcsUUFBQSxPQUFPLFdBRWxCO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBb0IsRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFO0lBQ3BFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0UsQ0FBQyxDQUFDO0FBRlcsUUFBQSxTQUFTLGFBRXBCO0FBRUYsU0FBUyxVQUFVLENBQTBCLENBQUksRUFBRSxLQUE4QjtJQUMvRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxDQUFRO1FBQ1gsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQzFCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBJb01lc3NhZ2VMZXZlbCB9IGZyb20gJy4vY2xpL2lvLWhvc3QvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0IH0gZnJvbSAnLi9jbGkvaW8taG9zdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgeyBhc0lvSGVscGVyLCBJb0RlZmF1bHRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wcml2YXRlJztcblxuZXhwb3J0IHR5cGUgSW9NZXNzYWdlQ29kZUNhdGVnb3J5ID0gJ1RPT0xLSVQnIHwgJ1NESycgfCAnQVNTRVRTJztcbmV4cG9ydCB0eXBlIElvQ29kZUxldmVsID0gJ0UnIHwgJ1cnIHwgJ0knO1xuZXhwb3J0IHR5cGUgSW9NZXNzYWdlU3BlY2lmaWNDb2RlPEwgZXh0ZW5kcyBJb0NvZGVMZXZlbD4gPSBgQ0RLXyR7SW9NZXNzYWdlQ29kZUNhdGVnb3J5fV8ke0x9JHtudW1iZXJ9JHtudW1iZXJ9JHtudW1iZXJ9JHtudW1iZXJ9YDtcblxuLyoqXG4gKiBMb2dzIG1lc3NhZ2VzIHRvIHRoZSBnbG9iYWwgQ2xpSW9Ib3N0XG4gKlxuICogSW50ZXJuYWwgaGVscGVyIHRoYXQgcHJvY2Vzc2VzIGxvZyBpbnB1dHMgaW50byBhIGNvbnNpc3RlbnQgZm9ybWF0LlxuICogSGFuZGxlcyBzdHJpbmcgaW50ZXJwb2xhdGlvbiwgZm9ybWF0IHN0cmluZ3MsIGFuZCBvYmplY3QgcGFyYW1ldGVyIHN0eWxlcy5cbiAqIEFwcGxpZXMgb3B0aW9uYWwgc3R5bGluZyBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIElvSG9zdC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TWVzc2FnZUFuZExvZyhcbiAgbGV2ZWw6IElvTWVzc2FnZUxldmVsLFxuICBpbnB1dDogTG9nSW5wdXQ8SW9Db2RlTGV2ZWw+LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IHZvaWQge1xuICBjb25zdCBzaW5nbGV0b25Ib3N0ID0gQ2xpSW9Ib3N0Lmluc3RhbmNlKCk7XG4gIC8vIEFMQVJNOiBmb3JjaW5nIGEgQ2xpQWN0aW9uIGludG8gYSBUb29sa2l0QWN0aW9uLlxuICBjb25zdCBoZWxwZXIgPSBhc0lvSGVscGVyKHNpbmdsZXRvbkhvc3QsIHNpbmdsZXRvbkhvc3QuY3VycmVudEFjdGlvbiBhcyBhbnkpO1xuXG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBuZXcgSW9EZWZhdWx0TWVzc2FnZXMoaGVscGVyKTtcbiAgICBtZXNzYWdlc1tsZXZlbF0oaW5wdXQsIC4uLmFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZvaWQgaGVscGVyLm5vdGlmeSh7XG4gICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICAuLi5pbnB1dCxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBUeXBlIGZvciB0aGUgb2JqZWN0IHBhcmFtZXRlciBzdHlsZVxuaW50ZXJmYWNlIExvZ1BhcmFtczxMIGV4dGVuZHMgSW9Db2RlTGV2ZWw+IHtcbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogSW9NZXNzYWdlU3BlY2lmaWNDb2RlPEw+O1xuICAvKipcbiAgICogTWVzc2FnZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vLyBUeXBlIGZvciB0aGUgZXhwb3J0ZWQgbG9nIGZ1bmN0aW9uIGFyZ3VtZW50c1xudHlwZSBMb2dJbnB1dDxMIGV4dGVuZHMgSW9Db2RlTGV2ZWw+ID0gc3RyaW5nIHwgTG9nUGFyYW1zPEw+O1xuXG4vLyBFeHBvcnRlZCBsb2dnaW5nIGZ1bmN0aW9ucy4gSWYgYW55IGFkZGl0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgYmUgYWRkZWQgYXNcbi8vIGEgbmV3IGxvZ2dpbmcgZnVuY3Rpb24gaGVyZS5cblxuLyoqXG4gKiBMb2dzIGFuIGVycm9yIGxldmVsIG1lc3NhZ2UuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiBlcnJvcihgb3BlcmF0aW9uIGZhaWxlZDogJHtlfWApIC8vIGluZmVycyBkZWZhdWx0IGVycm9yIGNvZGUgYENES19UT09MS0lUX0UwMDBgXG4gKiBlcnJvcignb3BlcmF0aW9uIGZhaWxlZDogJXMnLCBlKSAvLyBpbmZlcnMgZGVmYXVsdCBlcnJvciBjb2RlIGBDREtfVE9PTEtJVF9FMDAwYFxuICogZXJyb3IoeyBtZXNzYWdlOiAnb3BlcmF0aW9uIGZhaWxlZCcsIGNvZGU6ICdDREtfU0RLX0UwMDEnIH0pIC8vIHNwZWNpZmllcyBlcnJvciBjb2RlIGBDREtfU0RLX0UwMDFgXG4gKiBlcnJvcih7IG1lc3NhZ2U6ICdvcGVyYXRpb24gZmFpbGVkOiAlcycsIGNvZGU6ICdDREtfU0RLX0UwMDEnIH0sIGUpIC8vIHNwZWNpZmllcyBlcnJvciBjb2RlIGBDREtfU0RLX0UwMDFgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGVycm9yID0gKGlucHV0OiBMb2dJbnB1dDwnRSc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ2Vycm9yJywgaW5wdXQsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGFuIHdhcm5pbmcgbGV2ZWwgbWVzc2FnZS5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIHdhcm5pbmcoYGRlcHJlY3RlZCBmZWF0dXJlOiAke21lc3NhZ2V9YCkgLy8gaW5mZXJzIGRlZmF1bHQgd2FybmluZyBjb2RlIGBDREtfVE9PTEtJVF9XMDAwYFxuICogd2FybmluZygnZGVwcmVjdGVkIGZlYXR1cmU6ICVzJywgbWVzc2FnZSkgLy8gaW5mZXJzIGRlZmF1bHQgd2FybmluZyBjb2RlIGBDREtfVE9PTEtJVF9XMDAwYFxuICogd2FybmluZyh7IG1lc3NhZ2U6ICdkZXByZWN0ZWQgZmVhdHVyZScsIGNvZGU6ICdDREtfU0RLX1cwMDEnIH0pIC8vIHNwZWNpZmllcyB3YXJuaW5nIGNvZGUgYENES19TREtfVzAwMWBcbiAqIHdhcm5pbmcoeyBtZXNzYWdlOiAnZGVwcmVjdGVkIGZlYXR1cmU6ICVzJywgY29kZTogJ0NES19TREtfVzAwMScgfSwgbWVzc2FnZSkgLy8gc3BlY2lmaWVzIHdhcm5pbmcgY29kZSBgQ0RLX1NES19XMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3YXJuaW5nID0gKGlucHV0OiBMb2dJbnB1dDwnVyc+LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgcmV0dXJuIGZvcm1hdE1lc3NhZ2VBbmRMb2coJ3dhcm4nLCBpbnB1dCwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYW4gaW5mbyBsZXZlbCBtZXNzYWdlLlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogaW5mbyhgcHJvY2Vzc2luZzogJHttZXNzYWdlfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGluZm8oJ3Byb2Nlc3Npbmc6ICVzJywgbWVzc2FnZSkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogaW5mbyh7IG1lc3NhZ2U6ICdwcm9jZXNzaW5nJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBpbmZvKHsgbWVzc2FnZTogJ3Byb2Nlc3Npbmc6ICVzJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0sIG1lc3NhZ2UpIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGluZm8gPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygnaW5mbycsIGlucHV0LCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhbiByZXN1bHQuIEluIHRoZSBDTEksIHRoaXMgYWx3YXlzIGdvZXMgdG8gc3Rkb3V0LlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogcmVzdWx0KGAke0pTT04uc3RyaW5naWZ5KHN0YXRzKX1gKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiByZXN1bHQoJ3tcImNvdW50XCI6ICVkfScsIGNvdW50KSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiByZXN1bHQoeyBtZXNzYWdlOiAnc3RhdHM6ICVqJywgY29kZTogJ0NES19EQVRBX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19EQVRBX0kwMDFgXG4gKiByZXN1bHQoeyBtZXNzYWdlOiAnc3RhdHM6ICVqJywgY29kZTogJ0NES19EQVRBX0kwMDEnIH0sIHN0YXRzKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfREFUQV9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCByZXN1bHQgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygncmVzdWx0JywgaW5wdXQsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBMb2dzIGEgZGVidWcgbGV2ZWwgbWVzc2FnZS5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIGRlYnVnKGBzdGF0ZTogJHtKU09OLnN0cmluZ2lmeShzdGF0ZSl9YCkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogZGVidWcoJ2NhY2hlIGhpdCByYXRpbzogJWQlJScsIHJhdGlvKSAvLyBpbmZlcnMgZGVmYXVsdCBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDBgXG4gKiBkZWJ1Zyh7IG1lc3NhZ2U6ICdzdGF0ZSB1cGRhdGUnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGRlYnVnKHsgbWVzc2FnZTogJ3JhdGlvOiAlZCUlJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0sIHJhdGlvKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBkZWJ1ZyA9IChpbnB1dDogTG9nSW5wdXQ8J0knPiwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIHJldHVybiBmb3JtYXRNZXNzYWdlQW5kTG9nKCdkZWJ1ZycsIGlucHV0LCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhIHRyYWNlIGxldmVsIG1lc3NhZ2UuXG4gKlxuICogQ2FuIGJlIHVzZWQgaW4gbXVsdGlwbGUgd2F5czpcbiAqIGBgYHRzXG4gKiB0cmFjZShgZW50ZXJlZCAke25hbWV9IHdpdGggJHthcmdzfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHRyYWNlKCdtZXRob2Q6ICVzLCBhcmdzOiAlaicsIG5hbWUsIGFyZ3MpIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHRyYWNlKHsgbWVzc2FnZTogJ2VudGVyZWQnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIHRyYWNlKHsgbWVzc2FnZTogJ21ldGhvZDogJXMnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSwgbmFtZSkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgdHJhY2UgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygndHJhY2UnLCBpbnB1dCwgLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIExvZ3MgYW4gaW5mbyBsZXZlbCBzdWNjZXNzIG1lc3NhZ2UgaW4gZ3JlZW4gdGV4dC5cbiAqXG4gKiBDYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB3YXlzOlxuICogYGBgdHNcbiAqIHN1Y2Nlc3MoYGRlcGxveW1lbnQgY29tcGxldGVkOiAke25hbWV9YCkgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogc3VjY2VzcygncHJvY2Vzc2VkICVkIGl0ZW1zJywgY291bnQpIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIHN1Y2Nlc3MoeyBtZXNzYWdlOiAnY29tcGxldGVkJywgY29kZTogJ0NES19UT09MS0lUX0kwMDEnIH0pIC8vIHNwZWNpZmllcyBpbmZvIGNvZGUgYENES19UT09MS0lUX0kwMDFgXG4gKiBzdWNjZXNzKHsgbWVzc2FnZTogJ2l0ZW1zOiAlZCcsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9LCBjb3VudCkgLy8gc3BlY2lmaWVzIGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMWBcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc3VjY2VzcyA9IChpbnB1dDogTG9nSW5wdXQ8J0knPiwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIHJldHVybiBmb3JtYXRNZXNzYWdlQW5kTG9nKCdpbmZvJywgY2hhbGtJbnB1dChpbnB1dCwgY2hhbGsuZ3JlZW4pLCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogTG9ncyBhbiBpbmZvIGxldmVsIG1lc3NhZ2UgaW4gYm9sZCB0ZXh0LlxuICpcbiAqIENhbiBiZSB1c2VkIGluIG11bHRpcGxlIHdheXM6XG4gKiBgYGB0c1xuICogaGlnaGxpZ2h0KGBpbXBvcnRhbnQ6ICR7bXNnfWApIC8vIGluZmVycyBkZWZhdWx0IGluZm8gY29kZSBgQ0RLX1RPT0xLSVRfSTAwMGBcbiAqIGhpZ2hsaWdodCgnYXR0ZW50aW9uIHJlcXVpcmVkOiAlcycsIHJlYXNvbikgLy8gaW5mZXJzIGRlZmF1bHQgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAwYFxuICogaGlnaGxpZ2h0KHsgbWVzc2FnZTogJ25vdGljZScsIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAxJyB9KSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogaGlnaGxpZ2h0KHsgbWVzc2FnZTogJ25vdGljZTogJXMnLCBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMScgfSwgbXNnKSAvLyBzcGVjaWZpZXMgaW5mbyBjb2RlIGBDREtfVE9PTEtJVF9JMDAxYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBoaWdobGlnaHQgPSAoaW5wdXQ6IExvZ0lucHV0PCdJJz4sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICByZXR1cm4gZm9ybWF0TWVzc2FnZUFuZExvZygnaW5mbycsIGNoYWxrSW5wdXQoaW5wdXQsIGNoYWxrLmJvbGQpLCAuLi5hcmdzKTtcbn07XG5cbmZ1bmN0aW9uIGNoYWxrSW5wdXQ8QSBleHRlbmRzIExvZ0lucHV0PGFueT4+KGk6IEEsIHN0eWxlOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZyk6IEEge1xuICBpZiAodHlwZW9mIGkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0eWxlKGkpIGFzIEE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmkgYXMgYW55LFxuICAgIG1lc3NhZ2U6IHN0eWxlKGkubWVzc2FnZSksXG4gIH07XG59XG4iXX0=
;