jgb-cli
Version:
```shell npm i -g jgb-cli #全局安装 ```
475 lines • 35.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var Debug = require("debug");
var fs = require("fs");
var lib_1 = require("jgb-shared/lib");
var awaitEventEmitter_1 = require("jgb-shared/lib/awaitEventEmitter");
var Logger_1 = require("jgb-shared/lib/Logger");
var index_1 = require("jgb-shared/lib/utils/index");
var WorkerFarm_1 = require("jgb-shared/lib/workerfarm/WorkerFarm");
var Path = require("path");
var util_1 = require("util");
var Compiler_1 = require("./Compiler");
var FSCache_1 = require("./FSCache");
var PromiseQueue_1 = require("./utils/PromiseQueue");
var Watcher_1 = require("./Watcher");
var debug = Debug('core');
var Core = /** @class */ (function (_super) {
tslib_1.__extends(Core, _super);
function Core(options) {
var _this = _super.call(this) || this;
_this.currentDir = process.cwd();
_this.loadedAssets = new Map();
_this.watchedAssets = new Map();
_this.hooks = options.hooks || [];
_this.options = _this.normalizeOptions(options);
if (options.rootDir) {
_this.currentDir = options.rootDir;
}
_this.entryFiles = _this.normalizeEntryFiles();
_this.resolver = new lib_1.Resolver(_this.options);
_this.compiler = new Compiler_1.default(_this.options);
_this.buildQueue = new PromiseQueue_1.default(_this.processAsset.bind(_this));
if (_this.options.cache) {
_this.cache = new FSCache_1.default(_this.options);
}
return _this;
}
Core.prototype.normalizeEntryFiles = function () {
var _this = this;
return []
.concat(this.options.entryFiles || [])
.filter(Boolean)
.map(function (f) { return Path.resolve(_this.options.sourceDir, f); });
};
Core.prototype.normalizeOptions = function (options) {
var rootDir = Path.resolve(options.rootDir || this.currentDir);
return {
plugins: options.plugins,
presets: options.presets,
watch: !!options.watch,
rootDir: rootDir,
useLocalWorker: !!options.useLocalWorker,
outDir: Path.resolve(options.outDir || 'dist'),
npmDir: Path.resolve(options.npmDir || 'node_modules'),
entryFiles: [].concat(options.entryFiles),
cache: !!options.cache,
sourceDir: Path.resolve(options.sourceDir || 'src'),
alias: aliasResolve(options, rootDir),
minify: !!options.minify,
source: options.source || 'wx',
target: options.target || 'wx',
lib: options.lib
};
};
Core.prototype.initHook = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var allHooks;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!this.hooks || this.hooks.length === 0) {
return [2 /*return*/];
}
allHooks = this.hooks.map(function (fn) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fn(this)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); });
return [4 /*yield*/, Promise.all(allHooks)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Core.prototype.init = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.compiler.init(this.resolver)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Core.prototype.start = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var e_1, _a, startTime, _b, _c, entry, asset, e_1_1, endTime;
return tslib_1.__generator(this, function (_d) {
switch (_d.label) {
case 0:
startTime = new Date();
if (this.farm) {
return [2 /*return*/];
}
return [4 /*yield*/, this.initHook()];
case 1:
_d.sent();
return [4 /*yield*/, this.emit('before-init')];
case 2:
_d.sent();
return [4 /*yield*/, this.init()];
case 3:
_d.sent();
return [4 /*yield*/, this.emit('before-compiler')];
case 4:
_d.sent();
// another channce to modify entryFiles
this.entryFiles = this.normalizeEntryFiles();
if (this.options.watch) {
this.watcher = new Watcher_1.default();
this.watcher.on('change', this.onChange.bind(this));
}
this.farm = WorkerFarm_1.default.getShared(this.options, {
workerPath: require.resolve('./worker'),
core: this
});
_d.label = 5;
case 5:
_d.trys.push([5, 10, 11, 12]);
_b = tslib_1.__values(new Set(this.entryFiles)), _c = _b.next();
_d.label = 6;
case 6:
if (!!_c.done) return [3 /*break*/, 9];
entry = _c.value;
return [4 /*yield*/, this.resolveAsset(entry)];
case 7:
asset = _d.sent();
this.buildQueue.add(asset);
_d.label = 8;
case 8:
_c = _b.next();
return [3 /*break*/, 6];
case 9: return [3 /*break*/, 12];
case 10:
e_1_1 = _d.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 12];
case 11:
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
return [7 /*endfinally*/];
case 12: return [4 /*yield*/, this.buildQueue.run()];
case 13:
_d.sent();
endTime = new Date();
Logger_1.logger.info("\u7F16\u8BD1\u8017\u65F6:" + (endTime.getTime() - startTime.getTime()) + "ms");
return [4 /*yield*/, this.emit('end-build')];
case 14:
_d.sent();
this.farm.stopPref();
if (!!this.options.watch) return [3 /*break*/, 16];
return [4 /*yield*/, this.stop()];
case 15:
_d.sent();
_d.label = 16;
case 16: return [2 /*return*/];
}
});
});
};
Core.prototype.processAsset = function (asset, isRebuild) {
if (isRebuild === void 0) { isRebuild = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (isRebuild) {
asset.invalidate();
if (this.cache) {
this.cache.invalidate(asset.name);
}
}
return [4 /*yield*/, this.loadAsset(asset)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Core.prototype.getAsset = function (name, parent) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var asset;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.resolveAsset(name, parent)];
case 1:
asset = _a.sent();
this.buildQueue.add(asset);
return [4 /*yield*/, this.buildQueue.run()];
case 2:
_a.sent();
return [2 /*return*/, asset];
}
});
});
};
Core.prototype.resolveAsset = function (name, parent) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var path;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.resolver.resolve(name, parent)];
case 1:
path = (_a.sent()).path;
return [2 /*return*/, this.getLoadedAsset(path)];
}
});
});
};
Core.prototype.loadAsset = function (asset) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var processed, _a, cacheMiss, dependencies, assetDeps;
var _this = this;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if (asset.processed) {
return [2 /*return*/];
}
// logger.info(asset.name);
asset.processed = true;
asset.startTime = Date.now();
_a = this.cache;
if (!_a) return [3 /*break*/, 2];
return [4 /*yield*/, this.cache.read(asset.name)];
case 1:
_a = (_b.sent());
_b.label = 2;
case 2:
processed = _a;
cacheMiss = false;
if (!(!processed || asset.shouldInvalidate(processed.cacheData))) return [3 /*break*/, 4];
return [4 /*yield*/, this.farm.run(asset.name, asset.distPath)];
case 3:
processed = _b.sent();
cacheMiss = true;
_b.label = 4;
case 4:
asset.endTime = Date.now();
debug(asset.name + " processd time: " + (asset.endTime - asset.startTime) + "ms");
asset.id = processed.id;
// asset.generated = processed.generated;
asset.hash = processed.hash;
dependencies = processed.dependencies;
return [4 /*yield*/, Promise.all(dependencies.map(function (dep) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var assetDep;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
// from cache dep
if (Array.isArray(dep) && dep.length > 1) {
dep = dep[1];
}
// This dependency is already included in the parent's generated output,
// so no need to load it. We map the name back to the parent asset so
// that changing it triggers a recompile of the parent.
if (dep.includedInParent) {
this.watch(dep.name, asset);
return [2 /*return*/];
}
dep.parent = asset.name;
return [4 /*yield*/, this.resolveDep(asset, dep)];
case 1:
assetDep = _a.sent();
if (!assetDep) return [3 /*break*/, 3];
if (dep.distPath) {
assetDep.distPath = dep.distPath;
}
return [4 /*yield*/, this.loadAsset(assetDep)];
case 2:
_a.sent();
dep.asset = assetDep;
dep.resolved = assetDep.name;
return [3 /*break*/, 4];
case 3:
Logger_1.logger.warning("can not resolveDep: " + dep.name);
_a.label = 4;
case 4: return [2 /*return*/, assetDep];
}
});
}); }))];
case 5:
assetDeps = _b.sent();
if (!(this.cache && cacheMiss)) return [3 /*break*/, 7];
return [4 /*yield*/, this.cache.write(asset.name, processed)];
case 6:
_b.sent();
_b.label = 7;
case 7: return [2 /*return*/];
}
});
});
};
Core.prototype.resolveDep = function (asset, dep, install) {
if (install === void 0) { install = true; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var err_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
if (Array.isArray(dep) && dep.length === 2) {
dep = dep[1];
}
if (dep.resolved) {
return [2 /*return*/, this.getLoadedAsset(dep.resolved)];
}
return [4 /*yield*/, this.resolveAsset(dep.name, asset.name)];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_1 = _a.sent();
// If the dep is optional, return before we throw
if (dep.optional) {
return [2 /*return*/];
}
throw err_1;
case 3: return [2 /*return*/];
}
});
});
};
Core.prototype.getLoadedAsset = function (path) {
if (this.loadedAssets.has(path)) {
return this.loadedAssets.get(path);
}
var asset = this.compiler.getAsset(path);
if (this.loadedAssets.has(asset.name)) {
return this.loadedAssets.get(asset.name);
}
this.loadedAssets.set(path, asset);
this.loadedAssets.set(asset.name, asset);
this.watch(path, asset);
return asset;
};
Core.prototype.watch = function (path, asset) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!this.watcher) {
return [2 /*return*/];
}
return [4 /*yield*/, util_1.promisify(fs.realpath)(path)];
case 1:
path = _a.sent();
if (!this.watchedAssets.has(path)) {
this.watcher.watch(path);
this.watchedAssets.set(path, new Set());
}
this.watchedAssets.get(path).add(asset);
return [2 /*return*/];
}
});
});
};
Core.prototype.stop = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.watcher) {
this.watcher.stop();
}
if (!this.farm) return [3 /*break*/, 2];
return [4 /*yield*/, this.farm.end()];
case 1:
_a.sent();
_a.label = 2;
case 2: return [2 /*return*/];
}
});
});
};
Core.prototype.unwatch = function (path, asset) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var watched;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, util_1.promisify(fs.realpath)(path)];
case 1:
path = _a.sent();
if (!this.watchedAssets.has(path)) {
return [2 /*return*/];
}
watched = this.watchedAssets.get(path);
watched.delete(asset);
if (watched.size === 0) {
this.watchedAssets.delete(path);
this.watcher.unwatch(path);
}
return [2 /*return*/];
}
});
});
};
Core.prototype.onChange = function (path) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var e_2, _a, assets, assets_1, assets_1_1, asset;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
assets = this.watchedAssets.get(path);
if (!assets) {
return [2 /*return*/];
}
try {
// Add the asset to the rebuild queue, and reset the timeout.
for (assets_1 = tslib_1.__values(assets), assets_1_1 = assets_1.next(); !assets_1_1.done; assets_1_1 = assets_1.next()) {
asset = assets_1_1.value;
this.buildQueue.add(asset, true);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (assets_1_1 && !assets_1_1.done && (_a = assets_1.return)) _a.call(assets_1);
}
finally { if (e_2) throw e_2.error; }
}
return [4 /*yield*/, this.buildQueue.run()];
case 1:
_b.sent();
return [2 /*return*/];
}
});
});
};
return Core;
}(awaitEventEmitter_1.default));
exports.default = Core;
function aliasResolve(options, root) {
var alias = options.alias || {};
var newAlias = {};
/**
* 先排序 字符长度由长到短排序 (优先匹配)
* 再补充 resolve(aliasValue)
*/
Object.keys(alias)
.sort(function (a1, a2) { return a2.length - a1.length; })
.forEach(function (key) {
var aliasValue = index_1.normalizeAlias(alias[key]);
var aliasPath = aliasValue.path;
if (!Path.isAbsolute(aliasPath)) {
if (aliasPath.startsWith('.')) {
aliasValue.path = index_1.pathToUnixType(Path.resolve(root, aliasPath));
}
else {
aliasValue.path = index_1.pathToUnixType(Path.resolve(root, 'node_modules', aliasPath));
}
}
newAlias[key] = aliasValue;
});
return newAlias;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUErQjtBQUMvQix1QkFBeUI7QUFDekIsc0NBQStEO0FBQy9ELHNFQUFpRTtBQUNqRSxnREFBZ0U7QUFDaEUsb0RBQTRFO0FBQzVFLG1FQUE4RDtBQUM5RCwyQkFBNkI7QUFDN0IsNkJBQWlDO0FBQ2pDLHVDQUFrQztBQUNsQyxxQ0FBZ0M7QUFDaEMscURBQWdEO0FBQ2hELHFDQUFnQztBQUVoQyxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFNUI7SUFBa0MsZ0NBQWlCO0lBZWpELGNBQVksT0FBcUI7UUFBakMsWUFDRSxpQkFBTyxTQWdCUjtRQS9CTyxnQkFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixrQkFBWSxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBUWhELG1CQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQU94QixLQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2pDLEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDbkM7UUFFRCxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdDLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxjQUFRLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksc0JBQVksQ0FBQyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDdEIsS0FBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGlCQUFPLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDOztJQUNILENBQUM7SUFFRCxrQ0FBbUIsR0FBbkI7UUFBQSxpQkFLQztRQUpDLE9BQU8sRUFBRTthQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7YUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQXZDLENBQXVDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsK0JBQWdCLEdBQWhCLFVBQWlCLE9BQXFCO1FBQ3BDLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsT0FBTztZQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUN0QixPQUFPLFNBQUE7WUFDUCxjQUFjLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO1lBQzlDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO1lBQ3RELFVBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDekMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUN0QixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztZQUNuRCxLQUFLLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFDckMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJO1lBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUk7WUFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUssdUJBQVEsR0FBZDs7Ozs7Ozt3QkFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7NEJBQzFDLHNCQUFPO3lCQUNSO3dCQUVLLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFNLEVBQUU7O3dDQUFJLHFCQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBQTt3Q0FBZCxzQkFBQSxTQUFjLEVBQUE7O2lDQUFBLENBQUMsQ0FBQzt3QkFFNUQscUJBQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBQTs7d0JBQTNCLFNBQTJCLENBQUM7Ozs7O0tBQzdCO0lBRUssbUJBQUksR0FBVjs7Ozs0QkFDRSxxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUF2QyxTQUF1QyxDQUFDOzs7OztLQUN6QztJQUVLLG9CQUFLLEdBQVg7Ozs7Ozt3QkFDUSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFFN0IsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFOzRCQUNiLHNCQUFPO3lCQUNSO3dCQUVELHFCQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBQTs7d0JBQXJCLFNBQXFCLENBQUM7d0JBRXRCLHFCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUE7O3dCQUE5QixTQUE4QixDQUFDO3dCQUUvQixxQkFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFqQixTQUFpQixDQUFDO3dCQUVsQixxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUE7O3dCQUFsQyxTQUFrQyxDQUFDO3dCQUVuQyx1Q0FBdUM7d0JBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7d0JBRTdDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7NEJBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxFQUFFLENBQUM7NEJBRTdCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3lCQUNyRDt3QkFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQzdDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzs0QkFDdkMsSUFBSSxFQUFFLElBQUk7eUJBQ1gsQ0FBQyxDQUFDOzs7O3dCQUVpQixLQUFBLGlCQUFBLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTs7Ozt3QkFBakMsS0FBSzt3QkFDQSxxQkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFBOzt3QkFBdEMsS0FBSyxHQUFHLFNBQThCO3dCQUU1QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs2QkFHN0IscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQTs7d0JBQTNCLFNBQTJCLENBQUM7d0JBRXRCLE9BQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUUzQixlQUFNLENBQUMsSUFBSSxDQUFDLCtCQUFRLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQUksQ0FBQyxDQUFDO3dCQUVqRSxxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFBOzt3QkFBNUIsU0FBNEIsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs2QkFFakIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBbkIseUJBQW1CO3dCQUNyQixxQkFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFqQixTQUFpQixDQUFDOzs7Ozs7S0FFckI7SUFFSywyQkFBWSxHQUFsQixVQUFtQixLQUFZLEVBQUUsU0FBaUI7UUFBakIsMEJBQUEsRUFBQSxpQkFBaUI7Ozs7O3dCQUNoRCxJQUFJLFNBQVMsRUFBRTs0QkFDYixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQ0FDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQ25DO3lCQUNGO3dCQUVELHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUE7O3dCQUEzQixTQUEyQixDQUFDOzs7OztLQUM3QjtJQUVLLHVCQUFRLEdBQWQsVUFBZSxJQUFZLEVBQUUsTUFBYzs7Ozs7NEJBQzNCLHFCQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFBOzt3QkFBN0MsS0FBSyxHQUFHLFNBQXFDO3dCQUNuRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0IscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQTs7d0JBQTNCLFNBQTJCLENBQUM7d0JBQzVCLHNCQUFPLEtBQUssRUFBQzs7OztLQUNkO0lBRUssMkJBQVksR0FBbEIsVUFBbUIsSUFBWSxFQUFFLE1BQWU7Ozs7OzRCQUM3QixxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUFsRCxJQUFJLEdBQUssQ0FBQSxTQUF5QyxDQUFBLEtBQTlDO3dCQUVaLHNCQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUM7Ozs7S0FDbEM7SUFFSyx3QkFBUyxHQUFmLFVBQWdCLEtBQVk7Ozs7Ozs7d0JBQzFCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTs0QkFDbkIsc0JBQU87eUJBQ1I7d0JBRUQsMkJBQTJCO3dCQUUzQixLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFFdkIsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRzNCLEtBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQTtpQ0FBVix3QkFBVTt3QkFBSyxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUE7O3dCQUFsQyxLQUFBLENBQUMsU0FBaUMsQ0FBQyxDQUFBOzs7d0JBRC9DLFNBQVMsS0FDc0M7d0JBQy9DLFNBQVMsR0FBRyxLQUFLLENBQUM7NkJBRWxCLENBQUEsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQSxFQUF6RCx3QkFBeUQ7d0JBQy9DLHFCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFBOzt3QkFBM0QsU0FBUyxHQUFHLFNBQStDLENBQUM7d0JBQzVELFNBQVMsR0FBRyxJQUFJLENBQUM7Ozt3QkFHbkIsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRTNCLEtBQUssQ0FBSSxLQUFLLENBQUMsSUFBSSx5QkFBbUIsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxRQUFJLENBQUMsQ0FBQzt3QkFFM0UsS0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUN4Qix5Q0FBeUM7d0JBQ3pDLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQzt3QkFFdEIsWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7d0JBRTFCLHFCQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2pDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBTSxHQUFHOzs7Ozs0Q0FDeEIsaUJBQWlCOzRDQUNqQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0RBQ3hDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NkNBQ2Q7NENBQ0Qsd0VBQXdFOzRDQUN4RSxxRUFBcUU7NENBQ3JFLHVEQUF1RDs0Q0FDdkQsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLEVBQUU7Z0RBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnREFDNUIsc0JBQU87NkNBQ1I7NENBRUQsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDOzRDQUNQLHFCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFBOzs0Q0FBNUMsUUFBUSxHQUFHLFNBQWlDO2lEQUM5QyxRQUFRLEVBQVIsd0JBQVE7NENBQ1YsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO2dEQUNoQixRQUFRLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7NkNBQ2xDOzRDQUVELHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUE7OzRDQUE5QixTQUE4QixDQUFDOzRDQUUvQixHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQzs0Q0FDckIsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDOzs7NENBRTdCLGVBQU0sQ0FBQyxPQUFPLENBQUMseUJBQXVCLEdBQUcsQ0FBQyxJQUFNLENBQUMsQ0FBQzs7Z0RBR3BELHNCQUFPLFFBQVEsRUFBQzs7O2lDQUNqQixDQUFDLENBQ0gsRUFBQTs7d0JBL0JLLFNBQVMsR0FBRyxTQStCakI7NkJBRUcsQ0FBQSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQSxFQUF2Qix3QkFBdUI7d0JBQ3pCLHFCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUE7O3dCQUE3QyxTQUE2QyxDQUFDOzs7Ozs7S0FFakQ7SUFFSyx5QkFBVSxHQUFoQixVQUFpQixLQUFZLEVBQUUsR0FBUSxFQUFFLE9BQWM7UUFBZCx3QkFBQSxFQUFBLGNBQWM7Ozs7Ozs7d0JBRW5ELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDMUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDZDt3QkFFRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7NEJBQ2hCLHNCQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFDO3lCQUMxQzt3QkFFTSxxQkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFBOzRCQUFwRCxzQkFBTyxTQUE2QyxFQUFDOzs7d0JBRXJELGlEQUFpRDt3QkFDakQsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFOzRCQUNoQixzQkFBTzt5QkFDUjt3QkFFRCxNQUFNLEtBQUcsQ0FBQzs7Ozs7S0FFYjtJQUVELDZCQUFjLEdBQWQsVUFBZSxJQUFZO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUVELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUssb0JBQUssR0FBWCxVQUFZLElBQVksRUFBRSxLQUFZOzs7Ozt3QkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQ2pCLHNCQUFPO3lCQUNSO3dCQUVNLHFCQUFNLGdCQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFBOzt3QkFBekMsSUFBSSxHQUFHLFNBQWtDLENBQUM7d0JBRTFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7eUJBQ3pDO3dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7S0FDekM7SUFFSyxtQkFBSSxHQUFWOzs7Ozt3QkFDRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQ3JCOzZCQUVHLElBQUksQ0FBQyxJQUFJLEVBQVQsd0JBQVM7d0JBQ1gscUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBQTs7d0JBQXJCLFNBQXFCLENBQUM7Ozs7OztLQUV6QjtJQUVLLHNCQUFPLEdBQWIsVUFBYyxJQUFZLEVBQUUsS0FBWTs7Ozs7NEJBQy9CLHFCQUFNLGdCQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFBOzt3QkFBekMsSUFBSSxHQUFHLFNBQWtDLENBQUM7d0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakMsc0JBQU87eUJBQ1I7d0JBRUssT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUV0QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFOzRCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzVCOzs7OztLQUNGO0lBRUssdUJBQVEsR0FBZCxVQUFlLElBQVk7Ozs7Ozt3QkFDbkIsTUFBTSxHQUFZLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUNYLHNCQUFPO3lCQUNSOzs0QkFFRCw2REFBNkQ7NEJBQzdELEtBQW9CLFdBQUEsaUJBQUEsTUFBTSxDQUFBLGdGQUFFO2dDQUFqQixLQUFLO2dDQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzs2QkFDbEM7Ozs7Ozs7Ozt3QkFFRCxxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFBOzt3QkFBM0IsU0FBMkIsQ0FBQzs7Ozs7S0FDN0I7SUFDSCxXQUFDO0FBQUQsQ0FBQyxBQW5URCxDQUFrQywyQkFBaUIsR0FtVGxEOztBQUVELFNBQVMsWUFBWSxDQUFDLE9BQXFCLEVBQUUsSUFBWTtJQUN2RCxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxJQUFNLFFBQVEsR0FBMkIsRUFBRSxDQUFDO0lBQzVDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ2YsSUFBSSxDQUFDLFVBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSyxPQUFBLEVBQUUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBckIsQ0FBcUIsQ0FBQztTQUN2QyxPQUFPLENBQUMsVUFBQSxHQUFHO1FBQ1YsSUFBTSxVQUFVLEdBQUcsc0JBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0IsVUFBVSxDQUFDLElBQUksR0FBRyxzQkFBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsVUFBVSxDQUFDLElBQUksR0FBRyxzQkFBYyxDQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQzlDLENBQUM7YUFDSDtTQUNGO1FBRUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMifQ==