machines/products/poly-mech/product.js
2024-08-18 21:05:57 +02:00

211 lines
30 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.readProducts = exports.productHugoTask = exports.productContentOptions = exports.registerProductTasks = exports.compileProductTask = exports.populateProductDefaults = void 0;
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
const path = require("path");
const osr_cli_commons_1 = require("@plastichub/osr-cli-commons");
const fs_1 = require("@plastichub/osr-cli-commons/fs");
const exists_1 = require("@plastichub/fs/exists");
const read_1 = require("@plastichub/fs/read");
const write_1 = require("@plastichub/fs/write");
const debug_1 = require("@plastichub/core/debug");
const _cli_1 = require("@plastichub/osr-i18n/_cli");
const translate_1 = require("@plastichub/osr-i18n/lib/translate");
const media_1 = require("./media");
const log_1 = require("./log");
const config_1 = require("./config");
const logger = (0, debug_1.logger)('ph-site');
/////////////////////////////////////////////////////////////////////
//
// Product Multi Task products[product] -> content/retail/product
const populateProductDefaults = async (grunt, product_root, srcLang, dstLanguage) => {
const _createFile = (file) => {
file = path.resolve(path.join(product_root, file));
if (!(0, exists_1.sync)(file)) {
(0, write_1.sync)(file, '');
}
};
_createFile('templates/shared/product_features.md');
};
exports.populateProductDefaults = populateProductDefaults;
const compileProductTask = async (grunt, product, lang, dstLanguage, target, options = {}) => {
const config = {};
product = '' + product;
const logLevel = grunt.option('logLevel') || 'warn';
const product_rel = product.replace('products/', '');
const root = (0, fs_1.resolve)((0, config_1.PRODUCT_ROOT)());
const slug = path.parse(product).base;
const debug = grunt.option('debug');
const productConfig = (0, read_1.sync)((0, config_1.PRODUCT_CONFIG)(product), "json");
if (!productConfig) {
logger.error('Product config not found !' + product);
return;
}
productConfig.description = productConfig.description || '';
const translateProductAssets = async () => {
logger.info('Translate Product Assets ' + slug + ' ' + dstLanguage + ' ' + product_rel);
const config = (0, osr_cli_commons_1.CONFIG_DEFAULT)();
if (dstLanguage === config_1.I18N_SOURCE_LANGUAGE) {
return;
}
logger.setSettings({ minLevel: config_1.RETAIL_LOG_LEVEL_I18N_PRODUCT_ASSETS });
const i18nOptions = {
srcLang: config_1.I18N_SOURCE_LANGUAGE,
dstLang: dstLanguage,
src: `${(0, config_1.PRODUCT_DIR)(product)}/specs.xlsx`,
store: (0, config_1.I18N_STORE)((0, config_1.OSR_ROOT)(), dstLanguage),
dst: "${SRC_DIR}/${SRC_NAME}-${DST_LANG}${SRC_EXT}",
query: "$[*][0,1]",
cache: true,
api_key: config.deepl.auth_key,
logLevel: config_1.RETAIL_LOG_LEVEL_I18N_PRODUCT_ASSETS
};
return await (0, translate_1.translate)((0, _cli_1.sanitize)(i18nOptions));
};
const onCompiled = async (src, dst, options, content) => {
if (config_1.TranslateProductAssets || grunt.option('translateProductAssets')) {
await translateProductAssets();
}
if (config_1.ConvertProductMedia || grunt.option('convertProductMedia')) {
await (0, media_1.compileProductAssets)(grunt, (0, config_1.PRODUCT_DIR)(product), lang, dstLanguage);
}
if (config_1.PopulateProductDefaults) {
await (0, exports.populateProductDefaults)(grunt, (0, config_1.PRODUCT_DIR)(product), lang, dstLanguage);
}
// logger.warn('On Compiled Product ' + product + ' ' + dstLanguage)
};
let defaultOptions = {
src: [path.resolve(path.join(root, config_1.PRODUCT_HUGO_TEMPLATE))],
options: {
cache: config_1.RETAIL_COMPILE_CACHE,
debug,
env: config_1.OSRL_ENVIRONMENT,
format: 'html',
language: config_1.OSRL_LANG_FLAVOR,
module: config_1.OSRL_MODULE_NAME,
output: `${target}/${product_rel}/_index.md`,
profile: config_1.OSRL_PRODUCT_PROFILE,
root,
cwd: root,
watchContent: false,
logLevel,
store: (0, config_1.I18N_STORE)((0, config_1.OSR_ROOT)(), dstLanguage),
sourceLanguage: config_1.I18N_SOURCE_LANGUAGE,
targetLanguage: dstLanguage,
variables: {
root,
product,
product_rel,
product_relative: '' + product_rel,
sourceLanguage: config_1.I18N_SOURCE_LANGUAGE,
targetLanguage: dstLanguage,
language: dstLanguage,
i18n: (0, config_1.I18N_STORE)((0, config_1.OSR_ROOT)(), dstLanguage),
...productConfig,
fm: {
keywords: (productConfig.keywords || "").split(',').map((k) => k.trim())
}
},
...options,
onCompileDone: onCompiled,
onCompile: async (options) => {
const gallery = await (0, media_1.productGallery)(grunt, 'media/gallery', product, lang, dstLanguage);
const galleryRenderings = await (0, media_1.productGallery)(grunt, 'renderings', product, lang, dstLanguage);
options.variables.fm.rGallery = gallery;
options.variables.fm.rGalleryRenderings = galleryRenderings;
return options;
}
}
};
debug && logger.debug('Create product compile options for ' + product, defaultOptions.options);
config[`content-${dstLanguage}-${slug}`] = {
...defaultOptions,
};
grunt.extendConfig({ compile: config });
grunt.registerTask(`content-${dstLanguage}-${slug}`, `compile:content-${dstLanguage}-${slug}`);
};
exports.compileProductTask = compileProductTask;
const registerProductTasks = (grunt) => {
const logLevel = grunt.option('logLevel') || 'warn';
logger.setSettings({ minLevel: logLevel });
const product_compile_tasks = [];
const productTasks = (items) => {
items.forEach((product) => {
const slug = path.parse(product).base;
(0, exports.compileProductTask)(grunt, product, config_1.I18N_SOURCE_LANGUAGE, config_1.I18N_SOURCE_LANGUAGE, "./content/en/retail");
product_compile_tasks.push(`compile:content-en-${slug}`);
config_1.LANGUAGES.forEach((lang) => {
product_compile_tasks.push(`compile:content-${lang}-${slug}`);
(0, exports.compileProductTask)(grunt, product, config_1.I18N_SOURCE_LANGUAGE, lang, `./content/${lang}/retail`);
});
});
};
productTasks((0, exports.readProducts)(grunt.option('branch') || 'test'));
grunt.registerTask(`content-all`, product_compile_tasks);
};
exports.registerProductTasks = registerProductTasks;
/////////////////////////////////////////////////////////////////////
//
// Product Single Test Task products[product] -> src/retail/product
const productContentOptions = (target, product) => {
product = '' + product;
const product_rel = product.replace('products/', '');
const root = (0, fs_1.resolve)((0, config_1.PRODUCT_ROOT)());
const productConfig = (0, read_1.sync)((0, config_1.PRODUCT_CONFIG)(product), "json");
if (!productConfig) {
logger.error('Product config not found !' + product);
}
return {
debug: false,
watch: false,
root,
cwd: root,
env: config_1.OSRL_ENV,
profile: '${root}/.osrl.json',
output: `${target}/${product_rel}/_index.md`,
// format: 'html',
module: config_1.OSRL_MODULE_NAME,
cache: true,
variables: {
product,
product_rel,
root,
product_relative: '' + product_rel,
...productConfig
}
};
};
exports.productContentOptions = productContentOptions;
const productHugoTask = (grunt, product, options = {}, product_item_tasks) => {
if (!product) {
logger.error('Invalid product');
}
const config = {};
const slug = path.parse(product).base;
const target = path.resolve(config_1.PRODUCTS_TARGET_SRC);
const productOptions = (0, exports.productContentOptions)(target, product);
config[`product-${slug}`] = {
src: [config_1.PRODUCT_HUGO_TEMPLATE],
options: productOptions
};
grunt.extendConfig({
compile: config
});
grunt.registerTask(`product-${slug}`, `compile:product-${slug}`);
product_item_tasks.push(`compile:product-${slug}`);
grunt.registerTask(`products-hugo`, product_item_tasks);
(0, log_1.writeTaskConfig)(`compile_product-${slug}`, config);
};
exports.productHugoTask = productHugoTask;
const readProducts = (branch = 'test') => {
const conf = (0, read_1.sync)(config_1.ENABLED_PRODUCTS, "json") || {};
if (branch) {
conf['all'] = [...conf["sheetpress"], ...conf["injectors"], ...conf["extruders"], ...conf["shredders"]];
return conf[branch] || [];
}
else {
return Object.values(conf).flat();
}
};
exports.readProducts = readProducts;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhc2tzL3Byb2R1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtBQUNqRCw2QkFBNEI7QUFDNUIsaUVBQTREO0FBQzVELHVEQUF3RDtBQUV4RCxrREFBc0Q7QUFDdEQsOENBQWtEO0FBQ2xELGdEQUFvRDtBQUVwRCxrREFBMEQ7QUFFMUQsb0RBQW9EO0FBRXBELGtFQUE4RDtBQUU5RCxtQ0FBOEQ7QUFDOUQsK0JBQXVDO0FBRXZDLHFDQVdpQjtBQUdqQixNQUFNLE1BQU0sR0FBRyxJQUFBLGNBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQTtBQUVqQyxxRUFBcUU7QUFDckUsRUFBRTtBQUNGLGtFQUFrRTtBQUMzRCxNQUFNLHVCQUF1QixHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUN6RixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbEQsSUFBSSxDQUFDLElBQUEsYUFBTSxFQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pCLElBQUEsWUFBSyxFQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtTQUNoQjtJQUNILENBQUMsQ0FBQTtJQUNELFdBQVcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO0FBQ3JELENBQUMsQ0FBQTtBQVJZLFFBQUEsdUJBQXVCLDJCQVFuQztBQUNNLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsVUFBZSxFQUFFLEVBQUUsRUFBRTtJQUN2RyxN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QU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtLQUMxQjtTQUFNO1FBQ0wsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0tBQ2xDO0FBQ0gsQ0FBQyxDQUFBO0FBUlksUUFBQSxZQUFZLGdCQVF4QiIsInNvdXJjZXNDb250ZW50IjpbInByb2Nlc3MuZW52WydOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEJ10gPSAnMCdcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IENPTkZJR19ERUZBVUxUIH0gZnJvbSAnQHBsYXN0aWNodWIvb3NyLWNsaS1jb21tb25zJ1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ0BwbGFzdGljaHViL29zci1jbGktY29tbW9ucy9mcydcblxuaW1wb3J0IHsgc3luYyBhcyBleGlzdHMgfSBmcm9tICdAcGxhc3RpY2h1Yi9mcy9leGlzdHMnXG5pbXBvcnQgeyBzeW5jIGFzIHJlYWQgfSBmcm9tICdAcGxhc3RpY2h1Yi9mcy9yZWFkJ1xuaW1wb3J0IHsgc3luYyBhcyB3cml0ZSB9IGZyb20gJ0BwbGFzdGljaHViL2ZzL3dyaXRlJ1xuXG5pbXBvcnQgeyBsb2dnZXIgYXMgX2xvZ2dlciB9IGZyb20gJ0BwbGFzdGljaHViL2NvcmUvZGVidWcnXG5cbmltcG9ydCB7IHNhbml0aXplIH0gZnJvbSAnQHBsYXN0aWNodWIvb3NyLWkxOG4vX2NsaSdcbmltcG9ydCB7IElPcHRpb25zIGFzIElPcHRpb25zSTE4biB9IGZyb20gJ0BwbGFzdGljaHViL29zci1pMThuL3R5cGVzJ1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnQHBsYXN0aWNodWIvb3NyLWkxOG4vbGliL3RyYW5zbGF0ZSdcblxuaW1wb3J0IHsgY29tcGlsZVByb2R1Y3RBc3NldHMsIHByb2R1Y3RHYWxsZXJ5IH0gZnJvbSAnLi9tZWRpYSdcbmltcG9ydCB7IHdyaXRlVGFza0NvbmZpZyB9IGZyb20gJy4vbG9nJ1xuXG5pbXBvcnQge1xuICBFTkFCTEVEX1BST0RVQ1RTLCBJMThOX1NPVVJDRV9MQU5HVUFHRSwgSTE4Tl9TVE9SRSxcbiAgTEFOR1VBR0VTLFxuICBPU1JMX0VOViwgT1NSTF9MQU5HX0ZMQVZPUixcbiAgT1NSTF9NT0RVTEVfTkFNRSwgT1NSX1JPT1QsIFBST0RVQ1RTX1RBUkdFVF9TUkMsIFBST0RVQ1RfQ09ORklHLCBQUk9EVUNUX0hVR09fVEVNUExBVEUsIE9TUkxfUFJPRFVDVF9QUk9GSUxFLCBQUk9EVUNUX1JPT1QsIFBST0RVQ1RfRElSLFxuICBPU1JMX0VOVklST05NRU5ULFxuICBSRVRBSUxfTE9HX0xFVkVMX0kxOE5fUFJPRFVDVF9BU1NFVFMsXG4gIFRyYW5zbGF0ZVByb2R1Y3RBc3NldHMsXG4gIENvbnZlcnRQcm9kdWN0TWVkaWEsXG4gIFBvcHVsYXRlUHJvZHVjdERlZmF1bHRzLFxuICBSRVRBSUxfQ09NUElMRV9DQUNIRVxufSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IElDb21waWxlVGFza09wdGlvbnMgfSBmcm9tICdAcGxhc3RpY2h1Yi9vc3ItdGFza3MvdGFza3MvY29tcGlsZSdcblxuY29uc3QgbG9nZ2VyID0gX2xvZ2dlcigncGgtc2l0ZScpXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vICBQcm9kdWN0IE11bHRpIFRhc2sgcHJvZHVjdHNbcHJvZHVjdF0gLT4gY29udGVudC9yZXRhaWwvcHJvZHVjdFxuZXhwb3J0IGNvbnN0IHBvcHVsYXRlUHJvZHVjdERlZmF1bHRzID0gYXN5bmMgKGdydW50LCBwcm9kdWN0X3Jvb3QsIHNyY0xhbmcsIGRzdExhbmd1YWdlKSA9PiB7XG4gIGNvbnN0IF9jcmVhdGVGaWxlID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgIGZpbGUgPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKHByb2R1Y3Rfcm9vdCwgZmlsZSkpXG4gICAgaWYgKCFleGlzdHMoZmlsZSkpIHtcbiAgICAgIHdyaXRlKGZpbGUsICcnKVxuICAgIH1cbiAgfVxuICBfY3JlYXRlRmlsZSgndGVtcGxhdGVzL3NoYXJlZC9wcm9kdWN0X2ZlYXR1cmVzLm1kJylcbn1cbmV4cG9ydCBjb25zdCBjb21waWxlUHJvZHVjdFRhc2sgPSBhc3luYyAoZ3J1bnQsIHByb2R1Y3QsIGxhbmcsIGRzdExhbmd1YWdlLCB0YXJnZXQsIG9wdGlvbnM6IGFueSA9IHt9KSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IHt9XG4gIHByb2R1Y3QgPSAnJyArIHByb2R1Y3RcbiAgY29uc3QgbG9nTGV2ZWwgPSBncnVudC5vcHRpb24oJ2xvZ0xldmVsJykgfHwgJ3dhcm4nXG4gIGNvbnN0IHByb2R1Y3RfcmVsID0gcHJvZHVjdC5yZXBsYWNlKCdwcm9kdWN0cy8nLCAnJylcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmUoUFJPRFVDVF9ST09UKCkpXG4gIGNvbnN0IHNsdWcgPSBwYXRoLnBhcnNlKHByb2R1Y3QpLmJhc2VcbiAgY29uc3QgZGVidWcgPSBncnVudC5vcHRpb24oJ2RlYnVnJylcbiAgY29uc3QgcHJvZHVjdENvbmZpZzogYW55ID0gcmVhZChQUk9EVUNUX0NPTkZJRyhwcm9kdWN0KSwgXCJqc29uXCIpXG4gIGlmICghcHJvZHVjdENvbmZpZykge1xuICAgIGxvZ2dlci5lcnJvcignUHJvZHVjdCBjb25maWcgbm90IGZvdW5kICEnICsgcHJvZHVjdClcbiAgICByZXR1cm5cbiAgfVxuICBwcm9kdWN0Q29uZmlnLmRlc2NyaXB0aW9uID0gcHJvZHVjdENvbmZpZy5kZXNjcmlwdGlvbiB8fCAnJ1xuICBjb25zdCB0cmFuc2xhdGVQcm9kdWN0QXNzZXRzID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKCdUcmFuc2xhdGUgUHJvZHVjdCBBc3NldHMgJyArIHNsdWcgKyAnICcgKyBkc3RMYW5ndWFnZSArICcgJyArIHByb2R1Y3RfcmVsKVxuICAgIGNvbnN0IGNvbmZpZzogYW55ID0gQ09ORklHX0RFRkFVTFQoKVxuICAgIGlmIChkc3RMYW5ndWFnZSA9PT0gSTE4Tl9TT1VSQ0VfTEFOR1VBR0UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsb2dnZXIuc2V0U2V0dGluZ3MoeyBtaW5MZXZlbDogUkVUQUlMX0xPR19MRVZFTF9JMThOX1BST0RVQ1RfQVNTRVRTIH0pXG4gICAgY29uc3QgaTE4bk9wdGlvbnM6IElPcHRpb25zSTE4biA9IHtcbiAgICAgIHNyY0xhbmc6IEkxOE5fU09VUkNFX0xBTkdVQUdFLFxuICAgICAgZHN0TGFuZzogZHN0TGFuZ3VhZ2UsXG4gICAgICBzcmM6IGAke1BST0RVQ1RfRElSKHByb2R1Y3QpfS9zcGVjcy54bHN4YCxcbiAgICAgIHN0b3JlOiBJMThOX1NUT1JFKE9TUl9ST09UKCksIGRzdExhbmd1YWdlKSxcbiAgICAgIGRzdDogXCIke1NSQ19ESVJ9LyR7U1JDX05BTUV9LSR7RFNUX0xBTkd9JHtTUkNfRVhUfVwiLFxuICAgICAgcXVlcnk6IFwiJFsqXVswLDFdXCIsXG4gICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgIGFwaV9rZXk6IGNvbmZpZy5kZWVwbC5hdXRoX2tleSxcbiAgICAgIGxvZ0xldmVsOiBSRVRBSUxfTE9HX0xFVkVMX0kxOE5fUFJPRFVDVF9BU1NFVFNcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRyYW5zbGF0ZShzYW5pdGl6ZShpMThuT3B0aW9ucykgYXMgYW55KVxuICB9XG5cbiAgY29uc3Qgb25Db21waWxlZCA9IGFzeW5jIChzcmMsIGRzdCwgb3B0aW9ucywgY29udGVudCkgPT4ge1xuICAgIGlmIChUcmFuc2xhdGVQcm9kdWN0QXNzZXRzIHx8IGdydW50Lm9wdGlvbigndHJhbnNsYXRlUHJvZHVjdEFzc2V0cycpKSB7XG4gICAgICBhd2FpdCB0cmFuc2xhdGVQcm9kdWN0QXNzZXRzKClcbiAgICB9XG4gICAgaWYgKENvbnZlcnRQcm9kdWN0TWVkaWEgfHwgZ3J1bnQub3B0aW9uKCdjb252ZXJ0UHJvZHVjdE1lZGlhJykpIHtcbiAgICAgIGF3YWl0IGNvbXBpbGVQcm9kdWN0QXNzZXRzKGdydW50LCBQUk9EVUNUX0RJUihwcm9kdWN0KSwgbGFuZywgZHN0TGFuZ3VhZ2UpXG4gICAgfVxuICAgIGlmIChQb3B1bGF0ZVByb2R1Y3REZWZhdWx0cykge1xuICAgICAgYXdhaXQgcG9wdWxhdGVQcm9kdWN0RGVmYXVsdHMoZ3J1bnQsIFBST0RVQ1RfRElSKHByb2R1Y3QpLCBsYW5nLCBkc3RMYW5ndWFnZSlcbiAgICB9XG4gICAgLy8gbG9nZ2VyLndhcm4oJ09uIENvbXBpbGVkIFByb2R1Y3QgJyArIHByb2R1Y3QgKyAnICcgKyBkc3RMYW5ndWFnZSlcbiAgfVxuXG4gIGxldCBkZWZhdWx0T3B0aW9uczogYW55ID0ge1xuICAgIHNyYzogW3BhdGgucmVzb2x2ZShwYXRoLmpvaW4ocm9vdCwgUFJPRFVDVF9IVUdPX1RFTVBMQVRFKSldLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNhY2hlOiBSRVRBSUxfQ09NUElMRV9DQUNIRSxcbiAgICAgIGRlYnVnLFxuICAgICAgZW52OiBPU1JMX0VOVklST05NRU5ULFxuICAgICAgZm9ybWF0OiAnaHRtbCcsXG4gICAgICBsYW5ndWFnZTogT1NSTF9MQU5HX0ZMQVZPUixcbiAgICAgIG1vZHVsZTogT1NSTF9NT0RVTEVfTkFNRSxcbiAgICAgIG91dHB1dDogYCR7dGFyZ2V0fS8ke3Byb2R1Y3RfcmVsfS9faW5kZXgubWRgLFxuICAgICAgcHJvZmlsZTogT1NSTF9QUk9EVUNUX1BST0ZJTEUsXG4gICAgICByb290LFxuICAgICAgY3dkOiByb290LFxuICAgICAgd2F0Y2hDb250ZW50OiBmYWxzZSxcbiAgICAgIGxvZ0xldmVsLFxuICAgICAgc3RvcmU6IEkxOE5fU1RPUkUoT1NSX1JPT1QoKSwgZHN0TGFuZ3VhZ2UpLFxuICAgICAgc291cmNlTGFuZ3VhZ2U6IEkxOE5fU09VUkNFX0xBTkdVQUdFLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IGRzdExhbmd1YWdlLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIHByb2R1Y3QsXG4gICAgICAgIHByb2R1Y3RfcmVsLFxuICAgICAgICBwcm9kdWN0X3JlbGF0aXZlOiAnJyArIHByb2R1Y3RfcmVsLFxuICAgICAgICBzb3VyY2VMYW5ndWFnZTogSTE4Tl9TT1VSQ0VfTEFOR1VBR0UsXG4gICAgICAgIHRhcmdldExhbmd1YWdlOiBkc3RMYW5ndWFnZSxcbiAgICAgICAgbGFuZ3VhZ2U6IGRzdExhbmd1YWdlLFxuICAgICAgICBpMThuOiBJMThOX1NUT1JFKE9TUl9ST09UKCksIGRzdExhbmd1YWdlKSxcbiAgICAgICAgLi4ucHJvZHVjdENvbmZpZyxcbiAgICAgICAgZm06IHtcbiAgICAgICAgICBrZXl3b3JkczogKHByb2R1Y3RDb25maWcua2V5d29yZHMgfHwgXCJcIikuc3BsaXQoJywnKS5tYXAoKGspID0+IGsudHJpbSgpKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uQ29tcGlsZURvbmU6IG9uQ29tcGlsZWQsXG4gICAgICBvbkNvbXBpbGU6IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGdhbGxlcnkgPSBhd2FpdCBwcm9kdWN0R2FsbGVyeShncnVudCwgJ21lZGlhL2dhbGxlcnknLCBwcm9kdWN0LCBsYW5nLCBkc3RMYW5ndWFnZSlcbiAgICAgICAgY29uc3QgZ2FsbGVyeVJlbmRlcmluZ3MgPSBhd2FpdCBwcm9kdWN0R2FsbGVyeShncnVudCwgJ3JlbmRlcmluZ3MnLCBwcm9kdWN0LCBsYW5nLCBkc3RMYW5ndWFnZSlcbiAgICAgICAgb3B0aW9ucy52YXJpYWJsZXMuZm0uckdhbGxlcnkgPSBnYWxsZXJ5XG4gICAgICAgIG9wdGlvbnMudmFyaWFibGVzLmZtLnJHYWxsZXJ5UmVuZGVyaW5ncyA9IGdhbGxlcnlSZW5kZXJpbmdzXG4gICAgICAgIHJldHVybiBvcHRpb25zXG4gICAgICB9XG4gICAgfSBhcyBJQ29tcGlsZVRhc2tPcHRpb25zXG4gIH1cbiAgZGVidWcgJiYgbG9nZ2VyLmRlYnVnKCdDcmVhdGUgcHJvZHVjdCBjb21waWxlIG9wdGlvbnMgZm9yICcgKyBwcm9kdWN0LCBkZWZhdWx0T3B0aW9ucy5vcHRpb25zKVxuICBjb25maWdbYGNvbnRlbnQtJHtkc3RMYW5ndWFnZX0tJHtzbHVnfWBdID0ge1xuICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICB9XG4gIGdydW50LmV4dGVuZENvbmZpZyh7IGNvbXBpbGU6IGNvbmZpZyB9KVxuICBncnVudC5yZWdpc3RlclRhc2soYGNvbnRlbnQtJHtkc3RMYW5ndWFnZX0tJHtzbHVnfWAsIGBjb21waWxlOmNvbnRlbnQtJHtkc3RMYW5ndWFnZX0tJHtzbHVnfWApXG59XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJQcm9kdWN0VGFza3MgPSAoZ3J1bnQpID0+IHtcbiAgY29uc3QgbG9nTGV2ZWwgPSBncnVudC5vcHRpb24oJ2xvZ0xldmVsJykgfHwgJ3dhcm4nXG4gIGxvZ2dlci5zZXRTZXR0aW5ncyh7IG1pbkxldmVsOiBsb2dMZXZlbCB9KVxuICBjb25zdCBwcm9kdWN0X2NvbXBpbGVfdGFza3MgPSBbXVxuICBjb25zdCBwcm9kdWN0VGFza3MgPSAoaXRlbXMpID0+IHtcbiAgICBpdGVtcy5mb3JFYWNoKChwcm9kdWN0KSA9PiB7XG4gICAgICBjb25zdCBzbHVnID0gcGF0aC5wYXJzZShwcm9kdWN0KS5iYXNlXG4gICAgICBjb21waWxlUHJvZHVjdFRhc2soZ3J1bnQsIHByb2R1Y3QsIEkxOE5fU09VUkNFX0xBTkdVQUdFLCBJMThOX1NPVVJDRV9MQU5HVUFHRSwgXCIuL2NvbnRlbnQvZW4vcmV0YWlsXCIpXG4gICAgICBwcm9kdWN0X2NvbXBpbGVfdGFza3MucHVzaChgY29tcGlsZTpjb250ZW50LWVuLSR7c2x1Z31gKVxuICAgICAgTEFOR1VBR0VTLmZvckVhY2goKGxhbmcpID0+IHtcbiAgICAgICAgcHJvZHVjdF9jb21waWxlX3Rhc2tzLnB1c2goYGNvbXBpbGU6Y29udGVudC0ke2xhbmd9LSR7c2x1Z31gKVxuICAgICAgICBjb21waWxlUHJvZHVjdFRhc2soZ3J1bnQsIHByb2R1Y3QsIEkxOE5fU09VUkNFX0xBTkdVQUdFLCBsYW5nLCBgLi9jb250ZW50LyR7bGFuZ30vcmV0YWlsYClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuICBwcm9kdWN0VGFza3MocmVhZFByb2R1Y3RzKGdydW50Lm9wdGlvbignYnJhbmNoJykgfHwgJ3Rlc3QnKSlcbiAgZ3J1bnQucmVnaXN0ZXJUYXNrKGBjb250ZW50LWFsbGAsIHByb2R1Y3RfY29tcGlsZV90YXNrcylcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIFByb2R1Y3QgU2luZ2xlIFRlc3QgVGFzayBwcm9kdWN0c1twcm9kdWN0XSAtPiBzcmMvcmV0YWlsL3Byb2R1Y3RcbmV4cG9ydCBjb25zdCBwcm9kdWN0Q29udGVudE9wdGlvbnMgPSAodGFyZ2V0LCBwcm9kdWN0KSA9PiB7XG4gIHByb2R1Y3QgPSAnJyArIHByb2R1Y3RcbiAgY29uc3QgcHJvZHVjdF9yZWwgPSBwcm9kdWN0LnJlcGxhY2UoJ3Byb2R1Y3RzLycsICcnKVxuICBjb25zdCByb290ID0gcmVzb2x2ZShQUk9EVUNUX1JPT1QoKSlcbiAgY29uc3QgcHJvZHVjdENvbmZpZzogYW55ID0gcmVhZChQUk9EVUNUX0NPTkZJRyhwcm9kdWN0KSwgXCJqc29uXCIpXG4gIGlmICghcHJvZHVjdENvbmZpZykge1xuICAgIGxvZ2dlci5lcnJvcignUHJvZHVjdCBjb25maWcgbm90IGZvdW5kICEnICsgcHJvZHVjdClcbiAgfVxuICByZXR1cm4ge1xuICAgIGRlYnVnOiBmYWxzZSxcbiAgICB3YXRjaDogZmFsc2UsXG4gICAgcm9vdCxcbiAgICBjd2Q6IHJvb3QsXG4gICAgZW52OiBPU1JMX0VOVixcbiAgICBwcm9maWxlOiAnJHtyb290fS8ub3NybC5qc29uJyxcbiAgICBvdXRwdXQ6IGAke3RhcmdldH0vJHtwcm9kdWN0X3JlbH0vX2luZGV4Lm1kYCxcbiAgICAvLyBmb3JtYXQ6ICdodG1sJyxcbiAgICBtb2R1bGU6IE9TUkxfTU9EVUxFX05BTUUsXG4gICAgY2FjaGU6IHRydWUsXG4gICAgdmFyaWFibGVzOiB7XG4gICAgICBwcm9kdWN0LFxuICAgICAgcHJvZHVjdF9yZWwsXG4gICAgICByb290LFxuICAgICAgcHJvZHVjdF9yZWxhdGl2ZTogJycgKyBwcm9kdWN0X3JlbCxcbiAgICAgIC4uLnByb2R1Y3RDb25maWdcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBwcm9kdWN0SHVnb1Rhc2sgPSAoZ3J1bnQsIHByb2R1Y3QsIG9wdGlvbnM6IGFueSA9IHt9LCBwcm9kdWN0X2l0ZW1fdGFza3MpID0+IHtcbiAgaWYgKCFwcm9kdWN0KSB7XG4gICAgbG9nZ2VyLmVycm9yKCdJbnZhbGlkIHByb2R1Y3QnKVxuICB9XG4gIGNvbnN0IGNvbmZpZyA9IHt9XG4gIGNvbnN0IHNsdWcgPSBwYXRoLnBhcnNlKHByb2R1Y3QpLmJhc2VcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aC5yZXNvbHZlKFBST0RVQ1RTX1RBUkdFVF9TUkMpXG4gIGNvbnN0IHByb2R1Y3RPcHRpb25zID0gcHJvZHVjdENvbnRlbnRPcHRpb25zKHRhcmdldCwgcHJvZHVjdClcbiAgY29uZmlnW2Bwcm9kdWN0LSR7c2x1Z31gXSA9IHtcbiAgICBzcmM6IFtQUk9EVUNUX0hVR09fVEVNUExBVEVdLFxuICAgIG9wdGlvbnM6IHByb2R1Y3RPcHRpb25zXG4gIH1cbiAgZ3J1bnQuZXh0ZW5kQ29uZmlnKHtcbiAgICBjb21waWxlOiBjb25maWdcbiAgfSlcbiAgZ3J1bnQucmVnaXN0ZXJUYXNrKGBwcm9kdWN0LSR7c2x1Z31gLCBgY29tcGlsZTpwcm9kdWN0LSR7c2x1Z31gKVxuICBwcm9kdWN0X2l0ZW1fdGFza3MucHVzaChgY29tcGlsZTpwcm9kdWN0LSR7c2x1Z31gKVxuICBncnVudC5yZWdpc3RlclRhc2soYHByb2R1Y3RzLWh1Z29gLCBwcm9kdWN0X2l0ZW1fdGFza3MpXG4gIHdyaXRlVGFza0NvbmZpZyhgY29tcGlsZV9wcm9kdWN0LSR7c2x1Z31gLCBjb25maWcpXG59XG5leHBvcnQgY29uc3QgcmVhZFByb2R1Y3RzID0gKGJyYW5jaDogc3RyaW5nID0gJ3Rlc3QnKSA9PiB7XG4gIGNvbnN0IGNvbmYgPSByZWFkKEVOQUJMRURfUFJPRFVDVFMsIFwianNvblwiKSB8fCB7fVxuICBpZiAoYnJhbmNoKSB7XG4gICAgY29uZlsnYWxsJ10gPSBbLi4uY29uZltcInNoZWV0cHJlc3NcIl0sIC4uLmNvbmZbXCJpbmplY3RvcnNcIl0sIC4uLmNvbmZbXCJleHRydWRlcnNcIl0sIC4uLmNvbmZbXCJzaHJlZGRlcnNcIl1dXG4gICAgcmV0dXJuIGNvbmZbYnJhbmNoXSB8fCBbXVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvbmYpLmZsYXQoKVxuICB9XG59XG4iXX0=