UNPKG

@enterthenamehere/esdoc

Version:

Good Documentation Generator For JavaScript, updated for new decade

244 lines (233 loc) 33.7 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _fsExtra = _interopRequireDefault(require("fs-extra")); var _upath = _interopRequireDefault(require("upath")); var _minimist = _interopRequireDefault(require("minimist")); var _ESDoc = _interopRequireDefault(require("./ESDoc.js")); var _NPMUtil = _interopRequireDefault(require("@enterthenamehere/esdoc/out/Util/NPMUtil.js")); var _FileManager = require("@enterthenamehere/esdoc/out/Util/FileManager"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } /** @type {minimist.Opts} */ var minimistOpts = { string: ['config'], boolean: ['help', 'version', 'init', 'debug', 'verbose'], alias: { 'help': 'h', 'version': 'v', 'config': 'c' }, default: { 'help': false, 'version': false, 'init': false, 'debug': false, 'verbose': false, 'config': null }, '--': true, stopEarly: true, unknown: function unknown(arg) { if (typeof arg === 'string' && arg === '') return false; // Special case to make unit test for no config file found situation work. console.info("Unknown argument '".concat(arg, "'.")); return false; } }; /** * Command Line Interface for ESDoc. * * @example * let cli = new ESDocCLI(process.argv); * cli.exec(); */ var _argv = /*#__PURE__*/new WeakMap(); class ESDocCLI { /** * Create instance. * @param {Object} argv - this is node.js argv(``process.argv``) */ constructor(argv) { var _classPrivateFieldGet2, _classPrivateFieldGet3, _classPrivateFieldGet4, _classPrivateFieldGet5; /** @type {minimist.ParsedArgs | null} */ _classPrivateFieldInitSpec(this, _argv, { writable: true, value: null }); _classPrivateFieldSet(this, _argv, (0, _minimist.default)(argv.slice(2), minimistOpts)); if ((_classPrivateFieldGet2 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet2 !== void 0 && _classPrivateFieldGet2.debug) { console.info('ESDocCLI path:', process.cwd()); console.info('ESDocCLI: Received arguments:'); console.info(_classPrivateFieldGet(this, _argv)); } if ((_classPrivateFieldGet3 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet3 !== void 0 && _classPrivateFieldGet3.help) { this._showHelp(); process.exit(0); } if ((_classPrivateFieldGet4 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet4 !== void 0 && _classPrivateFieldGet4.version) { this._showVersion(); process.exit(0); } if ((_classPrivateFieldGet5 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet5 !== void 0 && _classPrivateFieldGet5.init) { this._createConfigFileForUser(); process.exit(0); } } /** * execute to generate document. */ exec() { var _classPrivateFieldGet6, _classPrivateFieldGet7; var config = null; var configPath = this._findConfigFilePath(); if ((_classPrivateFieldGet6 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet6 !== void 0 && _classPrivateFieldGet6.debug) { console.info('ESDocCLI: Checking for configuration file in:'); console.info(configPath); } // TODO: implement loading of user provided file of package json and javascript file too if (configPath) { config = this._createConfigFromJSONFile(configPath); } else { config = this._createConfigFromPackageJSON(); } if ((_classPrivateFieldGet7 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet7 !== void 0 && _classPrivateFieldGet7.debug) { console.info('ESDocCLI: Config:'); console.info(config); } if (config) { var _classPrivateFieldGet8, _classPrivateFieldGet9; if ((_classPrivateFieldGet8 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet8 !== void 0 && _classPrivateFieldGet8.debug) { config.debug = true; } if ((_classPrivateFieldGet9 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet9 !== void 0 && _classPrivateFieldGet9.verbose) { config.verbose = true; } _ESDoc.default.generate(config); } else { this._showHelp(); process.exit(1); } } /** * show help of ESDoc * @private */ _showHelp() { console.info("".concat(String('Usage: esdoc [-c or --config esdoc.json]\n' + '\n' + 'Options:\n' + ' -c, --config specify config file [string]\n' + ' -h, --help output usage information (this text)\n' + ' -v, --version output the version number\n' + ' --init create .esdoc.json with default values\n' + 'ESDoc finds configuration by the order:\n' + ' 1. `-c your-esdoc.json`\n' + ' 2. `[.]esdoc.json` in current directory\n' + ' 3. `[.]esdoc.js` in current directory\n' + ' 4. `esdoc` property in package.json'))); } /** * show version of ESDoc * @private */ _showVersion() { var packageObj = _NPMUtil.default.findPackage(); if (packageObj) { console.info(packageObj.version); } else { console.info('0.0.0'); } } /** * Creates ".esdoc.json" file for user, with default required values. */ _createConfigFileForUser() { if (_fsExtra.default.existsSync('.esdoc.json')) { console.warn('.esdoc.json file already exists!'); return; } var text = '{\n' + ' "source": "./src",\n' + ' "destination": "./docs",\n' + ' "debug": false,\n' + ' "verbose": false,\n' + ' "includes": [\n' + ' "*.js"\n' + ' ],\n' + ' "excludes": [\n' + ' "*.config.js",\n' + ' "*modules/"\n' + ' ],\n' + ' "index": "./README.md",\n' + ' "package": "./package.json",\n' + ' "plugins": [{\n' + ' "name": "esdoc-standard-plugin",\n' + ' "options": {\n' + ' "accessor": { "access": ["public", "protected", "private"], "autoPrivate": true },\n' + ' "lint": { "enable": true },\n' + ' "coverage": { "enable": true },\n' + ' "undocumentIdentifier": { "enable": true },\n' + ' "unexportedIdentifier": { "enable": false },\n' + ' "typeInference": { "enable": true },\n' + ' "test": {\n' + ' "source": "./test",\n' + ' "includes": ["*.(spec|Spec|test|Test).js"],\n' + ' "excludes": ["*.config.js"]\n' + ' }\n' + ' }\n' + ' }]\n' + '}'; try { _fsExtra.default.writeFileSync('.esdoc.json', text); } catch (err) { console.error('Error: creating .esdoc.json failed!\n', err.message); console.error(err); } } /** * Returns string filepath of ESDoc config file if exists or null if none can be found. * @returns {string|null} Config file path. * @private */ _findConfigFilePath() { var _classPrivateFieldGet10; if ((_classPrivateFieldGet10 = _classPrivateFieldGet(this, _argv)) !== null && _classPrivateFieldGet10 !== void 0 && _classPrivateFieldGet10.config) { // We DO NOT control this._argv.config if (_fsExtra.default.existsSync(_classPrivateFieldGet(this, _argv).config)) { return _classPrivateFieldGet(this, _argv).config; } console.error("Error: Config file '".concat(_classPrivateFieldGet(this, _argv).config, "' doesn't exist!")); process.exit(2); } var filePath = _upath.default.resolve('./.esdoc.json'); // We control filePath if (_fsExtra.default.existsSync(filePath)) { return filePath; } filePath = _upath.default.resolve('./esdoc.json'); // We control filePath if (_fsExtra.default.existsSync(filePath)) { return filePath; } filePath = _upath.default.resolve('./.esdoc.js'); // We control filePath if (_fsExtra.default.existsSync(filePath)) { return filePath; } filePath = _upath.default.resolve('./esdoc.js'); // We control filePath if (_fsExtra.default.existsSync(filePath)) { return filePath; } return null; } /** * create config object from config file. * @param {string} configFilePath - config file path. * @return {ESDocConfig} config object. * @private */ _createConfigFromJSONFile(configFilePath) { configFilePath = _upath.default.resolve(configFilePath); var ext = _upath.default.extname(configFilePath); if (ext === '.js') { /* eslint-disable global-require */ return require(configFilePath); } var configJSON = _FileManager.FileManager.readFileContents(configFilePath); var config = JSON.parse(configJSON); return config; } /** * create config object from package.json. * @return {ESDocConfig|null} config object. * @private */ _createConfigFromPackageJSON() { try { var filePath = _upath.default.resolve('./package.json'); var packageJSON = _FileManager.FileManager.readFileContents(filePath); var packageObj = JSON.parse(packageJSON); return packageObj.esdoc; } catch (e) { // ignore } return null; } } // if this file is directory executed, work as CLI. exports.default = ESDocCLI; var executedFilePath = _fsExtra.default.realpathSync(process.argv[1]); if (executedFilePath === __filename) { var cli = new ESDocCLI(process.argv); cli.exec(); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJfZnNFeHRyYSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3VwYXRoIiwiX21pbmltaXN0IiwiX0VTRG9jIiwiX05QTVV0aWwiLCJfRmlsZU1hbmFnZXIiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWMiLCJwcml2YXRlTWFwIiwiX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24iLCJzZXQiLCJwcml2YXRlQ29sbGVjdGlvbiIsImhhcyIsIlR5cGVFcnJvciIsIl9jbGFzc1ByaXZhdGVGaWVsZEdldCIsInJlY2VpdmVyIiwiZGVzY3JpcHRvciIsIl9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IiLCJfY2xhc3NBcHBseURlc2NyaXB0b3JHZXQiLCJnZXQiLCJjYWxsIiwiX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwiX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0IiwiYWN0aW9uIiwid3JpdGFibGUiLCJtaW5pbWlzdE9wdHMiLCJzdHJpbmciLCJib29sZWFuIiwiYWxpYXMiLCJzdG9wRWFybHkiLCJ1bmtub3duIiwiYXJnIiwiY29uc29sZSIsImluZm8iLCJjb25jYXQiLCJfYXJndiIsIldlYWtNYXAiLCJFU0RvY0NMSSIsImNvbnN0cnVjdG9yIiwiYXJndiIsIl9jbGFzc1ByaXZhdGVGaWVsZEdldDIiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQzIiwiX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NCIsIl9jbGFzc1ByaXZhdGVGaWVsZEdldDUiLCJtaW5pbWlzdCIsInNsaWNlIiwiZGVidWciLCJwcm9jZXNzIiwiY3dkIiwiaGVscCIsIl9zaG93SGVscCIsImV4aXQiLCJ2ZXJzaW9uIiwiX3Nob3dWZXJzaW9uIiwiaW5pdCIsIl9jcmVhdGVDb25maWdGaWxlRm9yVXNlciIsImV4ZWMiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQ2IiwiX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NyIsImNvbmZpZyIsImNvbmZpZ1BhdGgiLCJfZmluZENvbmZpZ0ZpbGVQYXRoIiwiX2NyZWF0ZUNvbmZpZ0Zyb21KU09ORmlsZSIsIl9jcmVhdGVDb25maWdGcm9tUGFja2FnZUpTT04iLCJfY2xhc3NQcml2YXRlRmllbGRHZXQ4IiwiX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OSIsInZlcmJvc2UiLCJFU0RvYyIsImdlbmVyYXRlIiwiU3RyaW5nIiwicGFja2FnZU9iaiIsIk5QTVV0aWwiLCJmaW5kUGFja2FnZSIsImZzIiwiZXhpc3RzU3luYyIsIndhcm4iLCJ0ZXh0Iiwid3JpdGVGaWxlU3luYyIsImVyciIsImVycm9yIiwibWVzc2FnZSIsIl9jbGFzc1ByaXZhdGVGaWVsZEdldDEwIiwiZmlsZVBhdGgiLCJ1cGF0aCIsInJlc29sdmUiLCJjb25maWdGaWxlUGF0aCIsImV4dCIsImV4dG5hbWUiLCJjb25maWdKU09OIiwiRmlsZU1hbmFnZXIiLCJyZWFkRmlsZUNvbnRlbnRzIiwiSlNPTiIsInBhcnNlIiwicGFja2FnZUpTT04iLCJlc2RvYyIsImUiLCJleGVjdXRlZEZpbGVQYXRoIiwicmVhbHBhdGhTeW5jIiwiX19maWxlbmFtZSIsImNsaSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9FU0RvY0NMSS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XHJcbmltcG9ydCB1cGF0aCBmcm9tICd1cGF0aCc7XHJcbmltcG9ydCBtaW5pbWlzdCBmcm9tICdtaW5pbWlzdCc7XHJcbmltcG9ydCBFU0RvYyBmcm9tICcuL0VTRG9jLmpzJztcclxuaW1wb3J0IE5QTVV0aWwgZnJvbSAnQGVudGVydGhlbmFtZWhlcmUvZXNkb2Mvb3V0L1V0aWwvTlBNVXRpbC5qcyc7XHJcbmltcG9ydCB7IEZpbGVNYW5hZ2VyIH0gZnJvbSAnQGVudGVydGhlbmFtZWhlcmUvZXNkb2Mvb3V0L1V0aWwvRmlsZU1hbmFnZXInO1xyXG5cclxuLyoqIEB0eXBlIHttaW5pbWlzdC5PcHRzfSAqL1xyXG5jb25zdCBtaW5pbWlzdE9wdHMgPSB7XHJcbiAgc3RyaW5nOiBbICdjb25maWcnIF0sXHJcbiAgYm9vbGVhbjogWyAnaGVscCcsICd2ZXJzaW9uJywgJ2luaXQnLCAnZGVidWcnLCAndmVyYm9zZScgXSxcclxuICBhbGlhczogeyAnaGVscCc6ICdoJywgJ3ZlcnNpb24nOiAndicsICdjb25maWcnOiAnYycgfSxcclxuICBkZWZhdWx0OiB7ICdoZWxwJzogZmFsc2UsICd2ZXJzaW9uJzogZmFsc2UsICdpbml0JzogZmFsc2UsICdkZWJ1Zyc6IGZhbHNlLCAndmVyYm9zZSc6IGZhbHNlLCAnY29uZmlnJzogbnVsbCB9LFxyXG4gICctLSc6IHRydWUsXHJcbiAgc3RvcEVhcmx5OiB0cnVlLFxyXG4gIHVua25vd246IGZ1bmN0aW9uICggYXJnICkge1xyXG4gICAgaWYodHlwZW9mKGFyZykgPT09ICdzdHJpbmcnICYmIGFyZyA9PT0gJycpIHJldHVybiBmYWxzZTsgLy8gU3BlY2lhbCBjYXNlIHRvIG1ha2UgdW5pdCB0ZXN0IGZvciBubyBjb25maWcgZmlsZSBmb3VuZCBzaXR1YXRpb24gd29yay5cclxuICAgIGNvbnNvbGUuaW5mbyhgVW5rbm93biBhcmd1bWVudCAnJHthcmd9Jy5gKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQ29tbWFuZCBMaW5lIEludGVyZmFjZSBmb3IgRVNEb2MuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGxldCBjbGkgPSBuZXcgRVNEb2NDTEkocHJvY2Vzcy5hcmd2KTtcclxuICogY2xpLmV4ZWMoKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVTRG9jQ0xJIHtcclxuICAvKiogQHR5cGUge21pbmltaXN0LlBhcnNlZEFyZ3MgfCBudWxsfSAqL1xyXG4gICNhcmd2ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGluc3RhbmNlLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhcmd2IC0gdGhpcyBpcyBub2RlLmpzIGFyZ3YoYGBwcm9jZXNzLmFyZ3ZgYClcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihhcmd2KSB7XHJcbiAgICB0aGlzLiNhcmd2ID0gbWluaW1pc3QoYXJndi5zbGljZSgyKSwgbWluaW1pc3RPcHRzKTtcclxuICAgIFxyXG4gICAgaWYodGhpcy4jYXJndj8uZGVidWcpIHtcclxuICAgICAgY29uc29sZS5pbmZvKCdFU0RvY0NMSSBwYXRoOicsIHByb2Nlc3MuY3dkKCkpO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ0VTRG9jQ0xJOiBSZWNlaXZlZCBhcmd1bWVudHM6Jyk7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyh0aGlzLiNhcmd2KTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLiNhcmd2Py5oZWxwKSB7XHJcbiAgICAgIHRoaXMuX3Nob3dIZWxwKCk7XHJcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLiNhcmd2Py52ZXJzaW9uKSB7XHJcbiAgICAgIHRoaXMuX3Nob3dWZXJzaW9uKCk7XHJcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLiNhcmd2Py5pbml0KSB7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUNvbmZpZ0ZpbGVGb3JVc2VyKCk7XHJcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGV4ZWN1dGUgdG8gZ2VuZXJhdGUgZG9jdW1lbnQuXHJcbiAgICovXHJcbiAgZXhlYygpIHtcclxuICAgIGxldCBjb25maWcgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLl9maW5kQ29uZmlnRmlsZVBhdGgoKTtcclxuXHJcbiAgICBpZih0aGlzLiNhcmd2Py5kZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ0VTRG9jQ0xJOiBDaGVja2luZyBmb3IgY29uZmlndXJhdGlvbiBmaWxlIGluOicpO1xyXG4gICAgICBjb25zb2xlLmluZm8oY29uZmlnUGF0aCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBsb2FkaW5nIG9mIHVzZXIgcHJvdmlkZWQgZmlsZSBvZiBwYWNrYWdlIGpzb24gYW5kIGphdmFzY3JpcHQgZmlsZSB0b29cclxuICAgIGlmKGNvbmZpZ1BhdGgpIHtcclxuICAgICAgY29uZmlnID0gdGhpcy5fY3JlYXRlQ29uZmlnRnJvbUpTT05GaWxlKGNvbmZpZ1BhdGgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uZmlnID0gdGhpcy5fY3JlYXRlQ29uZmlnRnJvbVBhY2thZ2VKU09OKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmKHRoaXMuI2FyZ3Y/LmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnRVNEb2NDTEk6IENvbmZpZzonKTtcclxuICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoY29uZmlnKSB7XHJcbiAgICAgIGlmKHRoaXMuI2FyZ3Y/LmRlYnVnKSB7XHJcbiAgICAgICAgY29uZmlnLmRlYnVnID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZih0aGlzLiNhcmd2Py52ZXJib3NlKSB7XHJcbiAgICAgICAgY29uZmlnLnZlcmJvc2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIEVTRG9jLmdlbmVyYXRlKGNvbmZpZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zaG93SGVscCgpO1xyXG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBzaG93IGhlbHAgb2YgRVNEb2NcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIF9zaG93SGVscCgpIHtcclxuICAgIGNvbnNvbGUuaW5mbyhcclxuICAgICAgICBgJHtTdHJpbmcoJ1VzYWdlOiBlc2RvYyBbLWMgb3IgLS1jb25maWcgZXNkb2MuanNvbl1cXG4nICtcclxuICAgICAgICAnXFxuJyArXHJcbiAgICAgICAgJ09wdGlvbnM6XFxuJyArXHJcbiAgICAgICAgJyAgICAtYywgIC0tY29uZmlnICAgIHNwZWNpZnkgY29uZmlnIGZpbGUgICAgICAgICAgICAgICAgICAgICBbc3RyaW5nXVxcbicgK1xyXG4gICAgICAgICcgICAgLWgsICAtLWhlbHAgICAgICBvdXRwdXQgdXNhZ2UgaW5mb3JtYXRpb24gKHRoaXMgdGV4dClcXG4nICtcclxuICAgICAgICAnICAgIC12LCAgLS12ZXJzaW9uICAgb3V0cHV0IHRoZSB2ZXJzaW9uIG51bWJlclxcbicgK1xyXG4gICAgICAgICcgICAgICAgICAtLWluaXQgICAgICBjcmVhdGUgLmVzZG9jLmpzb24gd2l0aCBkZWZhdWx0IHZhbHVlc1xcbicgK1xyXG4gICAgICAgICdFU0RvYyBmaW5kcyBjb25maWd1cmF0aW9uIGJ5IHRoZSBvcmRlcjpcXG4nICtcclxuICAgICAgICAnICAgIDEuIGAtYyB5b3VyLWVzZG9jLmpzb25gXFxuJyArXHJcbiAgICAgICAgJyAgICAyLiBgWy5dZXNkb2MuanNvbmAgaW4gY3VycmVudCBkaXJlY3RvcnlcXG4nICtcclxuICAgICAgICAnICAgIDMuIGBbLl1lc2RvYy5qc2AgaW4gY3VycmVudCBkaXJlY3RvcnlcXG4nICtcclxuICAgICAgICAnICAgIDQuIGBlc2RvY2AgcHJvcGVydHkgaW4gcGFja2FnZS5qc29uJyl9YFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHNob3cgdmVyc2lvbiBvZiBFU0RvY1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgX3Nob3dWZXJzaW9uKCkge1xyXG4gICAgY29uc3QgcGFja2FnZU9iaiA9IE5QTVV0aWwuZmluZFBhY2thZ2UoKTtcclxuICAgIGlmIChwYWNrYWdlT2JqKSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhwYWNrYWdlT2JqLnZlcnNpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5pbmZvKCcwLjAuMCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBcIi5lc2RvYy5qc29uXCIgZmlsZSBmb3IgdXNlciwgd2l0aCBkZWZhdWx0IHJlcXVpcmVkIHZhbHVlcy5cclxuICAgKi9cclxuICBfY3JlYXRlQ29uZmlnRmlsZUZvclVzZXIoKSB7XHJcbiAgICBpZiggZnMuZXhpc3RzU3luYygnLmVzZG9jLmpzb24nKSApIHtcclxuICAgICAgY29uc29sZS53YXJuKCcuZXNkb2MuanNvbiBmaWxlIGFscmVhZHkgZXhpc3RzIScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0ZXh0ID1cclxuICAgICAgJ3tcXG4nICtcclxuICAgICAgJyAgXCJzb3VyY2VcIjogXCIuL3NyY1wiLFxcbicgK1xyXG4gICAgICAnICBcImRlc3RpbmF0aW9uXCI6IFwiLi9kb2NzXCIsXFxuJyArXHJcbiAgICAgICcgIFwiZGVidWdcIjogZmFsc2UsXFxuJyArXHJcbiAgICAgICcgIFwidmVyYm9zZVwiOiBmYWxzZSxcXG4nICtcclxuICAgICAgJyAgXCJpbmNsdWRlc1wiOiBbXFxuJyArXHJcbiAgICAgICcgICAgXCIqLmpzXCJcXG4nICtcclxuICAgICAgJyAgXSxcXG4nICtcclxuICAgICAgJyAgXCJleGNsdWRlc1wiOiBbXFxuJyArXHJcbiAgICAgICcgICAgXCIqLmNvbmZpZy5qc1wiLFxcbicgK1xyXG4gICAgICAnICAgIFwiKm1vZHVsZXMvXCJcXG4nICtcclxuICAgICAgJyAgXSxcXG4nICtcclxuICAgICAgJyAgXCJpbmRleFwiOiBcIi4vUkVBRE1FLm1kXCIsXFxuJyArXHJcbiAgICAgICcgIFwicGFja2FnZVwiOiBcIi4vcGFja2FnZS5qc29uXCIsXFxuJyArXHJcbiAgICAgICcgIFwicGx1Z2luc1wiOiBbe1xcbicgK1xyXG4gICAgICAnICAgIFwibmFtZVwiOiBcImVzZG9jLXN0YW5kYXJkLXBsdWdpblwiLFxcbicgK1xyXG4gICAgICAnICAgIFwib3B0aW9uc1wiOiB7XFxuJyArXHJcbiAgICAgICcgICAgICBcImFjY2Vzc29yXCI6IHsgXCJhY2Nlc3NcIjogW1wicHVibGljXCIsIFwicHJvdGVjdGVkXCIsIFwicHJpdmF0ZVwiXSwgXCJhdXRvUHJpdmF0ZVwiOiB0cnVlIH0sXFxuJyArXHJcbiAgICAgICcgICAgICBcImxpbnRcIjogeyBcImVuYWJsZVwiOiB0cnVlIH0sXFxuJyArXHJcbiAgICAgICcgICAgICBcImNvdmVyYWdlXCI6IHsgXCJlbmFibGVcIjogdHJ1ZSB9LFxcbicgK1xyXG4gICAgICAnICAgICAgXCJ1bmRvY3VtZW50SWRlbnRpZmllclwiOiB7IFwiZW5hYmxlXCI6IHRydWUgfSxcXG4nICtcclxuICAgICAgJyAgICAgIFwidW5leHBvcnRlZElkZW50aWZpZXJcIjogeyBcImVuYWJsZVwiOiBmYWxzZSB9LFxcbicgK1xyXG4gICAgICAnICAgICAgXCJ0eXBlSW5mZXJlbmNlXCI6IHsgXCJlbmFibGVcIjogdHJ1ZSB9LFxcbicgK1xyXG4gICAgICAnICAgICAgXCJ0ZXN0XCI6IHtcXG4nICtcclxuICAgICAgJyAgICAgICAgXCJzb3VyY2VcIjogXCIuL3Rlc3RcIixcXG4nICtcclxuICAgICAgJyAgICAgICAgXCJpbmNsdWRlc1wiOiBbXCIqLihzcGVjfFNwZWN8dGVzdHxUZXN0KS5qc1wiXSxcXG4nICtcclxuICAgICAgJyAgICAgICAgXCJleGNsdWRlc1wiOiBbXCIqLmNvbmZpZy5qc1wiXVxcbicgK1xyXG4gICAgICAnICAgICAgfVxcbicgK1xyXG4gICAgICAnICAgIH1cXG4nICtcclxuICAgICAgJyAgfV1cXG4nICtcclxuICAgICAgJ30nO1xyXG4gICAgdHJ5IHtcclxuICAgICAgZnMud3JpdGVGaWxlU3luYygnLmVzZG9jLmpzb24nLHRleHQpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBjcmVhdGluZyAuZXNkb2MuanNvbiBmYWlsZWQhXFxuJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHN0cmluZyBmaWxlcGF0aCBvZiBFU0RvYyBjb25maWcgZmlsZSBpZiBleGlzdHMgb3IgbnVsbCBpZiBub25lIGNhbiBiZSBmb3VuZC5cclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9IENvbmZpZyBmaWxlIHBhdGguXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBfZmluZENvbmZpZ0ZpbGVQYXRoKCkge1xyXG4gICAgaWYoIHRoaXMuI2FyZ3Y/LmNvbmZpZyApIHtcclxuICAgICAgLy8gV2UgRE8gTk9UIGNvbnRyb2wgdGhpcy5fYXJndi5jb25maWdcclxuICAgICAgaWYoIGZzLmV4aXN0c1N5bmModGhpcy4jYXJndi5jb25maWcpICkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNhcmd2LmNvbmZpZztcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogQ29uZmlnIGZpbGUgJyR7dGhpcy4jYXJndi5jb25maWd9JyBkb2Vzbid0IGV4aXN0IWApO1xyXG4gICAgICBwcm9jZXNzLmV4aXQoMik7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbGVQYXRoID0gdXBhdGgucmVzb2x2ZSgnLi8uZXNkb2MuanNvbicpO1xyXG4gICAgLy8gV2UgY29udHJvbCBmaWxlUGF0aFxyXG4gICAgaWYoIGZzLmV4aXN0c1N5bmMoIGZpbGVQYXRoICkgKSB7XHJcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBmaWxlUGF0aCA9IHVwYXRoLnJlc29sdmUoJy4vZXNkb2MuanNvbicpO1xyXG4gICAgLy8gV2UgY29udHJvbCBmaWxlUGF0aFxyXG4gICAgaWYoIGZzLmV4aXN0c1N5bmMoIGZpbGVQYXRoICkgKSB7XHJcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZmlsZVBhdGggPSB1cGF0aC5yZXNvbHZlKCcuLy5lc2RvYy5qcycpO1xyXG4gICAgLy8gV2UgY29udHJvbCBmaWxlUGF0aFxyXG4gICAgaWYoIGZzLmV4aXN0c1N5bmMoIGZpbGVQYXRoICkgKSB7XHJcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgZmlsZVBhdGggPSB1cGF0aC5yZXNvbHZlKCcuL2VzZG9jLmpzJyk7XHJcbiAgICAvLyBXZSBjb250cm9sIGZpbGVQYXRoXHJcbiAgICBpZiggZnMuZXhpc3RzU3luYyggZmlsZVBhdGggKSApIHtcclxuICAgICAgcmV0dXJuIGZpbGVQYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY3JlYXRlIGNvbmZpZyBvYmplY3QgZnJvbSBjb25maWcgZmlsZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnRmlsZVBhdGggLSBjb25maWcgZmlsZSBwYXRoLlxyXG4gICAqIEByZXR1cm4ge0VTRG9jQ29uZmlnfSBjb25maWcgb2JqZWN0LlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgX2NyZWF0ZUNvbmZpZ0Zyb21KU09ORmlsZShjb25maWdGaWxlUGF0aCkge1xyXG4gICAgY29uZmlnRmlsZVBhdGggPSB1cGF0aC5yZXNvbHZlKGNvbmZpZ0ZpbGVQYXRoKTtcclxuICAgIGNvbnN0IGV4dCA9IHVwYXRoLmV4dG5hbWUoY29uZmlnRmlsZVBhdGgpO1xyXG4gICAgaWYgKGV4dCA9PT0gJy5qcycpIHtcclxuICAgICAgLyogZXNsaW50LWRpc2FibGUgZ2xvYmFsLXJlcXVpcmUgKi9cclxuICAgICAgcmV0dXJuIHJlcXVpcmUoY29uZmlnRmlsZVBhdGgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBjb25maWdKU09OID0gRmlsZU1hbmFnZXIucmVhZEZpbGVDb250ZW50cyhjb25maWdGaWxlUGF0aCk7XHJcbiAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0pTT04pO1xyXG4gICAgcmV0dXJuIGNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSBjb25maWcgb2JqZWN0IGZyb20gcGFja2FnZS5qc29uLlxyXG4gICAqIEByZXR1cm4ge0VTRG9jQ29uZmlnfG51bGx9IGNvbmZpZyBvYmplY3QuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBfY3JlYXRlQ29uZmlnRnJvbVBhY2thZ2VKU09OKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmlsZVBhdGggPSB1cGF0aC5yZXNvbHZlKCcuL3BhY2thZ2UuanNvbicpO1xyXG4gICAgICBjb25zdCBwYWNrYWdlSlNPTiA9IEZpbGVNYW5hZ2VyLnJlYWRGaWxlQ29udGVudHMoZmlsZVBhdGgpO1xyXG4gICAgICBjb25zdCBwYWNrYWdlT2JqID0gSlNPTi5wYXJzZShwYWNrYWdlSlNPTik7XHJcbiAgICAgIHJldHVybiBwYWNrYWdlT2JqLmVzZG9jO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBpZ25vcmVcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbi8vIGlmIHRoaXMgZmlsZSBpcyBkaXJlY3RvcnkgZXhlY3V0ZWQsIHdvcmsgYXMgQ0xJLlxyXG5jb25zdCBleGVjdXRlZEZpbGVQYXRoID0gZnMucmVhbHBhdGhTeW5jKHByb2Nlc3MuYXJndlsxXSk7XHJcbmlmIChleGVjdXRlZEZpbGVQYXRoID09PSBfX2ZpbGVuYW1lKSB7XHJcbiAgY29uc3QgY2xpID0gbmV3IEVTRG9jQ0xJKHByb2Nlc3MuYXJndik7XHJcbiAgY2xpLmV4ZWMoKTtcclxufVxyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQW1COztBQUFBQSxNQUFBLENBQUFDLGNBQUEsQ0FBQUMsT0FBQTtFQUFBQyxLQUFBO0FBQUE7QUFBQUQsT0FBQSxDQUFBRSxPQUFBO0FBQ25CLElBQUFDLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFNBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQUEyRSxTQUFBRCx1QkFBQU8sR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFULE9BQUEsRUFBQVMsR0FBQTtBQUFBLFNBQUFFLDJCQUFBRixHQUFBLEVBQUFHLFVBQUEsRUFBQWIsS0FBQSxJQUFBYywwQkFBQSxDQUFBSixHQUFBLEVBQUFHLFVBQUEsR0FBQUEsVUFBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsRUFBQVYsS0FBQTtBQUFBLFNBQUFjLDJCQUFBSixHQUFBLEVBQUFNLGlCQUFBLFFBQUFBLGlCQUFBLENBQUFDLEdBQUEsQ0FBQVAsR0FBQSxlQUFBUSxTQUFBO0FBQUEsU0FBQUMsc0JBQUFDLFFBQUEsRUFBQVAsVUFBQSxRQUFBUSxVQUFBLEdBQUFDLDRCQUFBLENBQUFGLFFBQUEsRUFBQVAsVUFBQSxpQkFBQVUsd0JBQUEsQ0FBQUgsUUFBQSxFQUFBQyxVQUFBO0FBQUEsU0FBQUUseUJBQUFILFFBQUEsRUFBQUMsVUFBQSxRQUFBQSxVQUFBLENBQUFHLEdBQUEsV0FBQUgsVUFBQSxDQUFBRyxHQUFBLENBQUFDLElBQUEsQ0FBQUwsUUFBQSxZQUFBQyxVQUFBLENBQUFyQixLQUFBO0FBQUEsU0FBQTBCLHNCQUFBTixRQUFBLEVBQUFQLFVBQUEsRUFBQWIsS0FBQSxRQUFBcUIsVUFBQSxHQUFBQyw0QkFBQSxDQUFBRixRQUFBLEVBQUFQLFVBQUEsVUFBQWMsd0JBQUEsQ0FBQVAsUUFBQSxFQUFBQyxVQUFBLEVBQUFyQixLQUFBLFVBQUFBLEtBQUE7QUFBQSxTQUFBc0IsNkJBQUFGLFFBQUEsRUFBQVAsVUFBQSxFQUFBZSxNQUFBLFNBQUFmLFVBQUEsQ0FBQUksR0FBQSxDQUFBRyxRQUFBLGVBQUFGLFNBQUEsbUJBQUFVLE1BQUEsK0NBQUFmLFVBQUEsQ0FBQVcsR0FBQSxDQUFBSixRQUFBO0FBQUEsU0FBQU8seUJBQUFQLFFBQUEsRUFBQUMsVUFBQSxFQUFBckIsS0FBQSxRQUFBcUIsVUFBQSxDQUFBTixHQUFBLElBQUFNLFVBQUEsQ0FBQU4sR0FBQSxDQUFBVSxJQUFBLENBQUFMLFFBQUEsRUFBQXBCLEtBQUEsaUJBQUFxQixVQUFBLENBQUFRLFFBQUEsY0FBQVgsU0FBQSxnREFBQUcsVUFBQSxDQUFBckIsS0FBQSxHQUFBQSxLQUFBO0FBRTNFO0FBQ0EsSUFBTThCLFlBQVksR0FBRztFQUNuQkMsTUFBTSxFQUFFLENBQUUsUUFBUSxDQUFFO0VBQ3BCQyxPQUFPLEVBQUUsQ0FBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFFO0VBQzFEQyxLQUFLLEVBQUU7SUFBRSxNQUFNLEVBQUUsR0FBRztJQUFFLFNBQVMsRUFBRSxHQUFHO0lBQUUsUUFBUSxFQUFFO0VBQUksQ0FBQztFQUNyRGhDLE9BQU8sRUFBRTtJQUFFLE1BQU0sRUFBRSxLQUFLO0lBQUUsU0FBUyxFQUFFLEtBQUs7SUFBRSxNQUFNLEVBQUUsS0FBSztJQUFFLE9BQU8sRUFBRSxLQUFLO0lBQUUsU0FBUyxFQUFFLEtBQUs7SUFBRSxRQUFRLEVBQUU7RUFBSyxDQUFDO0VBQzdHLElBQUksRUFBRSxJQUFJO0VBQ1ZpQyxTQUFTLEVBQUUsSUFBSTtFQUNmQyxPQUFPLEVBQUUsU0FBQUEsUUFBV0MsR0FBRyxFQUFHO0lBQ3hCLElBQUcsT0FBT0EsR0FBSSxLQUFLLFFBQVEsSUFBSUEsR0FBRyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ3pEQyxPQUFPLENBQUNDLElBQUksc0JBQUFDLE1BQUEsQ0FBc0JILEdBQUcsT0FBSSxDQUFDO0lBQzFDLE9BQU8sS0FBSztFQUNkO0FBQ0YsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BLElBQUFJLEtBQUEsb0JBQUFDLE9BQUE7QUFPZSxNQUFNQyxRQUFRLENBQUM7RUFJNUI7QUFDRjtBQUNBO0FBQ0E7RUFDRUMsV0FBV0EsQ0FBQ0MsSUFBSSxFQUFFO0lBQUEsSUFBQUMsc0JBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUE7SUFQbEI7SUFBQXBDLDBCQUFBLE9BQUE0QixLQUFBO01BQUFYLFFBQUE7TUFBQTdCLEtBQUEsRUFDUTtJQUFJO0lBT1YwQixxQkFBQSxLQUFJLEVBQUFjLEtBQUEsRUFBUyxJQUFBUyxpQkFBUSxFQUFDTCxJQUFJLENBQUNNLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRXBCLFlBQVksQ0FBQztJQUVsRCxLQUFBZSxzQkFBQSxHQUFBMUIscUJBQUEsQ0FBRyxJQUFJLEVBQUFxQixLQUFBLGVBQUFLLHNCQUFBLGVBQUpBLHNCQUFBLENBQVlNLEtBQUssRUFBRTtNQUNwQmQsT0FBTyxDQUFDQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUVjLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUM3Q2hCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLCtCQUErQixDQUFDO01BQzdDRCxPQUFPLENBQUNDLElBQUksQ0FBQW5CLHFCQUFBLENBQUMsSUFBSSxFQUFBcUIsS0FBQSxDQUFNLENBQUM7SUFDMUI7SUFFQSxLQUFBTSxzQkFBQSxHQUFBM0IscUJBQUEsQ0FBRyxJQUFJLEVBQUFxQixLQUFBLGVBQUFNLHNCQUFBLGVBQUpBLHNCQUFBLENBQVlRLElBQUksRUFBRTtNQUNuQixJQUFJLENBQUNDLFNBQVMsQ0FBQyxDQUFDO01BQ2hCSCxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakI7SUFFQSxLQUFBVCxzQkFBQSxHQUFBNUIscUJBQUEsQ0FBRyxJQUFJLEVBQUFxQixLQUFBLGVBQUFPLHNCQUFBLGVBQUpBLHNCQUFBLENBQVlVLE9BQU8sRUFBRTtNQUN0QixJQUFJLENBQUNDLFlBQVksQ0FBQyxDQUFDO01BQ25CTixPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakI7SUFFQSxLQUFBUixzQkFBQSxHQUFBN0IscUJBQUEsQ0FBRyxJQUFJLEVBQUFxQixLQUFBLGVBQUFRLHNCQUFBLGVBQUpBLHNCQUFBLENBQVlXLElBQUksRUFBRTtNQUNuQixJQUFJLENBQUNDLHdCQUF3QixDQUFDLENBQUM7TUFDL0JSLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqQjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFSyxJQUFJQSxDQUFBLEVBQUc7SUFBQSxJQUFBQyxzQkFBQSxFQUFBQyxzQkFBQTtJQUNMLElBQUlDLE1BQU0sR0FBRyxJQUFJO0lBRWpCLElBQU1DLFVBQVUsR0FBRyxJQUFJLENBQUNDLG1CQUFtQixDQUFDLENBQUM7SUFFN0MsS0FBQUosc0JBQUEsR0FBQTNDLHFCQUFBLENBQUcsSUFBSSxFQUFBcUIsS0FBQSxlQUFBc0Isc0JBQUEsZUFBSkEsc0JBQUEsQ0FBWVgsS0FBSyxFQUFFO01BQ3BCZCxPQUFPLENBQUNDLElBQUksQ0FBQywrQ0FBK0MsQ0FBQztNQUM3REQsT0FBTyxDQUFDQyxJQUFJLENBQUMyQixVQUFVLENBQUM7SUFDMUI7O0lBRUE7SUFDQSxJQUFHQSxVQUFVLEVBQUU7TUFDYkQsTUFBTSxHQUFHLElBQUksQ0FBQ0cseUJBQXlCLENBQUNGLFVBQVUsQ0FBQztJQUNyRCxDQUFDLE1BQU07TUFDTEQsTUFBTSxHQUFHLElBQUksQ0FBQ0ksNEJBQTRCLENBQUMsQ0FBQztJQUM5QztJQUVBLEtBQUFMLHNCQUFBLEdBQUE1QyxxQkFBQSxDQUFHLElBQUksRUFBQXFCLEtBQUEsZUFBQXVCLHNCQUFBLGVBQUpBLHNCQUFBLENBQVlaLEtBQUssRUFBRTtNQUNwQmQsT0FBTyxDQUFDQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7TUFDakNELE9BQU8sQ0FBQ0MsSUFBSSxDQUFDMEIsTUFBTSxDQUFDO0lBQ3RCO0lBRUEsSUFBR0EsTUFBTSxFQUFFO01BQUEsSUFBQUssc0JBQUEsRUFBQUMsc0JBQUE7TUFDVCxLQUFBRCxzQkFBQSxHQUFBbEQscUJBQUEsQ0FBRyxJQUFJLEVBQUFxQixLQUFBLGVBQUE2QixzQkFBQSxlQUFKQSxzQkFBQSxDQUFZbEIsS0FBSyxFQUFFO1FBQ3BCYSxNQUFNLENBQUNiLEtBQUssR0FBRyxJQUFJO01BQ3JCO01BQ0EsS0FBQW1CLHNCQUFBLEdBQUFuRCxxQkFBQSxDQUFHLElBQUksRUFBQXFCLEtBQUEsZUFBQThCLHNCQUFBLGVBQUpBLHNCQUFBLENBQVlDLE9BQU8sRUFBRTtRQUN0QlAsTUFBTSxDQUFDTyxPQUFPLEdBQUcsSUFBSTtNQUN2QjtNQUNBQyxjQUFLLENBQUNDLFFBQVEsQ0FBQ1QsTUFBTSxDQUFDO0lBQ3hCLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ1QsU0FBUyxDQUFDLENBQUM7TUFDaEJILE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqQjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0VBQ0VELFNBQVNBLENBQUEsRUFBRztJQUNWbEIsT0FBTyxDQUFDQyxJQUFJLElBQUFDLE1BQUEsQ0FDTG1DLE1BQU0sQ0FBQyw0Q0FBNEMsR0FDdEQsSUFBSSxHQUNKLFlBQVksR0FDWix5RUFBeUUsR0FDekUsNkRBQTZELEdBQzdELGtEQUFrRCxHQUNsRCwrREFBK0QsR0FDL0QsMkNBQTJDLEdBQzNDLCtCQUErQixHQUMvQiwrQ0FBK0MsR0FDL0MsNkNBQTZDLEdBQzdDLHlDQUF5QyxDQUFDLENBQzlDLENBQUM7RUFDSDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUNFaEIsWUFBWUEsQ0FBQSxFQUFHO0lBQ2IsSUFBTWlCLFVBQVUsR0FBR0MsZ0JBQU8sQ0FBQ0MsV0FBVyxDQUFDLENBQUM7SUFDeEMsSUFBSUYsVUFBVSxFQUFFO01BQ2R0QyxPQUFPLENBQUNDLElBQUksQ0FBQ3FDLFVBQVUsQ0FBQ2xCLE9BQU8sQ0FBQztJQUNsQyxDQUFDLE1BQU07TUFDTHBCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN2QjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFc0Isd0JBQXdCQSxDQUFBLEVBQUc7SUFDekIsSUFBSWtCLGdCQUFFLENBQUNDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRztNQUNqQzFDLE9BQU8sQ0FBQzJDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztNQUNoRDtJQUNGO0lBQ0EsSUFBTUMsSUFBSSxHQUNSLEtBQUssR0FDTCx3QkFBd0IsR0FDeEIsOEJBQThCLEdBQzlCLHFCQUFxQixHQUNyQix1QkFBdUIsR0FDdkIsbUJBQW1CLEdBQ25CLGNBQWMsR0FDZCxRQUFRLEdBQ1IsbUJBQW1CLEdBQ25CLHNCQUFzQixHQUN0QixtQkFBbUIsR0FDbkIsUUFBUSxHQUNSLDZCQUE2QixHQUM3QixrQ0FBa0MsR0FDbEMsbUJBQW1CLEdBQ25CLHdDQUF3QyxHQUN4QyxvQkFBb0IsR0FDcEIsNEZBQTRGLEdBQzVGLHFDQUFxQyxHQUNyQyx5Q0FBeUMsR0FDekMscURBQXFELEdBQ3JELHNEQUFzRCxHQUN0RCw4Q0FBOEMsR0FDOUMsbUJBQW1CLEdBQ25CLCtCQUErQixHQUMvQix1REFBdUQsR0FDdkQsdUNBQXVDLEdBQ3ZDLFdBQVcsR0FDWCxTQUFTLEdBQ1QsUUFBUSxHQUNSLEdBQUc7SUFDTCxJQUFJO01BQ0ZILGdCQUFFLENBQUNJLGFBQWEsQ0FBQyxhQUFhLEVBQUNELElBQUksQ0FBQztJQUN0QyxDQUFDLENBQUMsT0FBT0UsR0FBRyxFQUFFO01BQ1o5QyxPQUFPLENBQUMrQyxLQUFLLENBQUMsdUNBQXVDLEVBQUVELEdBQUcsQ0FBQ0UsT0FBTyxDQUFDO01BQ25FaEQsT0FBTyxDQUFDK0MsS0FBSyxDQUFDRCxHQUFHLENBQUM7SUFDcEI7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VqQixtQkFBbUJBLENBQUEsRUFBRztJQUFBLElBQUFvQix1QkFBQTtJQUNwQixLQUFBQSx1QkFBQSxHQUFBbkUscUJBQUEsQ0FBSSxJQUFJLEVBQUFxQixLQUFBLGVBQUE4Qyx1QkFBQSxlQUFKQSx1QkFBQSxDQUFZdEIsTUFBTSxFQUFHO01BQ3ZCO01BQ0EsSUFBSWMsZ0JBQUUsQ0FBQ0MsVUFBVSxDQUFDNUQscUJBQUEsS0FBSSxFQUFBcUIsS0FBQSxFQUFPd0IsTUFBTSxDQUFDLEVBQUc7UUFDckMsT0FBTzdDLHFCQUFBLEtBQUksRUFBQXFCLEtBQUEsRUFBT3dCLE1BQU07TUFDMUI7TUFDQTNCLE9BQU8sQ0FBQytDLEtBQUssd0JBQUE3QyxNQUFBLENBQXdCcEIscUJBQUEsS0FBSSxFQUFBcUIsS0FBQSxFQUFPd0IsTUFBTSxxQkFBa0IsQ0FBQztNQUN6RVosT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pCO0lBRUEsSUFBSStCLFFBQVEsR0FBR0MsY0FBSyxDQUFDQyxPQUFPLENBQUMsZUFBZSxDQUFDO0lBQzdDO0lBQ0EsSUFBSVgsZ0JBQUUsQ0FBQ0MsVUFBVSxDQUFFUSxRQUFTLENBQUMsRUFBRztNQUM5QixPQUFPQSxRQUFRO0lBQ2pCO0lBRUFBLFFBQVEsR0FBR0MsY0FBSyxDQUFDQyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3hDO0lBQ0EsSUFBSVgsZ0JBQUUsQ0FBQ0MsVUFBVSxDQUFFUSxRQUFTLENBQUMsRUFBRztNQUM5QixPQUFPQSxRQUFRO0lBQ2pCO0lBRUFBLFFBQVEsR0FBR0MsY0FBSyxDQUFDQyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3ZDO0lBQ0EsSUFBSVgsZ0JBQUUsQ0FBQ0MsVUFBVSxDQUFFUSxRQUFTLENBQUMsRUFBRztNQUM5QixPQUFPQSxRQUFRO0lBQ2pCO0lBRUFBLFFBQVEsR0FBR0MsY0FBSyxDQUFDQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3RDO0lBQ0EsSUFBSVgsZ0JBQUUsQ0FBQ0MsVUFBVSxDQUFFUSxRQUFTLENBQUMsRUFBRztNQUM5QixPQUFPQSxRQUFRO0lBQ2pCO0lBRUEsT0FBTyxJQUFJO0VBQ2I7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VwQix5QkFBeUJBLENBQUN1QixjQUFjLEVBQUU7SUFDeENBLGNBQWMsR0FBR0YsY0FBSyxDQUFDQyxPQUFPLENBQUNDLGNBQWMsQ0FBQztJQUM5QyxJQUFNQyxHQUFHLEdBQUdILGNBQUssQ0FBQ0ksT0FBTyxDQUFDRixjQUFjLENBQUM7SUFDekMsSUFBSUMsR0FBRyxLQUFLLEtBQUssRUFBRTtNQUNqQjtNQUNBLE9BQU92RixPQUFPLENBQUNzRixjQUFjLENBQUM7SUFDaEM7SUFFQSxJQUFNRyxVQUFVLEdBQUdDLHdCQUFXLENBQUNDLGdCQUFnQixDQUFDTCxjQUFjLENBQUM7SUFDL0QsSUFBTTFCLE1BQU0sR0FBR2dDLElBQUksQ0FBQ0MsS0FBSyxDQUFDSixVQUFVLENBQUM7SUFDckMsT0FBTzdCLE1BQU07RUFDZjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VJLDRCQUE0QkEsQ0FBQSxFQUFHO0lBQzdCLElBQUk7TUFDRixJQUFNbUIsUUFBUSxHQUFHQyxjQUFLLENBQUNDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztNQUNoRCxJQUFNUyxXQUFXLEdBQUdKLHdCQUFXLENBQUNDLGdCQUFnQixDQUFDUixRQUFRLENBQUM7TUFDMUQsSUFBTVosVUFBVSxHQUFHcUIsSUFBSSxDQUFDQyxLQUFLLENBQUNDLFdBQVcsQ0FBQztNQUMxQyxPQUFPdkIsVUFBVSxDQUFDd0IsS0FBSztJQUN6QixDQUFDLENBQUMsT0FBT0MsQ0FBQyxFQUFFO01BQ1Y7SUFBQTtJQUdGLE9BQU8sSUFBSTtFQUNiO0FBQ0Y7O0FBRUE7QUFBQXJHLE9BQUEsQ0FBQUUsT0FBQSxHQUFBeUMsUUFBQTtBQUNBLElBQU0yRCxnQkFBZ0IsR0FBR3ZCLGdCQUFFLENBQUN3QixZQUFZLENBQUNsRCxPQUFPLENBQUNSLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RCxJQUFJeUQsZ0JBQWdCLEtBQUtFLFVBQVUsRUFBRTtFQUNuQyxJQUFNQyxHQUFHLEdBQUcsSUFBSTlELFFBQVEsQ0FBQ1UsT0FBTyxDQUFDUixJQUFJLENBQUM7RUFDdEM0RCxHQUFHLENBQUMzQyxJQUFJLENBQUMsQ0FBQztBQUNaIn0=