@anansi/webpack-config
Version:
Production ready webpack for React
179 lines (177 loc) • 20.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = makeProdConfig;
var _preloadWebpackPlugin = _interopRequireDefault(require("@vue/preload-webpack-plugin"));
var _cleanWebpackPlugin = require("clean-webpack-plugin");
var _cssMinimizerWebpackPlugin = _interopRequireDefault(require("css-minimizer-webpack-plugin"));
var _htmlWebpackPlugin = _interopRequireDefault(require("html-webpack-plugin"));
var _terserWebpackPlugin = _interopRequireDefault(require("terser-webpack-plugin"));
var _webpack = _interopRequireDefault(require("webpack"));
var _webpackRemoveEmptyScripts = _interopRequireDefault(require("webpack-remove-empty-scripts"));
var _base = require("./base");
//import CrittersPlugin from 'critters-webpack-plugin';
function makeProdConfig(baseConfig, {
rootPath,
basePath,
libraryInclude,
libraryExclude,
argv = {},
env = {},
htmlOptions = {
title: '',
scriptLoading: 'defer'
},
terserOptions,
sassOptions,
sassResources,
cssModulesOptions,
globalStyleDir,
fontPreload,
svgoOptions,
nohash,
cssExtractOptions
}) {
const config = {
...baseConfig
};
config.mode = 'production';
config.bail = true; // this helps automatic build tools not waste time
if (!argv?.target?.includes?.('node')) {
config.plugins.push(new _webpack.default.IgnorePlugin({
resourceRegExp: /DevTools/
}), new _cleanWebpackPlugin.CleanWebpackPlugin(), new _webpack.default.LoaderOptionsPlugin({
minimize: true,
debug: false
}), new _webpackRemoveEmptyScripts.default());
if (htmlOptions) {
config.plugins.unshift(new _htmlWebpackPlugin.default(htmlOptions)
//new CrittersPlugin({}),
//new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime-.+[.]js/]), this is a bad idea until CSP nonce can be added
);
if (fontPreload) {
if (!['preload', 'prefetch'].includes(fontPreload)) throw new Error(`fontPreload: '${fontPreload}' is not valid.\nUse 'preload' or 'prefetch'`);
config.plugins.unshift(new _preloadWebpackPlugin.default({
rel: fontPreload,
include: 'allAssets',
fileWhitelist: [/\.(otf|woff|ttf)/],
as
}));
}
}
}
if (svgoOptions !== false) {
config.module.rules.push({
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
issuer: {
not: [/\.(j|t)sx?$/]
},
enforce: 'pre',
use: [{
loader: require.resolve('svgo-loader'),
options: svgoOptions
}]
});
}
config.optimization = {
splitChunks: {
chunks: 'async',
maxInitialRequests: 30,
maxAsyncRequests: 30,
cacheGroups: {
react: {
test: /[\\/]node_modules[\\/](react|react-dom|scheduler|object-assign|loose-envify)[\\/]/,
name: 'react',
chunks: 'all'
},
polyfill: {
test: /[\\/]node_modules[\\/](core-js|core-js-pure|@babel\/runtime|@babel\/runtime-corejs3|regenerator-runtime|ric-shim|babel-runtime)[\\/].*/,
name: 'polyfill',
chunks: 'all'
},
styles: {
test: new RegExp(`${globalStyleDir}/.*\\.scss$`),
name: 'style',
type: 'css/mini-extract',
chunks: 'all'
}
}
},
// https://webpack.js.org/configuration/optimization/#optimizationruntimechunk
runtimeChunk: {
name: 'webpack-runtime'
}
};
if (nohash) {
config.optimization.chunkIds = 'named';
}
if (!env?.readable) {
config.optimization.minimizer = [new _terserWebpackPlugin.default({
terserOptions: {
parse: {
ecma: 9
},
compress: {
ecma: 6,
warnings: false,
// Pending further investigation:
// https://github.com/mishoo/UglifyJS2/issues/2011
comparisons: false,
// Pending futher investigation:
// https://github.com/terser-js/terser/issues/120
inline: 2
},
mangle: {
safari10: true
},
output: {
ecma: 6,
comments: false,
ascii_only: true
},
...terserOptions,
keep_classnames: !!env?.profile || (terserOptions?.keep_classnames ?? true),
keep_fnames: !!env?.profile || terserOptions?.keep_fnames
},
extractComments: true
}),
// cssnano on node_modules as well as our loaders
new _cssMinimizerWebpackPlugin.default()];
} else {
config.optimization.minimize = false;
}
config.performance = {
maxEntrypointSize: 300000,
assetFilter(assetFilename) {
return !/\.(map|LICENSE)$/.test(assetFilename);
}
};
const styleRules = (0, _base.getStyleRules)({
rootPath,
basePath,
libraryInclude,
libraryExclude,
sassOptions,
sassResources,
cssModulesOptions,
globalStyleDir,
target: argv?.target,
cssExtractOptions
});
config.module.rules = [...config.module.rules, styleRules];
if (env?.profile) {
config.resolve.alias = {
...config?.resolve?.alias,
'react-dom$': 'react-dom/profiling',
'scheduler/tracing': 'scheduler/tracing-profiling'
};
}
return config;
}
function as(entry) {
if (/\.css$/.test(entry)) return 'style';
if (/\.(otf|eot|woff2|woff|ttf)$/.test(entry)) return 'font';
if (/\.(svg|apng|png|jpg|gif|ico|webp|avif|cur|ani)$/.test(entry)) return 'image';
return 'script';
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHJlbG9hZFdlYnBhY2tQbHVnaW4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGVhbldlYnBhY2tQbHVnaW4iLCJfY3NzTWluaW1pemVyV2VicGFja1BsdWdpbiIsIl9odG1sV2VicGFja1BsdWdpbiIsIl90ZXJzZXJXZWJwYWNrUGx1Z2luIiwiX3dlYnBhY2siLCJfd2VicGFja1JlbW92ZUVtcHR5U2NyaXB0cyIsIl9iYXNlIiwibWFrZVByb2RDb25maWciLCJiYXNlQ29uZmlnIiwicm9vdFBhdGgiLCJiYXNlUGF0aCIsImxpYnJhcnlJbmNsdWRlIiwibGlicmFyeUV4Y2x1ZGUiLCJhcmd2IiwiZW52IiwiaHRtbE9wdGlvbnMiLCJ0aXRsZSIsInNjcmlwdExvYWRpbmciLCJ0ZXJzZXJPcHRpb25zIiwic2Fzc09wdGlvbnMiLCJzYXNzUmVzb3VyY2VzIiwiY3NzTW9kdWxlc09wdGlvbnMiLCJnbG9iYWxTdHlsZURpciIsImZvbnRQcmVsb2FkIiwic3Znb09wdGlvbnMiLCJub2hhc2giLCJjc3NFeHRyYWN0T3B0aW9ucyIsImNvbmZpZyIsIm1vZGUiLCJiYWlsIiwidGFyZ2V0IiwiaW5jbHVkZXMiLCJwbHVnaW5zIiwicHVzaCIsIndlYnBhY2siLCJJZ25vcmVQbHVnaW4iLCJyZXNvdXJjZVJlZ0V4cCIsIkNsZWFuV2VicGFja1BsdWdpbiIsIkxvYWRlck9wdGlvbnNQbHVnaW4iLCJtaW5pbWl6ZSIsImRlYnVnIiwiUmVtb3ZlRW1wdHlTY3JpcHRzUGx1Z2luIiwidW5zaGlmdCIsIkh0bWxXZWJwYWNrUGx1Z2luIiwiRXJyb3IiLCJQcmVsb2FkV2VicGFja1BsdWdpbiIsInJlbCIsImluY2x1ZGUiLCJmaWxlV2hpdGVsaXN0IiwiYXMiLCJtb2R1bGUiLCJydWxlcyIsInRlc3QiLCJpc3N1ZXIiLCJub3QiLCJlbmZvcmNlIiwidXNlIiwibG9hZGVyIiwicmVzb2x2ZSIsIm9wdGlvbnMiLCJvcHRpbWl6YXRpb24iLCJzcGxpdENodW5rcyIsImNodW5rcyIsIm1heEluaXRpYWxSZXF1ZXN0cyIsIm1heEFzeW5jUmVxdWVzdHMiLCJjYWNoZUdyb3VwcyIsInJlYWN0IiwibmFtZSIsInBvbHlmaWxsIiwic3R5bGVzIiwiUmVnRXhwIiwidHlwZSIsInJ1bnRpbWVDaHVuayIsImNodW5rSWRzIiwicmVhZGFibGUiLCJtaW5pbWl6ZXIiLCJUZXJzZXJQbHVnaW4iLCJwYXJzZSIsImVjbWEiLCJjb21wcmVzcyIsIndhcm5pbmdzIiwiY29tcGFyaXNvbnMiLCJpbmxpbmUiLCJtYW5nbGUiLCJzYWZhcmkxMCIsIm91dHB1dCIsImNvbW1lbnRzIiwiYXNjaWlfb25seSIsImtlZXBfY2xhc3NuYW1lcyIsInByb2ZpbGUiLCJrZWVwX2ZuYW1lcyIsImV4dHJhY3RDb21tZW50cyIsIkNzc01pbmltaXplclBsdWdpbiIsInBlcmZvcm1hbmNlIiwibWF4RW50cnlwb2ludFNpemUiLCJhc3NldEZpbHRlciIsImFzc2V0RmlsZW5hbWUiLCJzdHlsZVJ1bGVzIiwiZ2V0U3R5bGVSdWxlcyIsImFsaWFzIiwiZW50cnkiXSwic291cmNlcyI6WyIuLi9zcmMvcHJvZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJlbG9hZFdlYnBhY2tQbHVnaW4gZnJvbSAnQHZ1ZS9wcmVsb2FkLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB7IENsZWFuV2VicGFja1BsdWdpbiB9IGZyb20gJ2NsZWFuLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCBDc3NNaW5pbWl6ZXJQbHVnaW4gZnJvbSAnY3NzLW1pbmltaXplci13ZWJwYWNrLXBsdWdpbic7XG5pbXBvcnQgSHRtbFdlYnBhY2tQbHVnaW4gZnJvbSAnaHRtbC13ZWJwYWNrLXBsdWdpbic7XG5pbXBvcnQgVGVyc2VyUGx1Z2luIGZyb20gJ3RlcnNlci13ZWJwYWNrLXBsdWdpbic7XG5pbXBvcnQgd2VicGFjayBmcm9tICd3ZWJwYWNrJztcbi8vaW1wb3J0IENyaXR0ZXJzUGx1Z2luIGZyb20gJ2NyaXR0ZXJzLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCBSZW1vdmVFbXB0eVNjcmlwdHNQbHVnaW4gZnJvbSAnd2VicGFjay1yZW1vdmUtZW1wdHktc2NyaXB0cyc7XG5cbmltcG9ydCB7IGdldFN0eWxlUnVsZXMgfSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlUHJvZENvbmZpZyhcbiAgYmFzZUNvbmZpZyxcbiAge1xuICAgIHJvb3RQYXRoLFxuICAgIGJhc2VQYXRoLFxuICAgIGxpYnJhcnlJbmNsdWRlLFxuICAgIGxpYnJhcnlFeGNsdWRlLFxuICAgIGFyZ3YgPSB7fSxcbiAgICBlbnYgPSB7fSxcbiAgICBodG1sT3B0aW9ucyA9IHsgdGl0bGU6ICcnLCBzY3JpcHRMb2FkaW5nOiAnZGVmZXInIH0sXG4gICAgdGVyc2VyT3B0aW9ucyxcbiAgICBzYXNzT3B0aW9ucyxcbiAgICBzYXNzUmVzb3VyY2VzLFxuICAgIGNzc01vZHVsZXNPcHRpb25zLFxuICAgIGdsb2JhbFN0eWxlRGlyLFxuICAgIGZvbnRQcmVsb2FkLFxuICAgIHN2Z29PcHRpb25zLFxuICAgIG5vaGFzaCxcbiAgICBjc3NFeHRyYWN0T3B0aW9ucyxcbiAgfSxcbikge1xuICBjb25zdCBjb25maWcgPSB7IC4uLmJhc2VDb25maWcgfTtcblxuICBjb25maWcubW9kZSA9ICdwcm9kdWN0aW9uJztcbiAgY29uZmlnLmJhaWwgPSB0cnVlOyAvLyB0aGlzIGhlbHBzIGF1dG9tYXRpYyBidWlsZCB0b29scyBub3Qgd2FzdGUgdGltZVxuICBpZiAoIWFyZ3Y/LnRhcmdldD8uaW5jbHVkZXM/Lignbm9kZScpKSB7XG4gICAgY29uZmlnLnBsdWdpbnMucHVzaChcbiAgICAgIG5ldyB3ZWJwYWNrLklnbm9yZVBsdWdpbih7IHJlc291cmNlUmVnRXhwOiAvRGV2VG9vbHMvIH0pLFxuICAgICAgbmV3IENsZWFuV2VicGFja1BsdWdpbigpLFxuICAgICAgbmV3IHdlYnBhY2suTG9hZGVyT3B0aW9uc1BsdWdpbih7XG4gICAgICAgIG1pbmltaXplOiB0cnVlLFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIG5ldyBSZW1vdmVFbXB0eVNjcmlwdHNQbHVnaW4oKSxcbiAgICApO1xuICAgIGlmIChodG1sT3B0aW9ucykge1xuICAgICAgY29uZmlnLnBsdWdpbnMudW5zaGlmdChcbiAgICAgICAgbmV3IEh0bWxXZWJwYWNrUGx1Z2luKGh0bWxPcHRpb25zKSxcbiAgICAgICAgLy9uZXcgQ3JpdHRlcnNQbHVnaW4oe30pLFxuICAgICAgICAvL25ldyBJbmxpbmVDaHVua0h0bWxQbHVnaW4oSHRtbFdlYnBhY2tQbHVnaW4sIFsvcnVudGltZS0uK1suXWpzL10pLCB0aGlzIGlzIGEgYmFkIGlkZWEgdW50aWwgQ1NQIG5vbmNlIGNhbiBiZSBhZGRlZFxuICAgICAgKTtcbiAgICAgIGlmIChmb250UHJlbG9hZCkge1xuICAgICAgICBpZiAoIVsncHJlbG9hZCcsICdwcmVmZXRjaCddLmluY2x1ZGVzKGZvbnRQcmVsb2FkKSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgZm9udFByZWxvYWQ6ICcke2ZvbnRQcmVsb2FkfScgaXMgbm90IHZhbGlkLlxcblVzZSAncHJlbG9hZCcgb3IgJ3ByZWZldGNoJ2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uZmlnLnBsdWdpbnMudW5zaGlmdChcbiAgICAgICAgICBuZXcgUHJlbG9hZFdlYnBhY2tQbHVnaW4oe1xuICAgICAgICAgICAgcmVsOiBmb250UHJlbG9hZCxcbiAgICAgICAgICAgIGluY2x1ZGU6ICdhbGxBc3NldHMnLFxuICAgICAgICAgICAgZmlsZVdoaXRlbGlzdDogWy9cXC4ob3RmfHdvZmZ8dHRmKS9dLFxuICAgICAgICAgICAgYXMsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChzdmdvT3B0aW9ucyAhPT0gZmFsc2UpIHtcbiAgICBjb25maWcubW9kdWxlLnJ1bGVzLnB1c2goe1xuICAgICAgdGVzdDogL1xcLnN2ZyhcXD92PVxcZCtcXC5cXGQrXFwuXFxkKyk/JC8sXG4gICAgICBpc3N1ZXI6IHtcbiAgICAgICAgbm90OiBbL1xcLihqfHQpc3g/JC9dLFxuICAgICAgfSxcbiAgICAgIGVuZm9yY2U6ICdwcmUnLFxuICAgICAgdXNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnc3Znby1sb2FkZXInKSxcbiAgICAgICAgICBvcHRpb25zOiBzdmdvT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbiAgY29uZmlnLm9wdGltaXphdGlvbiA9IHtcbiAgICBzcGxpdENodW5rczoge1xuICAgICAgY2h1bmtzOiAnYXN5bmMnLFxuICAgICAgbWF4SW5pdGlhbFJlcXVlc3RzOiAzMCxcbiAgICAgIG1heEFzeW5jUmVxdWVzdHM6IDMwLFxuICAgICAgY2FjaGVHcm91cHM6IHtcbiAgICAgICAgcmVhY3Q6IHtcbiAgICAgICAgICB0ZXN0OiAvW1xcXFwvXW5vZGVfbW9kdWxlc1tcXFxcL10ocmVhY3R8cmVhY3QtZG9tfHNjaGVkdWxlcnxvYmplY3QtYXNzaWdufGxvb3NlLWVudmlmeSlbXFxcXC9dLyxcbiAgICAgICAgICBuYW1lOiAncmVhY3QnLFxuICAgICAgICAgIGNodW5rczogJ2FsbCcsXG4gICAgICAgIH0sXG4gICAgICAgIHBvbHlmaWxsOiB7XG4gICAgICAgICAgdGVzdDogL1tcXFxcL11ub2RlX21vZHVsZXNbXFxcXC9dKGNvcmUtanN8Y29yZS1qcy1wdXJlfEBiYWJlbFxcL3J1bnRpbWV8QGJhYmVsXFwvcnVudGltZS1jb3JlanMzfHJlZ2VuZXJhdG9yLXJ1bnRpbWV8cmljLXNoaW18YmFiZWwtcnVudGltZSlbXFxcXC9dLiovLFxuICAgICAgICAgIG5hbWU6ICdwb2x5ZmlsbCcsXG4gICAgICAgICAgY2h1bmtzOiAnYWxsJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgdGVzdDogbmV3IFJlZ0V4cChgJHtnbG9iYWxTdHlsZURpcn0vLipcXFxcLnNjc3MkYCksXG4gICAgICAgICAgbmFtZTogJ3N0eWxlJyxcbiAgICAgICAgICB0eXBlOiAnY3NzL21pbmktZXh0cmFjdCcsXG4gICAgICAgICAgY2h1bmtzOiAnYWxsJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBodHRwczovL3dlYnBhY2suanMub3JnL2NvbmZpZ3VyYXRpb24vb3B0aW1pemF0aW9uLyNvcHRpbWl6YXRpb25ydW50aW1lY2h1bmtcbiAgICBydW50aW1lQ2h1bms6IHtcbiAgICAgIG5hbWU6ICd3ZWJwYWNrLXJ1bnRpbWUnLFxuICAgIH0sXG4gIH07XG4gIGlmIChub2hhc2gpIHtcbiAgICBjb25maWcub3B0aW1pemF0aW9uLmNodW5rSWRzID0gJ25hbWVkJztcbiAgfVxuICBpZiAoIWVudj8ucmVhZGFibGUpIHtcbiAgICBjb25maWcub3B0aW1pemF0aW9uLm1pbmltaXplciA9IFtcbiAgICAgIG5ldyBUZXJzZXJQbHVnaW4oe1xuICAgICAgICB0ZXJzZXJPcHRpb25zOiB7XG4gICAgICAgICAgcGFyc2U6IHtcbiAgICAgICAgICAgIGVjbWE6IDksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wcmVzczoge1xuICAgICAgICAgICAgZWNtYTogNixcbiAgICAgICAgICAgIHdhcm5pbmdzOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIFBlbmRpbmcgZnVydGhlciBpbnZlc3RpZ2F0aW9uOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUzIvaXNzdWVzLzIwMTFcbiAgICAgICAgICAgIGNvbXBhcmlzb25zOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIFBlbmRpbmcgZnV0aGVyIGludmVzdGlnYXRpb246XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVyc2VyLWpzL3RlcnNlci9pc3N1ZXMvMTIwXG4gICAgICAgICAgICBpbmxpbmU6IDIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYW5nbGU6IHtcbiAgICAgICAgICAgIHNhZmFyaTEwOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICBlY21hOiA2LFxuICAgICAgICAgICAgY29tbWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgYXNjaWlfb25seTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnRlcnNlck9wdGlvbnMsXG4gICAgICAgICAga2VlcF9jbGFzc25hbWVzOlxuICAgICAgICAgICAgISFlbnY/LnByb2ZpbGUgfHwgKHRlcnNlck9wdGlvbnM/LmtlZXBfY2xhc3NuYW1lcyA/PyB0cnVlKSxcbiAgICAgICAgICBrZWVwX2ZuYW1lczogISFlbnY/LnByb2ZpbGUgfHwgdGVyc2VyT3B0aW9ucz8ua2VlcF9mbmFtZXMsXG4gICAgICAgIH0sXG4gICAgICAgIGV4dHJhY3RDb21tZW50czogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgLy8gY3NzbmFubyBvbiBub2RlX21vZHVsZXMgYXMgd2VsbCBhcyBvdXIgbG9hZGVyc1xuICAgICAgbmV3IENzc01pbmltaXplclBsdWdpbigpLFxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnLm9wdGltaXphdGlvbi5taW5pbWl6ZSA9IGZhbHNlO1xuICB9XG4gIGNvbmZpZy5wZXJmb3JtYW5jZSA9IHtcbiAgICBtYXhFbnRyeXBvaW50U2l6ZTogMzAwMDAwLFxuICAgIGFzc2V0RmlsdGVyKGFzc2V0RmlsZW5hbWUpIHtcbiAgICAgIHJldHVybiAhL1xcLihtYXB8TElDRU5TRSkkLy50ZXN0KGFzc2V0RmlsZW5hbWUpO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3Qgc3R5bGVSdWxlcyA9IGdldFN0eWxlUnVsZXMoe1xuICAgIHJvb3RQYXRoLFxuICAgIGJhc2VQYXRoLFxuICAgIGxpYnJhcnlJbmNsdWRlLFxuICAgIGxpYnJhcnlFeGNsdWRlLFxuICAgIHNhc3NPcHRpb25zLFxuICAgIHNhc3NSZXNvdXJjZXMsXG4gICAgY3NzTW9kdWxlc09wdGlvbnMsXG4gICAgZ2xvYmFsU3R5bGVEaXIsXG4gICAgdGFyZ2V0OiBhcmd2Py50YXJnZXQsXG4gICAgY3NzRXh0cmFjdE9wdGlvbnMsXG4gIH0pO1xuICBjb25maWcubW9kdWxlLnJ1bGVzID0gWy4uLmNvbmZpZy5tb2R1bGUucnVsZXMsIHN0eWxlUnVsZXNdO1xuXG4gIGlmIChlbnY/LnByb2ZpbGUpIHtcbiAgICBjb25maWcucmVzb2x2ZS5hbGlhcyA9IHtcbiAgICAgIC4uLmNvbmZpZz8ucmVzb2x2ZT8uYWxpYXMsXG4gICAgICAncmVhY3QtZG9tJCc6ICdyZWFjdC1kb20vcHJvZmlsaW5nJyxcbiAgICAgICdzY2hlZHVsZXIvdHJhY2luZyc6ICdzY2hlZHVsZXIvdHJhY2luZy1wcm9maWxpbmcnLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZnVuY3Rpb24gYXMoZW50cnkpIHtcbiAgaWYgKC9cXC5jc3MkLy50ZXN0KGVudHJ5KSkgcmV0dXJuICdzdHlsZSc7XG4gIGlmICgvXFwuKG90Znxlb3R8d29mZjJ8d29mZnx0dGYpJC8udGVzdChlbnRyeSkpIHJldHVybiAnZm9udCc7XG4gIGlmICgvXFwuKHN2Z3xhcG5nfHBuZ3xqcGd8Z2lmfGljb3x3ZWJwfGF2aWZ8Y3VyfGFuaSkkLy50ZXN0KGVudHJ5KSlcbiAgICByZXR1cm4gJ2ltYWdlJztcbiAgcmV0dXJuICdzY3JpcHQnO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLHFCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxtQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsMEJBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGtCQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxvQkFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFB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Q0FBQyxDQUFDNUUsR0FBRyxFQUFFMkUsT0FBTyxJQUFJdkUsYUFBYSxFQUFFd0U7TUFDaEQsQ0FBQztNQUNEQyxlQUFlLEVBQUU7SUFDbkIsQ0FBQyxDQUFDO0lBQ0Y7SUFDQSxJQUFJQyxrQ0FBa0IsQ0FBQyxDQUFDLENBQ3pCO0VBQ0gsQ0FBQyxNQUFNO0lBQ0xqRSxNQUFNLENBQUNpQyxZQUFZLENBQUNyQixRQUFRLEdBQUcsS0FBSztFQUN0QztFQUNBWixNQUFNLENBQUNrRSxXQUFXLEdBQUc7SUFDbkJDLGlCQUFpQixFQUFFLE1BQU07SUFDekJDLFdBQVdBLENBQUNDLGFBQWEsRUFBRTtNQUN6QixPQUFPLENBQUMsa0JBQWtCLENBQUM1QyxJQUFJLENBQUM0QyxhQUFhLENBQUM7SUFDaEQ7RUFDRixDQUFDO0VBRUQsTUFBTUMsVUFBVSxHQUFHLElBQUFDLG1CQUFhLEVBQUM7SUFDL0J6RixRQUFRO0lBQ1JDLFFBQVE7SUFDUkMsY0FBYztJQUNkQyxjQUFjO0lBQ2RPLFdBQVc7SUFDWEMsYUFBYTtJQUNiQyxpQkFBaUI7SUFDakJDLGNBQWM7SUFDZFEsTUFBTSxFQUFFakIsSUFBSSxFQUFFaUIsTUFBTTtJQUNwQko7RUFDRixDQUFDLENBQUM7RUFDRkMsTUFBTSxDQUFDdUIsTUFBTSxDQUFDQyxLQUFLLEdBQUcsQ0FBQyxHQUFHeEIsTUFBTSxDQUFDdUIsTUFBTSxDQUFDQyxLQUFLLEVBQUU4QyxVQUFVLENBQUM7RUFFMUQsSUFBSW5GLEdBQUcsRUFBRTJFLE9BQU8sRUFBRTtJQUNoQjlELE1BQU0sQ0FBQytCLE9BQU8sQ0FBQ3lDLEtBQUssR0FBRztNQUNyQixHQUFHeEUsTUFBTSxFQUFFK0IsT0FBTyxFQUFFeUMsS0FBSztNQUN6QixZQUFZLEVBQUUscUJBQXFCO01BQ25DLG1CQUFtQixFQUFFO0lBQ3ZCLENBQUM7RUFDSDtFQUNBLE9BQU94RSxNQUFNO0FBQ2Y7QUFFQSxTQUFTc0IsRUFBRUEsQ0FBQ21ELEtBQUssRUFBRTtFQUNqQixJQUFJLFFBQVEsQ0FBQ2hELElBQUksQ0FBQ2dELEtBQUssQ0FBQyxFQUFFLE9BQU8sT0FBTztFQUN4QyxJQUFJLDZCQUE2QixDQUFDaEQsSUFBSSxDQUFDZ0QsS0FBSyxDQUFDLEVBQUUsT0FBTyxNQUFNO0VBQzVELElBQUksaURBQWlELENBQUNoRCxJQUFJLENBQUNnRCxLQUFLLENBQUMsRUFDL0QsT0FBTyxPQUFPO0VBQ2hCLE9BQU8sUUFBUTtBQUNqQiIsImlnbm9yZUxpc3QiOltdfQ==