PHP WebShell
Текущая директория: /opt/BitGoJS/modules/express/dist
Просмотр файла: config.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.config = exports.DefaultConfig = exports.EnvConfig = exports.ArgConfig = void 0;
exports.forceSecureUrl = forceSecureUrl;
const lodash_1 = require("lodash");
require("dotenv/config");
const args_1 = require("./args");
function readEnvVar(name, ...deprecatedAliases) {
if (process.env[name] !== undefined && process.env[name] !== '') {
return process.env[name];
}
for (const deprecatedAlias of deprecatedAliases) {
if (process.env[deprecatedAlias] !== undefined) {
console.warn(`warning: using deprecated environment variable '${deprecatedAlias}'. Please use the '${name}' environment variable instead.`);
return process.env[deprecatedAlias];
}
}
}
const ArgConfig = (args) => ({
port: args.port,
bind: args.bind,
ipc: args.ipc,
env: args.env,
debugNamespace: args.debugnamespace,
keyPath: args.keypath,
crtPath: args.crtpath,
sslKey: args.sslkey,
sslCert: args.sslcert,
logFile: args.logfile,
disableSSL: args.disablessl,
disableProxy: args.disableproxy,
disableEnvCheck: args.disableenvcheck,
timeout: args.timeout,
customRootUri: args.customrooturi,
customBitcoinNetwork: args.custombitcoinnetwork,
authVersion: args.authVersion,
externalSignerUrl: args.externalSignerUrl,
signerMode: args.signerMode,
signerFileSystemPath: args.signerFileSystemPath,
lightningSignerFileSystemPath: args.lightningSignerFileSystemPath,
keepAliveTimeout: args.keepalivetimeout,
headersTimeout: args.headerstimeout,
});
exports.ArgConfig = ArgConfig;
const EnvConfig = () => ({
port: Number(readEnvVar('BITGO_PORT')),
bind: readEnvVar('BITGO_BIND'),
ipc: readEnvVar('BITGO_IPC'),
env: readEnvVar('BITGO_ENV'),
debugNamespace: (readEnvVar('BITGO_DEBUG_NAMESPACE') || '').split(','),
keyPath: readEnvVar('BITGO_KEYPATH'),
crtPath: readEnvVar('BITGO_CRTPATH'),
sslKey: readEnvVar('BITGO_SSL_KEY'),
sslCert: readEnvVar('BITGO_SSL_CERT'),
logFile: readEnvVar('BITGO_LOGFILE'),
disableSSL: readEnvVar('BITGO_DISABLE_SSL', 'BITGO_DISABLESSL', 'DISABLESSL', 'DISABLE_SSL') ? true : undefined,
disableProxy: readEnvVar('BITGO_DISABLE_PROXY', 'DISABLE_PROXY') ? true : undefined,
disableEnvCheck: readEnvVar('BITGO_DISABLE_ENV_CHECK', 'DISABLE_ENV_CHECK') ? true : undefined,
timeout: Number(readEnvVar('BITGO_TIMEOUT')),
customRootUri: readEnvVar('BITGO_CUSTOM_ROOT_URI'),
customBitcoinNetwork: readEnvVar('BITGO_CUSTOM_BITCOIN_NETWORK'),
authVersion: Number(readEnvVar('BITGO_AUTH_VERSION')),
externalSignerUrl: readEnvVar('BITGO_EXTERNAL_SIGNER_URL'),
signerMode: readEnvVar('BITGO_SIGNER_MODE') ? true : undefined,
signerFileSystemPath: readEnvVar('BITGO_SIGNER_FILE_SYSTEM_PATH'),
lightningSignerFileSystemPath: readEnvVar('BITGO_LIGHTNING_SIGNER_FILE_SYSTEM_PATH'),
keepAliveTimeout: Number(readEnvVar('BITGO_KEEP_ALIVE_TIMEOUT')),
headersTimeout: Number(readEnvVar('BITGO_HEADERS_TIMEOUT')),
});
exports.EnvConfig = EnvConfig;
exports.DefaultConfig = {
port: 3080,
bind: 'localhost',
env: 'test',
debugNamespace: [],
logFile: '',
disableSSL: false,
disableProxy: false,
// BG-9584: temporarily disable env check while we give users time to react to change in runtime behavior
// This will require a major version bump, since this is a breaking change to default behavior.
disableEnvCheck: true,
timeout: 305 * 1000,
authVersion: 2,
};
/**
* Force https:// prefix unless ssl is disabled
* @param url
* @return {string}
*/
function forceSecureUrl(url) {
const regex = new RegExp(/(^\w+:|^)\/\//);
if (regex.test(url)) {
return url.replace(/(^\w+:|^)\/\//, 'https://');
}
return `https://${url}`;
}
/**
* Helper function to merge config sources into a single config object.
*
* Later configs have higher precedence over earlier configs.
*/
function mergeConfigs(...configs) {
function isNilOrNaN(val) {
return (0, lodash_1.isNil)(val) || ((0, lodash_1.isNumber)(val) && isNaN(val));
}
// helper to get the last defined value for a given config key
// from each of the config sources in a type safe manner.
function get(k) {
return configs.reduce((entry, config) => (!isNilOrNaN(config[k]) ? config[k] : entry), exports.DefaultConfig[k]);
}
const disableSSL = get('disableSSL') || false;
let customRootUri = get('customRootUri');
let externalSignerUrl = get('externalSignerUrl');
if (disableSSL !== true) {
if (customRootUri) {
customRootUri = forceSecureUrl(customRootUri);
}
if (externalSignerUrl) {
externalSignerUrl = forceSecureUrl(externalSignerUrl);
}
}
return {
port: get('port'),
bind: get('bind'),
ipc: get('ipc'),
env: get('env'),
debugNamespace: get('debugNamespace'),
keyPath: get('keyPath'),
crtPath: get('crtPath'),
sslKey: get('sslKey'),
sslCert: get('sslCert'),
logFile: get('logFile'),
disableSSL,
disableProxy: get('disableProxy'),
disableEnvCheck: get('disableEnvCheck'),
timeout: get('timeout'),
customRootUri: customRootUri || undefined,
customBitcoinNetwork: get('customBitcoinNetwork'),
authVersion: get('authVersion'),
externalSignerUrl,
signerMode: get('signerMode'),
signerFileSystemPath: get('signerFileSystemPath'),
lightningSignerFileSystemPath: get('lightningSignerFileSystemPath'),
keepAliveTimeout: get('keepAliveTimeout'),
headersTimeout: get('headersTimeout'),
};
}
const config = () => {
const arg = (0, exports.ArgConfig)((0, args_1.args)());
const env = (0, exports.EnvConfig)();
return mergeConfigs(env, arg);
};
exports.config = config;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1SEEsd0NBTUM7QUE1SEQsbUNBQXlDO0FBQ3pDLHlCQUF1QjtBQUV2QixpQ0FBOEI7QUFFOUIsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsaUJBQWlCO0lBQzVDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNoRSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssTUFBTSxlQUFlLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsT0FBTyxDQUFDLElBQUksQ0FDVixtREFBbUQsZUFBZSxzQkFBc0IsSUFBSSxpQ0FBaUMsQ0FDOUgsQ0FBQztZQUNGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUE0Qk0sTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtJQUNmLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtJQUNmLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztJQUNiLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztJQUNiLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztJQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87SUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO0lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMs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QUFDO1FBQ3ZDLE9BQU8sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ3ZCLGFBQWEsRUFBRSxhQUFhLElBQUksU0FBUztRQUN6QyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsc0JBQXNCLENBQUM7UUFDakQsV0FBVyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDL0IsaUJBQWlCO1FBQ2pCLFVBQVUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDO1FBQzdCLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRCw2QkFBNkIsRUFBRSxHQUFHLENBQUMsK0JBQStCLENBQUM7UUFDbkUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDLGNBQWMsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUM7S0FDdEMsQ0FBQztBQUNKLENBQUM7QUFFTSxNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUU7SUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBQSxpQkFBUyxFQUFDLElBQUEsV0FBSSxHQUFFLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFBLGlCQUFTLEdBQUUsQ0FBQztJQUN4QixPQUFPLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBSlcsUUFBQSxNQUFNLFVBSWpCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnROYW1lLCBWMU5ldHdvcmsgfSBmcm9tICdiaXRnbyc7XG5pbXBvcnQgeyBpc05pbCwgaXNOdW1iZXIgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICdkb3RlbnYvY29uZmlnJztcblxuaW1wb3J0IHsgYXJncyB9IGZyb20gJy4vYXJncyc7XG5cbmZ1bmN0aW9uIHJlYWRFbnZWYXIobmFtZSwgLi4uZGVwcmVjYXRlZEFsaWFzZXMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvY2Vzcy5lbnZbbmFtZV0gIT09IHVuZGVmaW5lZCAmJiBwcm9jZXNzLmVudltuYW1lXSAhPT0gJycpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlcHJlY2F0ZWRBbGlhcyBvZiBkZXByZWNhdGVkQWxpYXNlcykge1xuICAgIGlmIChwcm9jZXNzLmVudltkZXByZWNhdGVkQWxpYXNdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYHdhcm5pbmc6IHVzaW5nIGRlcHJlY2F0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7ZGVwcmVjYXRlZEFsaWFzfScuIFBsZWFzZSB1c2UgdGhlICcke25hbWV9JyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbZGVwcmVjYXRlZEFsaWFzXTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWcge1xuICBwb3J0OiBudW1iZXI7XG4gIGJpbmQ6IHN0cmluZztcbiAgaXBjPzogc3RyaW5nO1xuICBlbnY6IEVudmlyb25tZW50TmFtZTtcbiAgZGVidWdOYW1lc3BhY2U6IHN0cmluZ1tdO1xuICBrZXlQYXRoPzogc3RyaW5nO1xuICBjcnRQYXRoPzogc3RyaW5nO1xuICBzc2xLZXk/OiBzdHJpbmc7XG4gIHNzbENlcnQ/OiBzdHJpbmc7XG4gIGxvZ0ZpbGU/OiBzdHJpbmc7XG4gIGRpc2FibGVTU0w6IGJvb2xlYW47XG4gIGRpc2FibGVQcm94eTogYm9vbGVhbjtcbiAgZGlzYWJsZUVudkNoZWNrOiBib29sZWFuO1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGN1c3RvbVJvb3RVcmk/OiBzdHJpbmc7XG4gIGN1c3RvbUJpdGNvaW5OZXR3b3JrPzogVjFOZXR3b3JrO1xuICBhdXRoVmVyc2lvbjogbnVtYmVyO1xuICBleHRlcm5hbFNpZ25lclVybD86IHN0cmluZztcbiAgc2lnbmVyTW9kZT86IGJvb2xlYW47XG4gIHNpZ25lckZpbGVTeXN0ZW1QYXRoPzogc3RyaW5nO1xuICBsaWdodG5pbmdTaWduZXJGaWxlU3lzdGVtUGF0aD86IHN0cmluZztcbiAga2VlcEFsaXZlVGltZW91dD86IG51bWJlcjtcbiAgaGVhZGVyc1RpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBBcmdDb25maWcgPSAoYXJncyk6IFBhcnRpYWw8Q29uZmlnPiA9PiAoe1xuICBwb3J0OiBhcmdzLnBvcnQsXG4gIGJpbmQ6IGFyZ3MuYmluZCxcbiAgaXBjOiBhcmdzLmlwYyxcbiAgZW52OiBhcmdzLmVudixcbiAgZGVidWdOYW1lc3BhY2U6IGFyZ3MuZGVidWduYW1lc3BhY2UsXG4gIGtleVBhdGg6IGFyZ3Mua2V5cGF0aCxcbiAgY3J0UGF0aDogYXJncy5jcnRwYXRoLFxuICBzc2xLZXk6IGFyZ3Muc3Nsa2V5LFxuICBzc2xDZXJ0OiBhcmdzLnNzbGNlcnQsXG4gIGxvZ0ZpbGU6IGFyZ3MubG9nZmlsZSxcbiAgZGlzYWJsZVNTTDogYXJncy5kaXNhYmxlc3NsLFxuICBkaXNhYmxlUHJveHk6IGFyZ3MuZGlzYWJsZXByb3h5LFxuICBkaXNhYmxlRW52Q2hlY2s6IGFyZ3MuZGlzYWJsZWVudmNoZWNrLFxuICB0aW1lb3V0OiBhcmdzLnRpbWVvdXQsXG4gIGN1c3RvbVJvb3RVcmk6IGFyZ3MuY3VzdG9tcm9vdHVyaSxcbiAgY3VzdG9tQml0Y29pbk5ldHdvcms6IGFyZ3MuY3VzdG9tYml0Y29pbm5ldHdvcmssXG4gIGF1dGhWZXJzaW9uOiBhcmdzLmF1dGhWZXJzaW9uLFxuICBleHRlcm5hbFNpZ25lclVybDogYXJncy5leHRlcm5hbFNpZ25lclVybCxcbiAgc2lnbmVyTW9kZTogYXJncy5zaWduZXJNb2RlLFxuICBzaWduZXJGaWxlU3lzdGVtUGF0aDogYXJncy5zaWduZXJGaWxlU3lzdGVtUGF0aCxcbiAgbGlnaHRuaW5nU2lnbmVyRmlsZVN5c3RlbVBhdGg6IGFyZ3MubGlnaHRuaW5nU2lnbmVyRmlsZVN5c3RlbVBhdGgsXG4gIGtlZXBBbGl2ZVRpbWVvdXQ6IGFyZ3Mua2VlcGFsaXZldGltZW91dCxcbiAgaGVhZGVyc1RpbWVvdXQ6IGFyZ3MuaGVhZGVyc3RpbWVvdXQsXG59KTtcblxuZXhwb3J0IGNvbnN0IEVudkNvbmZpZyA9ICgpOiBQYXJ0aWFsPENvbmZpZz4gPT4gKHtcbiAgcG9ydDogTnVtYmVyKHJlYWRFbnZWYXIoJ0JJVEdPX1BPUlQnKSksXG4gIGJpbmQ6IHJlYWRFbnZWYXIoJ0JJVEdPX0JJTkQnKSxcbiAgaXBjOiByZWFkRW52VmFyKCdCSVRHT19JUEMnKSxcbiAgZW52OiByZWFkRW52VmFyKCdCSVRHT19FTlYnKSBhcyBFbnZpcm9ubWVudE5hbWUsXG4gIGRlYnVnTmFtZXNwYWNlOiAocmVhZEVudlZhcignQklUR09fREVCVUdfTkFNRVNQQUNFJykgfHwgJycpLnNwbGl0KCcsJyksXG4gIGtleVBhdGg6IHJlYWRFbnZWYXIoJ0JJVEdPX0tFWVBBVEgnKSxcbiAgY3J0UGF0aDogcmVhZEVudlZhcignQklUR09fQ1JUUEFUSCcpLFxuICBzc2xLZXk6IHJlYWRFbnZWYXIoJ0JJVEdPX1NTTF9LRVknKSxcbiAgc3NsQ2VydDogcmVhZEVudlZhcignQklUR09fU1NMX0NFUlQnKSxcbiAgbG9nRmlsZTogcmVhZEVudlZhcignQklUR09fTE9HRklMRScpLFxuICBkaXNhYmxlU1NMOiByZWFkRW52VmFyKCdCSVRHT19ESVNBQkxFX1NTTCcsICdCSVRHT19ESVNBQkxFU1NMJywgJ0RJU0FCTEVTU0wnLCAnRElTQUJMRV9TU0wnKSA/IHRydWUgOiB1bmRlZmluZWQsXG4gIGRpc2FibGVQcm94eTogcmVhZEVudlZhcignQklUR09fRElTQUJMRV9QUk9YWScsICdESVNBQkxFX1BST1hZJykgPyB0cnVlIDogdW5kZWZpbmVkLFxuICBkaXNhYmxlRW52Q2hlY2s6IHJlYWRFbnZWYXIoJ0JJVEdPX0RJU0FCTEVfRU5WX0NIRUNLJywgJ0RJU0FCTEVfRU5WX0NIRUNLJykgPyB0cnVlIDogdW5kZWZpbmVkLFxuICB0aW1lb3V0OiBOdW1iZXIocmVhZEVudlZhcignQklUR09fVElNRU9VVCcpKSxcbiAgY3VzdG9tUm9vdFVyaTogcmVhZEVudlZhcignQklUR09fQ1VTVE9NX1JPT1RfVVJJJyksXG4gIGN1c3RvbUJpdGNvaW5OZXR3b3JrOiByZWFkRW52VmFyKCdCSVRHT19DVVNUT01fQklUQ09JTl9ORVRXT1JLJykgYXMgVjFOZXR3b3JrLFxuICBhdXRoVmVyc2lvbjogTnVtYmVyKHJlYWRFbnZWYXIoJ0JJVEdPX0FVVEhfVkVSU0lPTicpKSxcbiAgZXh0ZXJuYWxTaWduZXJVcmw6IHJlYWRFbnZWYXIoJ0JJVEdPX0VYVEVSTkFMX1NJR05FUl9VUkwnKSxcbiAgc2lnbmVyTW9kZTogcmVhZEVudlZhcignQklUR09fU0lHTkVSX01PREUnKSA/IHRydWUgOiB1bmRlZmluZWQsXG4gIHNpZ25lckZpbGVTeXN0ZW1QYXRoOiByZWFkRW52VmFyKCdCSVRHT19TSUdORVJfRklMRV9TWVNURU1fUEFUSCcpLFxuICBsaWdodG5pbmdTaWduZXJGaWxlU3lzdGVtUGF0aDogcmVhZEVudlZhcignQklUR09fTElHSFROSU5HX1NJR05FUl9GSUxFX1NZU1RFTV9QQVRIJyksXG4gIGtlZXBBbGl2ZVRpbWVvdXQ6IE51bWJlcihyZWFkRW52VmFyKCdCSVRHT19LRUVQX0FMSVZFX1RJTUVPVVQnKSksXG4gIGhlYWRlcnNUaW1lb3V0OiBOdW1iZXIocmVhZEVudlZhcignQklUR09fSEVBREVSU19USU1FT1VUJykpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29uZmlnOiBDb25maWcgPSB7XG4gIHBvcnQ6IDMwODAsXG4gIGJpbmQ6ICdsb2NhbGhvc3QnLFxuICBlbnY6ICd0ZXN0JyxcbiAgZGVidWdOYW1lc3BhY2U6IFtdLFxuICBsb2dGaWxlOiAnJyxcbiAgZGlzYWJsZVNTTDogZmFsc2UsXG4gIGRpc2FibGVQcm94eTogZmFsc2UsXG4gIC8vIEJHLTk1ODQ6IHRlbXBvcmFyaWx5IGRpc2FibGUgZW52IGNoZWNrIHdoaWxlIHdlIGdpdmUgdXNlcnMgdGltZSB0byByZWFjdCB0byBjaGFuZ2UgaW4gcnVudGltZSBiZWhhdmlvclxuICAvLyBUaGlzIHdpbGwgcmVxdWlyZSBhIG1ham9yIHZlcnNpb24gYnVtcCwgc2luY2UgdGhpcyBpcyBhIGJyZWFraW5nIGNoYW5nZSB0byBkZWZhdWx0IGJlaGF2aW9yLlxuICBkaXNhYmxlRW52Q2hlY2s6IHRydWUsXG4gIHRpbWVvdXQ6IDMwNSAqIDEwMDAsXG4gIGF1dGhWZXJzaW9uOiAyLFxufTtcblxuLyoqXG4gKiBGb3JjZSBodHRwczovLyBwcmVmaXggdW5sZXNzIHNzbCBpcyBkaXNhYmxlZFxuICogQHBhcmFtIHVybFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yY2VTZWN1cmVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoLyheXFx3Kzp8XilcXC9cXC8vKTtcbiAgaWYgKHJlZ2V4LnRlc3QodXJsKSkge1xuICAgIHJldHVybiB1cmwucmVwbGFjZSgvKF5cXHcrOnxeKVxcL1xcLy8sICdodHRwczovLycpO1xuICB9XG4gIHJldHVybiBgaHR0cHM6Ly8ke3VybH1gO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBtZXJnZSBjb25maWcgc291cmNlcyBpbnRvIGEgc2luZ2xlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogTGF0ZXIgY29uZmlncyBoYXZlIGhpZ2hlciBwcmVjZWRlbmNlIG92ZXIgZWFybGllciBjb25maWdzLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZ3MoLi4uY29uZmlnczogUGFydGlhbDxDb25maWc+W10pOiBDb25maWcge1xuICBmdW5jdGlvbiBpc05pbE9yTmFOKHZhbDogdW5rbm93bik6IHZhbCBpcyBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gaXNOaWwodmFsKSB8fCAoaXNOdW1iZXIodmFsKSAmJiBpc05hTih2YWwpKTtcbiAgfVxuXG4gIC8vIGhlbHBlciB0byBnZXQgdGhlIGxhc3QgZGVmaW5lZCB2YWx1ZSBmb3IgYSBnaXZlbiBjb25maWcga2V5XG4gIC8vIGZyb20gZWFjaCBvZiB0aGUgY29uZmlnIHNvdXJjZXMgaW4gYSB0eXBlIHNhZmUgbWFubmVyLlxuICBmdW5jdGlvbiBnZXQ8VCBleHRlbmRzIGtleW9mIENvbmZpZz4oazogVCk6IENvbmZpZ1tUXSB7XG4gICAgcmV0dXJuIGNvbmZpZ3MucmVkdWNlKFxuICAgICAgKGVudHJ5OiBDb25maWdbVF0sIGNvbmZpZykgPT4gKCFpc05pbE9yTmFOKGNvbmZpZ1trXSkgPyAoY29uZmlnW2tdIGFzIENvbmZpZ1tUXSkgOiBlbnRyeSksXG4gICAgICBEZWZhdWx0Q29uZmlnW2tdXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGRpc2FibGVTU0wgPSBnZXQoJ2Rpc2FibGVTU0wnKSB8fCBmYWxzZTtcbiAgbGV0IGN1c3RvbVJvb3RVcmkgPSBnZXQoJ2N1c3RvbVJvb3RVcmknKTtcbiAgbGV0IGV4dGVybmFsU2lnbmVyVXJsID0gZ2V0KCdleHRlcm5hbFNpZ25lclVybCcpO1xuXG4gIGlmIChkaXNhYmxlU1NMICE9PSB0cnVlKSB7XG4gICAgaWYgKGN1c3RvbVJvb3RVcmkpIHtcbiAgICAgIGN1c3RvbVJvb3RVcmkgPSBmb3JjZVNlY3VyZVVybChjdXN0b21Sb290VXJpKTtcbiAgICB9XG4gICAgaWYgKGV4dGVybmFsU2lnbmVyVXJsKSB7XG4gICAgICBleHRlcm5hbFNpZ25lclVybCA9IGZvcmNlU2VjdXJlVXJsKGV4dGVybmFsU2lnbmVyVXJsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBvcnQ6IGdldCgncG9ydCcpLFxuICAgIGJpbmQ6IGdldCgnYmluZCcpLFxuICAgIGlwYzogZ2V0KCdpcGMnKSxcbiAgICBlbnY6IGdldCgnZW52JyksXG4gICAgZGVidWdOYW1lc3BhY2U6IGdldCgnZGVidWdOYW1lc3BhY2UnKSxcbiAgICBrZXlQYXRoOiBnZXQoJ2tleVBhdGgnKSxcbiAgICBjcnRQYXRoOiBnZXQoJ2NydFBhdGgnKSxcbiAgICBzc2xLZXk6IGdldCgnc3NsS2V5JyksXG4gICAgc3NsQ2VydDogZ2V0KCdzc2xDZXJ0JyksXG4gICAgbG9nRmlsZTogZ2V0KCdsb2dGaWxlJyksXG4gICAgZGlzYWJsZVNTTCxcbiAgICBkaXNhYmxlUHJveHk6IGdldCgnZGlzYWJsZVByb3h5JyksXG4gICAgZGlzYWJsZUVudkNoZWNrOiBnZXQoJ2Rpc2FibGVFbnZDaGVjaycpLFxuICAgIHRpbWVvdXQ6IGdldCgndGltZW91dCcpLFxuICAgIGN1c3RvbVJvb3RVcmk6IGN1c3RvbVJvb3RVcmkgfHwgdW5kZWZpbmVkLFxuICAgIGN1c3RvbUJpdGNvaW5OZXR3b3JrOiBnZXQoJ2N1c3RvbUJpdGNvaW5OZXR3b3JrJyksXG4gICAgYXV0aFZlcnNpb246IGdldCgnYXV0aFZlcnNpb24nKSxcbiAgICBleHRlcm5hbFNpZ25lclVybCxcbiAgICBzaWduZXJNb2RlOiBnZXQoJ3NpZ25lck1vZGUnKSxcbiAgICBzaWduZXJGaWxlU3lzdGVtUGF0aDogZ2V0KCdzaWduZXJGaWxlU3lzdGVtUGF0aCcpLFxuICAgIGxpZ2h0bmluZ1NpZ25lckZpbGVTeXN0ZW1QYXRoOiBnZXQoJ2xpZ2h0bmluZ1NpZ25lckZpbGVTeXN0ZW1QYXRoJyksXG4gICAga2VlcEFsaXZlVGltZW91dDogZ2V0KCdrZWVwQWxpdmVUaW1lb3V0JyksXG4gICAgaGVhZGVyc1RpbWVvdXQ6IGdldCgnaGVhZGVyc1RpbWVvdXQnKSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmZpZyA9ICgpID0+IHtcbiAgY29uc3QgYXJnID0gQXJnQ29uZmlnKGFyZ3MoKSk7XG4gIGNvbnN0IGVudiA9IEVudkNvbmZpZygpO1xuICByZXR1cm4gbWVyZ2VDb25maWdzKGVudiwgYXJnKTtcbn07XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!