UNPKG

@anansi/webpack-config

Version:
179 lines (177 loc) 20.2 kB
"use strict"; 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==