@pubgcorp/pk-template
Version:
p template engine for kubernetes
234 lines • 20.6 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.exec = exports.tpl = exports.promptSuccess = exports.promptSkip = exports.promptStart = exports.prompt = exports.isValidDeployment = exports.visitEachDeployments = exports.getEnvNames = exports.getCurrentDirectoryApp = exports.atModuleDir = exports.atAppDir = exports.invokeModuleHooks = exports.atProjectDir = exports.atDir = exports.atHomeDir = exports.tryCatch = exports.log = void 0;
const exception_1 = require("../pk-util/exception");
const projectConf_1 = require("../pk-conf/projectConf");
const path_1 = require("path");
const module_1 = require("../pk-conf/module");
const os_1 = require("os");
const preserveDir_1 = require("../pk-util/preserveDir");
const lazy_1 = require("../lazy");
const child_process_1 = require("child_process");
const fs_1 = require("fs");
const log = (...args) => console.log(...args);
exports.log = log;
const tryCatch = (cb, debug) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield cb();
}
catch (e) {
yield (0, exception_1.exceptionHandler)(e, debug);
}
});
exports.tryCatch = tryCatch;
const atHomeDir = (cb) => __awaiter(void 0, void 0, void 0, function* () {
const home = (0, os_1.homedir)();
yield (0, exports.atDir)(home, () => __awaiter(void 0, void 0, void 0, function* () {
yield cb(home);
}));
});
exports.atHomeDir = atHomeDir;
const atDir = (dir, cb) => __awaiter(void 0, void 0, void 0, function* () {
yield (0, preserveDir_1.preserveDir)(() => __awaiter(void 0, void 0, void 0, function* () {
process.chdir(dir);
yield cb(dir);
}));
});
exports.atDir = atDir;
const atProjectDir = (cb) => __awaiter(void 0, void 0, void 0, function* () {
const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find();
if (!projectRoot || !projectConf) {
throw new Error(`cannot find ${projectConf_1.PkProjectConf.FILENAME}`);
}
yield (0, exports.atDir)(projectRoot, () => __awaiter(void 0, void 0, void 0, function* () {
yield cb(projectRoot, projectConf);
}));
});
exports.atProjectDir = atProjectDir;
const invokeModuleHooks = (pk, projectConf, name, value) => __awaiter(void 0, void 0, void 0, function* () {
for (const mod of projectConf.data.modules) {
const hookPath = (0, path_1.join)(process.cwd(), 'pk-modules', mod.name, 'hooks', `${name}.js`);
if ((0, fs_1.existsSync)(hookPath)) {
const hook = require(hookPath)(pk);
yield hook(value);
}
}
});
exports.invokeModuleHooks = invokeModuleHooks;
const atAppDir = (appName, cb) => __awaiter(void 0, void 0, void 0, function* () {
const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find();
if (!projectRoot || !projectConf) {
throw new Error(`cannot find ${projectConf_1.PkProjectConf.FILENAME}`);
}
const app = projectConf.getApp(appName);
if (!app) {
throw new Error(`app ${appName} does not exists`);
}
yield (0, exports.atDir)((0, path_1.join)(projectRoot, appName), () => __awaiter(void 0, void 0, void 0, function* () {
yield cb(app);
}));
});
exports.atAppDir = atAppDir;
const atModuleDir = (moduleName, cb) => __awaiter(void 0, void 0, void 0, function* () {
const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find();
if (!projectRoot || !projectConf) {
throw new Error(`cannot find ${projectConf_1.PkProjectConf.FILENAME}`);
}
const module = projectConf.getModule(moduleName);
if (!module) {
throw new Error(`module ${moduleName} does not exists`);
}
yield (0, exports.atDir)((0, path_1.join)(projectRoot, module_1.MODULE_DIR, moduleName), () => __awaiter(void 0, void 0, void 0, function* () {
yield cb(module);
}));
});
exports.atModuleDir = atModuleDir;
const getCurrentDirectoryApp = (apps, root, cwd) => {
const app = apps.find(app => (0, path_1.normalize)(cwd) === (0, path_1.normalize)((0, path_1.join)(root, app.name)));
if (!app) {
throw new Error('please specify app anme');
}
return app;
};
exports.getCurrentDirectoryApp = getCurrentDirectoryApp;
const getEnvNames = (projectConf, app) => {
const envs = {};
if (projectConf.data.envs) {
for (const env of projectConf.data.envs) {
envs[env.name] = true;
}
}
if (app.envs) {
for (const env of app.envs) {
envs[env.name] = true;
}
}
return Object.keys(envs);
};
exports.getEnvNames = getEnvNames;
const visitEachDeployments = (appName, envName, clusterName, cbb) => __awaiter(void 0, void 0, void 0, function* () {
const cwd = process.cwd();
yield (0, exports.atProjectDir)((projectRoot, projectConf) => __awaiter(void 0, void 0, void 0, function* () {
if (!projectConf.data.apps || projectConf.data.apps.length == 0) {
throw new Error('no apps defined in pk-project.yaml');
}
if (appName == '.') {
appName = (0, exports.getCurrentDirectoryApp)(projectConf.data.apps, projectRoot, cwd).name;
}
// const appNames = targetAppNames(projectRoot, projectConf);
for (const app of projectConf.data.apps) {
if (appName != 'all' && appName != app.name) {
continue;
}
yield (0, exports.atAppDir)(app.name, (app) => __awaiter(void 0, void 0, void 0, function* () {
const envs = app.envs || projectConf.data.envs;
if (envs.length == 0) {
if (envName && envName != 'all') {
throw new Error(`env ${envName} does not exists`);
}
}
for (const env of envs) {
if (envName != 'all' && envName && envName != env.name) {
continue;
}
for (const cluster of env.clusters) {
if (clusterName != 'all' && clusterName && clusterName != cluster) {
continue;
}
console.log(`* app = ${app.name}, env = ${env.name}, cluster = ${cluster}`);
yield cbb(projectRoot, projectConf, app, env.name, cluster);
}
}
}));
}
}));
});
exports.visitEachDeployments = visitEachDeployments;
const isValidDeployment = (appName, envName, clusterName) => __awaiter(void 0, void 0, void 0, function* () {
const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find();
if (!projectRoot || !projectConf) {
// throw new Error(`cannot find ${PkProjectConf.FILENAME}`);
return false;
}
if (!projectConf.data.apps || projectConf.data.apps.length == 0) {
// throw new Error('no apps defined in pk-project.yaml');
return false;
}
const app = projectConf.getApp(appName);
if (!app) {
// throw new Error(`app ${appName} does not exists`);
return false;
}
const envs = app.envs || projectConf.data.envs;
const env = envs.find(e => e.name === envName);
if (!env) {
// throw new Error(`env ${envName} does not exists`);
return false;
}
const cluster = env.clusters.find(c => c === clusterName);
if (!cluster) {
// throw new Error(`cluster ${clusterName} does not exists`);
return false;
}
return true;
});
exports.isValidDeployment = isValidDeployment;
const prompt = (inq) => __awaiter(void 0, void 0, void 0, function* () {
return yield (0, lazy_1.getInquirer)().prompt(inq);
});
exports.prompt = prompt;
const promptStart = (msg) => {
console.log((0, lazy_1.getChalk)().grey(` ${msg} ...`));
};
exports.promptStart = promptStart;
const promptSkip = () => {
console.log((0, lazy_1.getChalk)().grey(' skipped !!!'));
};
exports.promptSkip = promptSkip;
const promptSuccess = (msg) => {
console.log((0, lazy_1.getChalk)().grey(` ${msg} !!!`));
};
exports.promptSuccess = promptSuccess;
const tpl = (file) => {
const _ = (0, lazy_1.getUnderscore)();
const tpl = (0, fs_1.readFileSync)(file, 'utf8');
return _.template(tpl);
};
exports.tpl = tpl;
const exec = (command) => __awaiter(void 0, void 0, void 0, function* () {
console.log((0, lazy_1.getChalk)().grey(` * exec: ${command}`));
return new Promise((resolve, reject) => {
var _a, _b;
try {
const ps = (0, child_process_1.exec)(command);
process.stdout.write(' ');
const cb = (data) => {
const indented = data.replace(/\n/g, '\n ');
process.stdout.write((0, lazy_1.getChalk)().grey(indented));
};
(_a = ps.stdout) === null || _a === void 0 ? void 0 : _a.on('data', cb);
(_b = ps.stderr) === null || _b === void 0 ? void 0 : _b.on('data', cb);
ps.on('close', code => {
console.log();
if (code == 0) {
resolve();
}
reject(new Error(`process exited with code = ${code}`));
});
}
catch (e) {
reject(e);
}
});
});
exports.exec = exec;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9way9saWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG9EQUF3RDtBQUN4RCx3REFBdUQ7QUFFdkQsK0JBQXVDO0FBQ3ZDLDhDQUErQztBQUMvQywyQkFBNkI7QUFDN0Isd0RBQXFEO0FBQ3JELGtDQUErRDtBQUMvRCxpREFBMkQ7QUFDM0QsMkJBQThDO0FBR3ZDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFTLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUE3QyxRQUFBLEdBQUcsT0FBMEM7QUFDbkQsTUFBTSxRQUFRLEdBQUcsQ0FBTyxFQUFPLEVBQUUsS0FBYyxFQUFFLEVBQUU7SUFDeEQsSUFBSTtRQUNGLE1BQU0sRUFBRSxFQUFFLENBQUM7S0FDWjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsTUFBTSxJQUFBLDRCQUFnQixFQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNsQztBQUNILENBQUMsQ0FBQSxDQUFBO0FBTlksUUFBQSxRQUFRLFlBTXBCO0FBRU0sTUFBTSxTQUFTLEdBQUcsQ0FBTyxFQUFxQyxFQUFFLEVBQUU7SUFDdkUsTUFBTSxJQUFJLEdBQUcsSUFBQSxZQUFPLEdBQUUsQ0FBQztJQUV2QixNQUFNLElBQUEsYUFBSyxFQUFDLElBQUksRUFBRSxHQUFTLEVBQUU7UUFDM0IsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFBLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQSxDQUFBO0FBTlksUUFBQSxTQUFTLGFBTXJCO0FBRU0sTUFBTSxLQUFLLEdBQUcsQ0FBTyxHQUFXLEVBQUUsRUFBaUMsRUFBRSxFQUFFO0lBQzVFLE1BQU0sSUFBQSx5QkFBVyxFQUFDLEdBQVMsRUFBRTtRQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUEsQ0FBQTtBQUxZLFFBQUEsS0FBSyxTQUtqQjtBQUVNLE1BQU0sWUFBWSxHQUFHLENBQU8sRUFBcUUsRUFBRSxFQUFFO0lBQzFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsMkJBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDMUQ7SUFFRCxNQUFNLElBQUEsYUFBSyxFQUFDLFdBQVcsRUFBRSxHQUFTLEVBQUU7UUFDbEMsTUFBTSxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUEsQ0FBQTtBQVRZLFFBQUEsWUFBWSxnQkFTeEI7QUFFTSxNQUFNLGlCQUFpQixHQUFHLENBQU8sRUFBa0IsRUFBRSxXQUEwQixFQUFFLElBQVksRUFBRSxLQUFVLEVBQUUsRUFBRTtJQUNsSCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUEsV0FBSSxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO1FBQ3BGLElBQUksSUFBQSxlQUFVLEVBQUMsUUFBUSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25CO0tBQ0Y7QUFDSCxDQUFDLENBQUEsQ0FBQTtBQVJZLFFBQUEsaUJBQWlCLHFCQVE3QjtBQUVNLE1BQU0sUUFBUSxHQUFHLENBQU8sT0FBZSxFQUFFLEVBQWlDLEVBQUUsRUFBRTtJQUNuRixNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxHQUFHLDJCQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsMkJBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLE9BQU8sa0JBQWtCLENBQUMsQ0FBQztLQUNuRDtJQUVELE1BQU0sSUFBQSxhQUFLLEVBQUMsSUFBQSxXQUFJLEVBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQVMsRUFBRTtRQUNqRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUEsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFBLENBQUE7QUFkWSxRQUFBLFFBQVEsWUFjcEI7QUFFTSxNQUFNLFdBQVcsR0FBRyxDQUFPLFVBQWtCLEVBQUUsRUFBdUMsRUFBRSxFQUFFO0lBQy9GLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsMkJBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDMUQ7SUFFRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsVUFBVSxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsTUFBTSxJQUFBLGFBQUssRUFBQyxJQUFBLFdBQUksRUFBQyxXQUFXLEVBQUUsbUJBQVUsRUFBRSxVQUFVLENBQUMsRUFBRSxHQUFTLEVBQUU7UUFDaEUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFBLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQSxDQUFBO0FBZFksUUFBQSxXQUFXLGVBY3ZCO0FBRU0sTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQWMsRUFBRSxJQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUU7SUFDbEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUEsZ0JBQVMsRUFBQyxHQUFHLENBQUMsS0FBSyxJQUFBLGdCQUFTLEVBQUMsSUFBQSxXQUFJLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztLQUM1QztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFBO0FBTlksUUFBQSxzQkFBc0IsMEJBTWxDO0FBRU0sTUFBTSxXQUFXLEdBQUcsQ0FBQyxXQUEwQixFQUFFLEdBQVcsRUFBRSxFQUFFO0lBQ3JFLE1BQU0sSUFBSSxHQUFRLEVBQUUsQ0FBQztJQUNyQixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDdkI7S0FDRjtJQUNELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtRQUNaLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztTQUN2QjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQTtBQWJZLFFBQUEsV0FBVyxlQWF2QjtBQUlNLE1BQU0sb0JBQW9CLEdBQUcsQ0FBTyxPQUFrQyxFQUFFLE9BQWUsRUFBRSxXQUFtQixFQUFFLEdBQXNCLEVBQUUsRUFBRTtJQUM3SSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFMUIsTUFBTSxJQUFBLG9CQUFZLEVBQUMsQ0FBTyxXQUFXLEVBQUUsV0FBVyxFQUFFLEVBQUU7UUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxPQUFPLElBQUksR0FBRyxFQUFFO1lBQ2xCLE9BQU8sR0FBRyxJQUFBLDhCQUFzQixFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDaEY7UUFFRCw2REFBNkQ7UUFDN0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN2QyxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQzNDLFNBQVM7YUFDVjtZQUVELE1BQU0sSUFBQSxnQkFBUSxFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBTSxHQUFHLEVBQUMsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLEtBQUssRUFBRTt3QkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLE9BQU8sa0JBQWtCLENBQUMsQ0FBQztxQkFDbkQ7aUJBQ0Y7Z0JBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7b0JBQ3RCLElBQUksT0FBTyxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7d0JBQ3RELFNBQVM7cUJBQ1Y7b0JBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO3dCQUNsQyxJQUFJLFdBQVcsSUFBSSxLQUFLLElBQUksV0FBVyxJQUFJLFdBQVcsSUFBSSxPQUFPLEVBQUU7NEJBQ2pFLFNBQVM7eUJBQ1Y7d0JBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksZUFBZSxPQUFPLEVBQUUsQ0FBQyxDQUFDO3dCQUM1RSxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUM3RDtpQkFDRjtZQUNILENBQUMsQ0FBQSxDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsQ0FBQSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUEsQ0FBQTtBQTFDWSxRQUFBLG9CQUFvQix3QkEwQ2hDO0FBRU0sTUFBTSxpQkFBaUIsR0FBRyxDQUFPLE9BQWUsRUFBRSxPQUFlLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQy9GLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsMkJBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hDLDREQUE0RDtRQUM1RCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDL0QseURBQXlEO1FBQ3pELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixxREFBcUQ7UUFDckQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUE7SUFDOUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLHFEQUFxRDtRQUNyRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLDZEQUE2RDtRQUM3RCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUEsQ0FBQTtBQWhDWSxRQUFBLGlCQUFpQixxQkFnQzdCO0FBRU0sTUFBTSxNQUFNLEdBQUcsQ0FBTyxHQUFRLEVBQWdCLEVBQUU7SUFDckQsT0FBTyxNQUFNLElBQUEsa0JBQVcsR0FBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUEsQ0FBQTtBQUZZLFFBQUEsTUFBTSxVQUVsQjtBQUVNLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFBLGVBQVEsR0FBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUE7QUFGWSxRQUFBLFdBQVcsZUFFdkI7QUFFTSxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7SUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFBLGVBQVEsR0FBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQTtBQUZZLFFBQUEsVUFBVSxjQUV0QjtBQUVNLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFBLGVBQVEsR0FBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUE7QUFGWSxRQUFBLGFBQWEsaUJBRXpCO0FBRU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFBLG9CQUFhLEdBQUUsQ0FBQztJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUE7QUFKWSxRQUFBLEdBQUcsT0FJZjtBQUVNLE1BQU0sSUFBSSxHQUFHLENBQU8sT0FBZSxFQUFpQixFQUFFO0lBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBQSxlQUFRLEdBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTs7UUFDckMsSUFBSTtZQUNGLE1BQU0sRUFBRSxHQUFHLElBQUEsb0JBQWtCLEVBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsZUFBUSxHQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEQsQ0FBQyxDQUFBO1lBQ0QsTUFBQSxFQUFFLENBQUMsTUFBTSwwQ0FBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE1BQUEsRUFBRSxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQixFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDcEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNkLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtvQkFDYixPQUFPLEVBQUUsQ0FBQztpQkFDWDtnQkFDRCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsOEJBQThCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDWDtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFBLENBQUE7QUF2QlksUUFBQSxJQUFJLFFBdUJoQiJ9