@meteor-community/meteor-desktop
Version:
Build a Meteor's desktop client with hot code push.
232 lines (215 loc) • 32.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _path = _interopRequireDefault(require("path"));
var _os = _interopRequireDefault(require("os"));
var _assignIn = _interopRequireDefault(require("lodash/assignIn"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const {
join
} = _path.default;
/**
* @class
* @property {packagePaths} paths
*/
class Env {
constructor(input, output, options) {
this.options = options;
if (this.isProductionBuild()) {
process.env.NODE_ENV = 'production';
}
this.sys = {
platform: process.platform,
arch: process.arch
};
// Operational System.
this.os = {
isWindows: process.platform === 'win32',
isLinux: process.platform === 'linux',
isOsx: process.platform === 'darwin'
};
this.stdio = 'inherit';
this.os.name = this.sys.platform === 'darwin' ? 'osx' : this.sys.platform;
this.os.home = process.env[this.os.isWindows ? 'USERPROFILE' : 'HOME'];
this.os.tmp = _os.default.tmpdir();
/** @type {packagePaths} */
this.paths = {};
/** @type {meteorDesktopPaths} */
this.paths.meteorDesktop = {
root: _path.default.resolve(__dirname, '..')
};
this.paths.meteorDesktop.skeleton = join(this.paths.meteorDesktop.root, 'skeleton');
/** @type {meteorAppPaths} */
this.paths.meteorApp = {
root: input
};
/** @type {desktopPaths} */
this.paths.desktop = {
rootName: '.desktop',
root: join(this.paths.meteorApp.root, '.desktop')
};
(0, _assignIn.default)(this.paths.desktop, {
modules: join(this.paths.desktop.root, 'modules'),
import: join(this.paths.desktop.root, 'import'),
assets: join(this.paths.desktop.root, 'assets'),
settings: join(this.paths.desktop.root, 'settings.json'),
desktop: join(this.paths.desktop.root, 'desktop.js')
});
this.paths.desktop.splashScreen = join(this.paths.desktop.assets, 'splashScreen.png');
this.paths.desktop.loadingGif = join(this.paths.desktop.assets, 'loading.gif');
this.paths.desktop.meteorIco = join(this.paths.desktop.assets, 'meteor.ico');
/** @type {electronAppPaths} */
this.paths.electronApp = {
rootName: 'desktop-build'
};
this.paths.electronApp.root = join(this.paths.meteorApp.root, '.meteor', this.paths.electronApp.rootName);
this.paths.electronApp.tmpNodeModules = join(this.paths.meteorApp.root, '.meteor', '.desktop_node_modules');
this.paths.cache = join(this.paths.meteorApp.root, '.meteor', 'local', 'desktop-cache');
this.paths.electronApp.extractedNodeModules = join(this.paths.meteorApp.root, '.meteor', '.desktop_extracted_node_modules');
this.paths.electronApp.extractedNodeModulesBin = join(this.paths.electronApp.extractedNodeModules, '.bin');
this.paths.electronApp.appRoot = join(this.paths.electronApp.root, 'app');
(0, _assignIn.default)(this.paths.electronApp, {
app: join(this.paths.electronApp.appRoot, 'app.js'),
cordova: join(this.paths.electronApp.appRoot, 'cordova.js'),
index: join(this.paths.electronApp.appRoot, 'index.js'),
preload: join(this.paths.electronApp.appRoot, 'preload.js'),
modules: join(this.paths.electronApp.appRoot, 'modules'),
desktopAsar: join(this.paths.electronApp.root, 'desktop.asar'),
extracted: join(this.paths.electronApp.root, 'extracted'),
appAsar: join(this.paths.electronApp.root, 'app.asar'),
import: join(this.paths.electronApp.root, 'import'),
assets: join(this.paths.electronApp.root, 'assets'),
packageJson: join(this.paths.electronApp.root, 'package.json'),
settings: join(this.paths.electronApp.root, 'settings.json'),
desktop: join(this.paths.electronApp.root, 'desktop.js'),
desktopTmp: join(this.paths.electronApp.root, '__desktop'),
nodeModules: join(this.paths.electronApp.root, 'node_modules'),
meteorAsar: join(this.paths.electronApp.root, 'meteor.asar'),
meteorApp: join(this.paths.electronApp.root, 'meteor'),
meteorAppIndex: join(this.paths.electronApp.root, 'meteor', 'index.html'),
meteorAppProgramJson: join(this.paths.electronApp.root, 'meteor', 'program.json'),
skeleton: join(this.paths.electronApp.root, 'skeleton')
});
(0, _assignIn.default)(this.paths.meteorApp, {
platforms: join(this.paths.meteorApp.root, '.meteor', 'platforms'),
packages: join(this.paths.meteorApp.root, '.meteor', 'packages'),
versions: join(this.paths.meteorApp.root, '.meteor', 'versions'),
release: join(this.paths.meteorApp.root, '.meteor', 'release'),
packageJson: join(this.paths.meteorApp.root, 'package.json'),
gitIgnore: join(this.paths.meteorApp.root, '.meteor', '.gitignore'),
cordovaBuild: join(this.paths.meteorApp.root, '.meteor', 'local', 'cordova-build', 'www', 'application'),
webCordova: join(this.paths.meteorApp.root, '.meteor', 'local', 'build', 'programs', 'web.cordova')
});
(0, _assignIn.default)(this.paths.meteorApp, {
cordovaBuildIndex: join(this.paths.meteorApp.cordovaBuild, 'index.html'),
cordovaBuildProgramJson: join(this.paths.meteorApp.cordovaBuild, 'program.json')
});
(0, _assignIn.default)(this.paths.meteorApp, {
webCordovaProgramJson: join(this.paths.meteorApp.webCordova, 'program.json')
});
/** @type {desktopTmpPaths} */
this.paths.desktopTmp = {
root: join(this.paths.electronApp.root, '__desktop')
};
(0, _assignIn.default)(this.paths.desktopTmp, {
modules: join(this.paths.desktopTmp.root, 'modules'),
settings: join(this.paths.desktopTmp.root, 'settings.json')
});
this.paths.packageDir = '.desktop-package';
this.paths.installerDir = '.desktop-installer';
// Scaffold
this.paths.scaffold = join(__dirname, '..', 'scaffold');
}
/**
* @returns {boolean|*}
* @public
*/
isProductionBuild() {
return !!('production' in this.options && this.options.production);
}
}
exports.default = Env;
module.exports = Env;
/**
* @typedef {Object} desktopPaths
* @property {string} rootName
* @property {string} root
* @property {string} modules
* @property {string} import
* @property {string} assets
* @property {string} settings
* @property {string} desktop
* @property {string} splashScreen
* @property {string} loadingGif
* @property {string} meteorIco
*/
/**
* @typedef {Object} meteorAppPaths
* @property {string} root
* @property {string} platforms
* @property {string} release
* @property {string} packages
* @property {string} versions
* @property {string} gitIgnore
* @property {string} packageJson
* @property {string} cordovaBuild
* @property {string} cordovaBuildIndex
* @property {string} cordovaBuildProgramJson
* @property {string} webCordova
* @property {string} webCordovaIndex
* @property {string} webCordovaProgramJson
*/
/**
* @typedef {Object} electronAppPaths
* @property {string} rootName
* @property {string} root
* @property {Object} appRoot
* @property {string} appRoot.cordova
* @property {string} appRoot.index
* @property {string} appRoot.app
* @property {string} appRoot.modules
* @property {string} desktopAsar
* @property {string} extracted
* @property {string} appAsar
* @property {string} preload
* @property {string} import
* @property {string} assets
* @property {string} gitIgnore
* @property {string} packageJson
* @property {string} settings
* @property {string} desktop
* @property {string} desktopTmp
* @property {string} nodeModules
* @property {string} meteorAsar
* @property {string} meteorApp
* @property {string} meteorAppIndex
* @property {string} meteorAppProgramJson
* @property {string} skeleton
* @property {string} tmpNodeModules
* @property {string} extractedNodeModules
* @property {string} extractedNodeModulesBin
*/
/**
* @typedef {Object} desktopTmpPaths
* @property {string} root
* @property {string} modules
* @property {string} settings
*/
/**
* @typedef {Object} meteorDesktopPaths
* @property {string} root
* @property {string} skeleton
*/
/**
* @typedef {Object} packagePaths
* @property {meteorAppPaths} meteorApp
* @property {desktopPaths} desktop
* @property {electronAppPaths} electronApp
* @property {desktopTmpPaths} desktopTmp
* @property {meteorDesktopPaths} meteorDesktop
* @property {string} packageDir
* @property {string} scaffold
*/
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX29zIiwiX2Fzc2lnbkluIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwiam9pbiIsInBhdGgiLCJFbnYiLCJjb25zdHJ1Y3RvciIsImlucHV0Iiwib3V0cHV0Iiwib3B0aW9ucyIsImlzUHJvZHVjdGlvbkJ1aWxkIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwic3lzIiwicGxhdGZvcm0iLCJhcmNoIiwib3MiLCJpc1dpbmRvd3MiLCJpc0xpbnV4IiwiaXNPc3giLCJzdGRpbyIsIm5hbWUiLCJob21lIiwidG1wIiwidG1wZGlyIiwicGF0aHMiLCJtZXRlb3JEZXNrdG9wIiwicm9vdCIsInJlc29sdmUiLCJfX2Rpcm5hbWUiLCJza2VsZXRvbiIsIm1ldGVvckFwcCIsImRlc2t0b3AiLCJyb290TmFtZSIsImFzc2lnbkluIiwibW9kdWxlcyIsImltcG9ydCIsImFzc2V0cyIsInNldHRpbmdzIiwic3BsYXNoU2NyZWVuIiwibG9hZGluZ0dpZiIsIm1ldGVvckljbyIsImVsZWN0cm9uQXBwIiwidG1wTm9kZU1vZHVsZXMiLCJjYWNoZSIsImV4dHJhY3RlZE5vZGVNb2R1bGVzIiwiZXh0cmFjdGVkTm9kZU1vZHVsZXNCaW4iLCJhcHBSb290IiwiYXBwIiwiY29yZG92YSIsImluZGV4IiwicHJlbG9hZCIsImRlc2t0b3BBc2FyIiwiZXh0cmFjdGVkIiwiYXBwQXNhciIsInBhY2thZ2VKc29uIiwiZGVza3RvcFRtcCIsIm5vZGVNb2R1bGVzIiwibWV0ZW9yQXNhciIsIm1ldGVvckFwcEluZGV4IiwibWV0ZW9yQXBwUHJvZ3JhbUpzb24iLCJwbGF0Zm9ybXMiLCJwYWNrYWdlcyIsInZlcnNpb25zIiwicmVsZWFzZSIsImdpdElnbm9yZSIsImNvcmRvdmFCdWlsZCIsIndlYkNvcmRvdmEiLCJjb3Jkb3ZhQnVpbGRJbmRleCIsImNvcmRvdmFCdWlsZFByb2dyYW1Kc29uIiwid2ViQ29yZG92YVByb2dyYW1Kc29uIiwicGFja2FnZURpciIsImluc3RhbGxlckRpciIsInNjYWZmb2xkIiwicHJvZHVjdGlvbiIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi9saWIvZW52LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBhc3NpZ25JbiBmcm9tICdsb2Rhc2gvYXNzaWduSW4nO1xuXG5jb25zdCB7IGpvaW4gfSA9IHBhdGg7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAcHJvcGVydHkge3BhY2thZ2VQYXRoc30gcGF0aHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52IHtcbiAgICBjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQcm9kdWN0aW9uQnVpbGQoKSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPSAncHJvZHVjdGlvbic7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN5cyA9IHtcbiAgICAgICAgICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgICAgICAgYXJjaDogcHJvY2Vzcy5hcmNoXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gT3BlcmF0aW9uYWwgU3lzdGVtLlxuICAgICAgICB0aGlzLm9zID0ge1xuICAgICAgICAgICAgaXNXaW5kb3dzOiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyksXG4gICAgICAgICAgICBpc0xpbnV4OiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JyksXG4gICAgICAgICAgICBpc09zeDogKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKVxuXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RkaW8gPSAnaW5oZXJpdCc7XG5cbiAgICAgICAgdGhpcy5vcy5uYW1lID0gKHRoaXMuc3lzLnBsYXRmb3JtID09PSAnZGFyd2luJyA/ICdvc3gnIDogdGhpcy5zeXMucGxhdGZvcm0pO1xuICAgICAgICB0aGlzLm9zLmhvbWUgPSBwcm9jZXNzLmVudlsodGhpcy5vcy5pc1dpbmRvd3MgPyAnVVNFUlBST0ZJTEUnIDogJ0hPTUUnKV07XG4gICAgICAgIHRoaXMub3MudG1wID0gb3MudG1wZGlyKCk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHtwYWNrYWdlUGF0aHN9ICovXG4gICAgICAgIHRoaXMucGF0aHMgPSB7fTtcblxuICAgICAgICAvKiogQHR5cGUge21ldGVvckRlc2t0b3BQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocy5tZXRlb3JEZXNrdG9wID0ge1xuICAgICAgICAgICAgcm9vdDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJylcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckRlc2t0b3Auc2tlbGV0b24gPSBqb2luKHRoaXMucGF0aHMubWV0ZW9yRGVza3RvcC5yb290LCAnc2tlbGV0b24nKTtcblxuICAgICAgICAvKiogQHR5cGUge21ldGVvckFwcFBhdGhzfSAqL1xuICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcCA9IHtcbiAgICAgICAgICAgIHJvb3Q6IGlucHV0XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIEB0eXBlIHtkZXNrdG9wUGF0aHN9ICovXG4gICAgICAgIHRoaXMucGF0aHMuZGVza3RvcCA9IHtcbiAgICAgICAgICAgIHJvb3ROYW1lOiAnLmRlc2t0b3AnLFxuICAgICAgICAgICAgcm9vdDogam9pbih0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LCAnLmRlc2t0b3AnKVxuICAgICAgICB9O1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMuZGVza3RvcCwge1xuICAgICAgICAgICAgbW9kdWxlczogam9pbih0aGlzLnBhdGhzLmRlc2t0b3Aucm9vdCwgJ21vZHVsZXMnKSxcbiAgICAgICAgICAgIGltcG9ydDogam9pbih0aGlzLnBhdGhzLmRlc2t0b3Aucm9vdCwgJ2ltcG9ydCcpLFxuICAgICAgICAgICAgYXNzZXRzOiBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5yb290LCAnYXNzZXRzJyksXG4gICAgICAgICAgICBzZXR0aW5nczogam9pbih0aGlzLnBhdGhzLmRlc2t0b3Aucm9vdCwgJ3NldHRpbmdzLmpzb24nKSxcbiAgICAgICAgICAgIGRlc2t0b3A6IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wLnJvb3QsICdkZXNrdG9wLmpzJylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wYXRocy5kZXNrdG9wLnNwbGFzaFNjcmVlbiA9IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wLmFzc2V0cywgJ3NwbGFzaFNjcmVlbi5wbmcnKTtcbiAgICAgICAgdGhpcy5wYXRocy5kZXNrdG9wLmxvYWRpbmdHaWYgPSBqb2luKHRoaXMucGF0aHMuZGVza3RvcC5hc3NldHMsICdsb2FkaW5nLmdpZicpO1xuICAgICAgICB0aGlzLnBhdGhzLmRlc2t0b3AubWV0ZW9ySWNvID0gam9pbih0aGlzLnBhdGhzLmRlc2t0b3AuYXNzZXRzLCAnbWV0ZW9yLmljbycpO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7ZWxlY3Ryb25BcHBQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcCA9IHtcbiAgICAgICAgICAgIHJvb3ROYW1lOiAnZGVza3RvcC1idWlsZCcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCA9XG4gICAgICAgICAgICBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290TmFtZSk7XG5cbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC50bXBOb2RlTW9kdWxlcyA9XG4gICAgICAgICAgICBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJy5kZXNrdG9wX25vZGVfbW9kdWxlcycpO1xuXG4gICAgICAgIHRoaXMucGF0aHMuY2FjaGUgPVxuICAgICAgICAgICAgam9pbih0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LCAnLm1ldGVvcicsICdsb2NhbCcsICdkZXNrdG9wLWNhY2hlJyk7XG5cbiAgICAgICAgdGhpcy5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcyA9XG4gICAgICAgICAgICBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJy5kZXNrdG9wX2V4dHJhY3RlZF9ub2RlX21vZHVsZXMnKTtcblxuICAgICAgICB0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmV4dHJhY3RlZE5vZGVNb2R1bGVzQmluID1cbiAgICAgICAgICAgIGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5leHRyYWN0ZWROb2RlTW9kdWxlcywgJy5iaW4nKTtcblxuXG4gICAgICAgIHRoaXMucGF0aHMuZWxlY3Ryb25BcHAuYXBwUm9vdCA9XG4gICAgICAgICAgICBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ2FwcCcpO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAsIHtcbiAgICAgICAgICAgIGFwcDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdhcHAuanMnKSxcbiAgICAgICAgICAgIGNvcmRvdmE6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LCAnY29yZG92YS5qcycpLFxuICAgICAgICAgICAgaW5kZXg6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LCAnaW5kZXguanMnKSxcbiAgICAgICAgICAgIHByZWxvYWQ6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5hcHBSb290LCAncHJlbG9hZC5qcycpLFxuICAgICAgICAgICAgbW9kdWxlczogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLmFwcFJvb3QsICdtb2R1bGVzJyksXG4gICAgICAgICAgICBkZXNrdG9wQXNhcjogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdkZXNrdG9wLmFzYXInKSxcbiAgICAgICAgICAgIGV4dHJhY3RlZDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdleHRyYWN0ZWQnKSxcbiAgICAgICAgICAgIGFwcEFzYXI6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnYXBwLmFzYXInKSxcbiAgICAgICAgICAgIGltcG9ydDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdpbXBvcnQnKSxcbiAgICAgICAgICAgIGFzc2V0czogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdhc3NldHMnKSxcbiAgICAgICAgICAgIHBhY2thZ2VKc29uOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgICAgICAgc2V0dGluZ3M6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnc2V0dGluZ3MuanNvbicpLFxuICAgICAgICAgICAgZGVza3RvcDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdkZXNrdG9wLmpzJyksXG4gICAgICAgICAgICBkZXNrdG9wVG1wOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ19fZGVza3RvcCcpLFxuICAgICAgICAgICAgbm9kZU1vZHVsZXM6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnbm9kZV9tb2R1bGVzJyksXG4gICAgICAgICAgICBtZXRlb3JBc2FyOiBqb2luKHRoaXMucGF0aHMuZWxlY3Ryb25BcHAucm9vdCwgJ21ldGVvci5hc2FyJyksXG4gICAgICAgICAgICBtZXRlb3JBcHA6IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnbWV0ZW9yJyksXG4gICAgICAgICAgICBtZXRlb3JBcHBJbmRleDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdtZXRlb3InLCAnaW5kZXguaHRtbCcpLFxuICAgICAgICAgICAgbWV0ZW9yQXBwUHJvZ3JhbUpzb246IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnbWV0ZW9yJywgJ3Byb2dyYW0uanNvbicpLFxuICAgICAgICAgICAgc2tlbGV0b246IGpvaW4odGhpcy5wYXRocy5lbGVjdHJvbkFwcC5yb290LCAnc2tlbGV0b24nKVxuICAgICAgICB9KTtcblxuICAgICAgICBhc3NpZ25Jbih0aGlzLnBhdGhzLm1ldGVvckFwcCwge1xuICAgICAgICAgICAgcGxhdGZvcm1zOiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJ3BsYXRmb3JtcycpLFxuICAgICAgICAgICAgcGFja2FnZXM6IGpvaW4odGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCwgJy5tZXRlb3InLCAncGFja2FnZXMnKSxcbiAgICAgICAgICAgIHZlcnNpb25zOiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJ3ZlcnNpb25zJyksXG4gICAgICAgICAgICByZWxlYXNlOiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICcubWV0ZW9yJywgJ3JlbGVhc2UnKSxcbiAgICAgICAgICAgIHBhY2thZ2VKc29uOiBqb2luKHRoaXMucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKSxcbiAgICAgICAgICAgIGdpdElnbm9yZTogam9pbih0aGlzLnBhdGhzLm1ldGVvckFwcC5yb290LCAnLm1ldGVvcicsICcuZ2l0aWdub3JlJyksXG4gICAgICAgICAgICBjb3Jkb3ZhQnVpbGQ6IGpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCxcbiAgICAgICAgICAgICAgICAnLm1ldGVvcicsXG4gICAgICAgICAgICAgICAgJ2xvY2FsJyxcbiAgICAgICAgICAgICAgICAnY29yZG92YS1idWlsZCcsXG4gICAgICAgICAgICAgICAgJ3d3dycsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHdlYkNvcmRvdmE6IGpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRocy5tZXRlb3JBcHAucm9vdCxcbiAgICAgICAgICAgICAgICAnLm1ldGVvcicsXG4gICAgICAgICAgICAgICAgJ2xvY2FsJyxcbiAgICAgICAgICAgICAgICAnYnVpbGQnLFxuICAgICAgICAgICAgICAgICdwcm9ncmFtcycsXG4gICAgICAgICAgICAgICAgJ3dlYi5jb3Jkb3ZhJ1xuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcblxuICAgICAgICBhc3NpZ25Jbih0aGlzLnBhdGhzLm1ldGVvckFwcCwge1xuICAgICAgICAgICAgY29yZG92YUJ1aWxkSW5kZXg6IGpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRocy5tZXRlb3JBcHAuY29yZG92YUJ1aWxkLCAnaW5kZXguaHRtbCdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjb3Jkb3ZhQnVpbGRQcm9ncmFtSnNvbjogam9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGhzLm1ldGVvckFwcC5jb3Jkb3ZhQnVpbGQsICdwcm9ncmFtLmpzb24nXG4gICAgICAgICAgICApXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMucGF0aHMubWV0ZW9yQXBwLCB7XG4gICAgICAgICAgICB3ZWJDb3Jkb3ZhUHJvZ3JhbUpzb246IGpvaW4oXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRocy5tZXRlb3JBcHAud2ViQ29yZG92YSwgJ3Byb2dyYW0uanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKiogQHR5cGUge2Rlc2t0b3BUbXBQYXRoc30gKi9cbiAgICAgICAgdGhpcy5wYXRocy5kZXNrdG9wVG1wID0ge1xuICAgICAgICAgICAgcm9vdDogam9pbih0aGlzLnBhdGhzLmVsZWN0cm9uQXBwLnJvb3QsICdfX2Rlc2t0b3AnKSxcbiAgICAgICAgfTtcblxuICAgICAgICBhc3NpZ25Jbih0aGlzLnBhdGhzLmRlc2t0b3BUbXAsIHtcbiAgICAgICAgICAgIG1vZHVsZXM6IGpvaW4odGhpcy5wYXRocy5kZXNrdG9wVG1wLnJvb3QsICdtb2R1bGVzJyksXG4gICAgICAgICAgICBzZXR0aW5nczogam9pbih0aGlzLnBhdGhzLmRlc2t0b3BUbXAucm9vdCwgJ3NldHRpbmdzLmpzb24nKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBhdGhzLnBhY2thZ2VEaXIgPSAnLmRlc2t0b3AtcGFja2FnZSc7XG4gICAgICAgIHRoaXMucGF0aHMuaW5zdGFsbGVyRGlyID0gJy5kZXNrdG9wLWluc3RhbGxlcic7XG5cbiAgICAgICAgLy8gU2NhZmZvbGRcbiAgICAgICAgdGhpcy5wYXRocy5zY2FmZm9sZCA9IGpvaW4oX19kaXJuYW1lLCAnLi4nLCAnc2NhZmZvbGQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbnwqfVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBpc1Byb2R1Y3Rpb25CdWlsZCgpIHtcbiAgICAgICAgcmV0dXJuICEhKCdwcm9kdWN0aW9uJyBpbiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnByb2R1Y3Rpb24pO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFbnY7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gZGVza3RvcFBhdGhzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9vdE5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGltcG9ydFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFzc2V0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHNldHRpbmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVza3RvcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNwbGFzaFNjcmVlblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvYWRpbmdHaWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JJY29cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IG1ldGVvckFwcFBhdGhzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9vdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBsYXRmb3Jtc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbGVhc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2l0SWdub3JlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZUpzb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb3Jkb3ZhQnVpbGRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb3Jkb3ZhQnVpbGRJbmRleFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvcmRvdmFCdWlsZFByb2dyYW1Kc29uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2ViQ29yZG92YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYkNvcmRvdmFJbmRleFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYkNvcmRvdmFQcm9ncmFtSnNvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gZWxlY3Ryb25BcHBQYXRoc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJvb3ROYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcm9vdFxuICogQHByb3BlcnR5IHtPYmplY3R9IGFwcFJvb3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBSb290LmNvcmRvdmFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBSb290LmluZGV4XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUm9vdC5hcHBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBSb290Lm1vZHVsZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNrdG9wQXNhclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dHJhY3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcEFzYXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmVsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW1wb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXNzZXRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2l0SWdub3JlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZUpzb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXR0aW5nc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2t0b3BcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNrdG9wVG1wXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm9kZU1vZHVsZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JBc2FyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0ZW9yQXBwXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0ZW9yQXBwSW5kZXhcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRlb3JBcHBQcm9ncmFtSnNvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNrZWxldG9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG1wTm9kZU1vZHVsZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHRyYWN0ZWROb2RlTW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dHJhY3RlZE5vZGVNb2R1bGVzQmluXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBkZXNrdG9wVG1wUGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kdWxlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHNldHRpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBtZXRlb3JEZXNrdG9wUGF0aHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByb290XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2tlbGV0b25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IHBhY2thZ2VQYXRoc1xuICogQHByb3BlcnR5IHttZXRlb3JBcHBQYXRoc30gbWV0ZW9yQXBwXG4gKiBAcHJvcGVydHkge2Rlc2t0b3BQYXRoc30gZGVza3RvcFxuICogQHByb3BlcnR5IHtlbGVjdHJvbkFwcFBhdGhzfSBlbGVjdHJvbkFwcFxuICogQHByb3BlcnR5IHtkZXNrdG9wVG1wUGF0aHN9IGRlc2t0b3BUbXBcbiAqIEBwcm9wZXJ0eSB7bWV0ZW9yRGVza3RvcFBhdGhzfSBtZXRlb3JEZXNrdG9wXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZURpclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjYWZmb2xkXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsR0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQXVDLFNBQUFELHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRXZDLE1BQU07RUFBRUc7QUFBSyxDQUFDLEdBQUdDLGFBQUk7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTUMsR0FBRyxDQUFDO0VBQ3JCQyxXQUFXQSxDQUFDQyxLQUFLLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxFQUFFO0lBQ2hDLElBQUksQ0FBQ0EsT0FBTyxHQUFHQSxPQUFPO0lBRXRCLElBQUksSUFBSSxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFD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