UNPKG

@anansi/webpack-config

Version:
191 lines (189 loc) 21.9 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 _semver = _interopRequireDefault(require("semver")); 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 }; const reactVersion = getReactVersion(rootPath); 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) { let reactClient = 'react-dom/client$'; if (reactVersion && _semver.default.lt(reactVersion, '19.0.0')) { reactClient = 'react-dom$'; } config.resolve.alias = { ...config?.resolve?.alias, [reactClient]: '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'; } function getReactVersion(rootPath) { const react = require(require.resolve('react', { paths: [rootPath] })); return react ? react.version : null; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHJlbG9hZFdlYnBhY2tQbHVnaW4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGVhbldlYnBhY2tQbHVnaW4iLCJfY3NzTWluaW1pemVyV2VicGFja1BsdWdpbiIsIl9odG1sV2VicGFja1BsdWdpbiIsIl9zZW12ZXIiLCJfdGVyc2VyV2VicGFja1BsdWdpbiIsIl93ZWJwYWNrIiwiX3dlYnBhY2tSZW1vdmVFbXB0eVNjcmlwdHMiLCJfYmFzZSIsIm1ha2VQcm9kQ29uZmlnIiwiYmFzZUNvbmZpZyIsInJvb3RQYXRoIiwiYmFzZVBhdGgiLCJsaWJyYXJ5SW5jbHVkZSIsImxpYnJhcnlFeGNsdWRlIiwiYXJndiIsImVudiIsImh0bWxPcHRpb25zIiwidGl0bGUiLCJzY3JpcHRMb2FkaW5nIiwidGVyc2VyT3B0aW9ucyIsInNhc3NPcHRpb25zIiwic2Fzc1Jlc291cmNlcyIsImNzc01vZHVsZXNPcHRpb25zIiwiZ2xvYmFsU3R5bGVEaXIiLCJmb250UHJlbG9hZCIsInN2Z29PcHRpb25zIiwibm9oYXNoIiwiY3NzRXh0cmFjdE9wdGlvbnMiLCJjb25maWciLCJyZWFjdFZlcnNpb24iLCJnZXRSZWFjdFZlcnNpb24iLCJtb2RlIiwiYmFpbCIsInRhcmdldCIsImluY2x1ZGVzIiwicGx1Z2lucyIsInB1c2giLCJ3ZWJwYWNrIiwiSWdub3JlUGx1Z2luIiwicmVzb3VyY2VSZWdFeHAiLCJDbGVhbldlYnBhY2tQbHVnaW4iLCJMb2FkZXJPcHRpb25zUGx1Z2luIiwibWluaW1pemUiLCJkZWJ1ZyIsIlJlbW92ZUVtcHR5U2NyaXB0c1BsdWdpbiIsInVuc2hpZnQiLCJIdG1sV2VicGFja1BsdWdpbiIsIkVycm9yIiwiUHJlbG9hZFdlYnBhY2tQbHVnaW4iLCJyZWwiLCJpbmNsdWRlIiwiZmlsZVdoaXRlbGlzdCIsImFzIiwibW9kdWxlIiwicnVsZXMiLCJ0ZXN0IiwiaXNzdWVyIiwibm90IiwiZW5mb3JjZSIsInVzZSIsImxvYWRlciIsInJlc29sdmUiLCJvcHRpb25zIiwib3B0aW1pemF0aW9uIiwic3BsaXRDaHVua3MiLCJjaHVua3MiLCJtYXhJbml0aWFsUmVxdWVzdHMiLCJtYXhBc3luY1JlcXVlc3RzIiwiY2FjaGVHcm91cHMiLCJyZWFjdCIsIm5hbWUiLCJwb2x5ZmlsbCIsInN0eWxlcyIsIlJlZ0V4cCIsInR5cGUiLCJydW50aW1lQ2h1bmsiLCJjaHVua0lkcyIsInJlYWRhYmxlIiwibWluaW1pemVyIiwiVGVyc2VyUGx1Z2luIiwicGFyc2UiLCJlY21hIiwiY29tcHJlc3MiLCJ3YXJuaW5ncyIsImNvbXBhcmlzb25zIiwiaW5saW5lIiwibWFuZ2xlIiwic2FmYXJpMTAiLCJvdXRwdXQiLCJjb21tZW50cyIsImFzY2lpX29ubHkiLCJrZWVwX2NsYXNzbmFtZXMiLCJwcm9maWxlIiwia2VlcF9mbmFtZXMiLCJleHRyYWN0Q29tbWVudHMiLCJDc3NNaW5pbWl6ZXJQbHVnaW4iLCJwZXJmb3JtYW5jZSIsIm1heEVudHJ5cG9pbnRTaXplIiwiYXNzZXRGaWx0ZXIiLCJhc3NldEZpbGVuYW1lIiwic3R5bGVSdWxlcyIsImdldFN0eWxlUnVsZXMiLCJyZWFjdENsaWVudCIsInNlbXZlciIsImx0IiwiYWxpYXMiLCJlbnRyeSIsInBhdGhzIiwidmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcmVsb2FkV2VicGFja1BsdWdpbiBmcm9tICdAdnVlL3ByZWxvYWQtd2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IHsgQ2xlYW5XZWJwYWNrUGx1Z2luIH0gZnJvbSAnY2xlYW4td2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IENzc01pbmltaXplclBsdWdpbiBmcm9tICdjc3MtbWluaW1pemVyLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCBIdG1sV2VicGFja1BsdWdpbiBmcm9tICdodG1sLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBUZXJzZXJQbHVnaW4gZnJvbSAndGVyc2VyLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuLy9pbXBvcnQgQ3JpdHRlcnNQbHVnaW4gZnJvbSAnY3JpdHRlcnMtd2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IFJlbW92ZUVtcHR5U2NyaXB0c1BsdWdpbiBmcm9tICd3ZWJwYWNrLXJlbW92ZS1lbXB0eS1zY3JpcHRzJztcblxuaW1wb3J0IHsgZ2V0U3R5bGVSdWxlcyB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VQcm9kQ29uZmlnKFxuICBiYXNlQ29uZmlnLFxuICB7XG4gICAgcm9vdFBhdGgsXG4gICAgYmFzZVBhdGgsXG4gICAgbGlicmFyeUluY2x1ZGUsXG4gICAgbGlicmFyeUV4Y2x1ZGUsXG4gICAgYXJndiA9IHt9LFxuICAgIGVudiA9IHt9LFxuICAgIGh0bWxPcHRpb25zID0geyB0aXRsZTogJycsIHNjcmlwdExvYWRpbmc6ICdkZWZlcicgfSxcbiAgICB0ZXJzZXJPcHRpb25zLFxuICAgIHNhc3NPcHRpb25zLFxuICAgIHNhc3NSZXNvdXJjZXMsXG4gICAgY3NzTW9kdWxlc09wdGlvbnMsXG4gICAgZ2xvYmFsU3R5bGVEaXIsXG4gICAgZm9udFByZWxvYWQsXG4gICAgc3Znb09wdGlvbnMsXG4gICAgbm9oYXNoLFxuICAgIGNzc0V4dHJhY3RPcHRpb25zLFxuICB9LFxuKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHsgLi4uYmFzZUNvbmZpZyB9O1xuICBjb25zdCByZWFjdFZlcnNpb24gPSBnZXRSZWFjdFZlcnNpb24ocm9vdFBhdGgpO1xuXG4gIGNvbmZpZy5tb2RlID0gJ3Byb2R1Y3Rpb24nO1xuICBjb25maWcuYmFpbCA9IHRydWU7IC8vIHRoaXMgaGVscHMgYXV0b21hdGljIGJ1aWxkIHRvb2xzIG5vdCB3YXN0ZSB0aW1lXG4gIGlmICghYXJndj8udGFyZ2V0Py5pbmNsdWRlcz8uKCdub2RlJykpIHtcbiAgICBjb25maWcucGx1Z2lucy5wdXNoKFxuICAgICAgbmV3IHdlYnBhY2suSWdub3JlUGx1Z2luKHsgcmVzb3VyY2VSZWdFeHA6IC9EZXZUb29scy8gfSksXG4gICAgICBuZXcgQ2xlYW5XZWJwYWNrUGx1Z2luKCksXG4gICAgICBuZXcgd2VicGFjay5Mb2FkZXJPcHRpb25zUGx1Z2luKHtcbiAgICAgICAgbWluaW1pemU6IHRydWUsXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICAgbmV3IFJlbW92ZUVtcHR5U2NyaXB0c1BsdWdpbigpLFxuICAgICk7XG4gICAgaWYgKGh0bWxPcHRpb25zKSB7XG4gICAgICBjb25maWcucGx1Z2lucy51bnNoaWZ0KFxuICAgICAgICBuZXcgSHRtbFdlYnBhY2tQbHVnaW4oaHRtbE9wdGlvbnMpLFxuICAgICAgICAvL25ldyBDcml0dGVyc1BsdWdpbih7fSksXG4gICAgICAgIC8vbmV3IElubGluZUNodW5rSHRtbFBsdWdpbihIdG1sV2VicGFja1BsdWdpbiwgWy9ydW50aW1lLS4rWy5danMvXSksIHRoaXMgaXMgYSBiYWQgaWRlYSB1bnRpbCBDU1Agbm9uY2UgY2FuIGJlIGFkZGVkXG4gICAgICApO1xuICAgICAgaWYgKGZvbnRQcmVsb2FkKSB7XG4gICAgICAgIGlmICghWydwcmVsb2FkJywgJ3ByZWZldGNoJ10uaW5jbHVkZXMoZm9udFByZWxvYWQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBmb250UHJlbG9hZDogJyR7Zm9udFByZWxvYWR9JyBpcyBub3QgdmFsaWQuXFxuVXNlICdwcmVsb2FkJyBvciAncHJlZmV0Y2gnYCxcbiAgICAgICAgICApO1xuICAgICAgICBjb25maWcucGx1Z2lucy51bnNoaWZ0KFxuICAgICAgICAgIG5ldyBQcmVsb2FkV2VicGFja1BsdWdpbih7XG4gICAgICAgICAgICByZWw6IGZvbnRQcmVsb2FkLFxuICAgICAgICAgICAgaW5jbHVkZTogJ2FsbEFzc2V0cycsXG4gICAgICAgICAgICBmaWxlV2hpdGVsaXN0OiBbL1xcLihvdGZ8d29mZnx0dGYpL10sXG4gICAgICAgICAgICBhcyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHN2Z29PcHRpb25zICE9PSBmYWxzZSkge1xuICAgIGNvbmZpZy5tb2R1bGUucnVsZXMucHVzaCh7XG4gICAgICB0ZXN0OiAvXFwuc3ZnKFxcP3Y9XFxkK1xcLlxcZCtcXC5cXGQrKT8kLyxcbiAgICAgIGlzc3Vlcjoge1xuICAgICAgICBub3Q6IFsvXFwuKGp8dClzeD8kL10sXG4gICAgICB9LFxuICAgICAgZW5mb3JjZTogJ3ByZScsXG4gICAgICB1c2U6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxvYWRlcjogcmVxdWlyZS5yZXNvbHZlKCdzdmdvLWxvYWRlcicpLFxuICAgICAgICAgIG9wdGlvbnM6IHN2Z29PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuICBjb25maWcub3B0aW1pemF0aW9uID0ge1xuICAgIHNwbGl0Q2h1bmtzOiB7XG4gICAgICBjaHVua3M6ICdhc3luYycsXG4gICAgICBtYXhJbml0aWFsUmVxdWVzdHM6IDMwLFxuICAgICAgbWF4QXN5bmNSZXF1ZXN0czogMzAsXG4gICAgICBjYWNoZUdyb3Vwczoge1xuICAgICAgICByZWFjdDoge1xuICAgICAgICAgIHRlc3Q6IC9bXFxcXC9dbm9kZV9tb2R1bGVzW1xcXFwvXShyZWFjdHxyZWFjdC1kb218c2NoZWR1bGVyfG9iamVjdC1hc3NpZ258bG9vc2UtZW52aWZ5KVtcXFxcL10vLFxuICAgICAgICAgIG5hbWU6ICdyZWFjdCcsXG4gICAgICAgICAgY2h1bmtzOiAnYWxsJyxcbiAgICAgICAgfSxcbiAgICAgICAgcG9seWZpbGw6IHtcbiAgICAgICAgICB0ZXN0OiAvW1xcXFwvXW5vZGVfbW9kdWxlc1tcXFxcL10oY29yZS1qc3xjb3JlLWpzLXB1cmV8QGJhYmVsXFwvcnVudGltZXxAYmFiZWxcXC9ydW50aW1lLWNvcmVqczN8cmVnZW5lcmF0b3ItcnVudGltZXxyaWMtc2hpbXxiYWJlbC1ydW50aW1lKVtcXFxcL10uKi8sXG4gICAgICAgICAgbmFtZTogJ3BvbHlmaWxsJyxcbiAgICAgICAgICBjaHVua3M6ICdhbGwnLFxuICAgICAgICB9LFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICB0ZXN0OiBuZXcgUmVnRXhwKGAke2dsb2JhbFN0eWxlRGlyfS8uKlxcXFwuc2NzcyRgKSxcbiAgICAgICAgICBuYW1lOiAnc3R5bGUnLFxuICAgICAgICAgIHR5cGU6ICdjc3MvbWluaS1leHRyYWN0JyxcbiAgICAgICAgICBjaHVua3M6ICdhbGwnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvY29uZmlndXJhdGlvbi9vcHRpbWl6YXRpb24vI29wdGltaXphdGlvbnJ1bnRpbWVjaHVua1xuICAgIHJ1bnRpbWVDaHVuazoge1xuICAgICAgbmFtZTogJ3dlYnBhY2stcnVudGltZScsXG4gICAgfSxcbiAgfTtcbiAgaWYgKG5vaGFzaCkge1xuICAgIGNvbmZpZy5vcHRpbWl6YXRpb24uY2h1bmtJZHMgPSAnbmFtZWQnO1xuICB9XG4gIGlmICghZW52Py5yZWFkYWJsZSkge1xuICAgIGNvbmZpZy5vcHRpbWl6YXRpb24ubWluaW1pemVyID0gW1xuICAgICAgbmV3IFRlcnNlclBsdWdpbih7XG4gICAgICAgIHRlcnNlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXJzZToge1xuICAgICAgICAgICAgZWNtYTogOSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbXByZXNzOiB7XG4gICAgICAgICAgICBlY21hOiA2LFxuICAgICAgICAgICAgd2FybmluZ3M6IGZhbHNlLFxuICAgICAgICAgICAgLy8gUGVuZGluZyBmdXJ0aGVyIGludmVzdGlnYXRpb246XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWlzaG9vL1VnbGlmeUpTMi9pc3N1ZXMvMjAxMVxuICAgICAgICAgICAgY29tcGFyaXNvbnM6IGZhbHNlLFxuICAgICAgICAgICAgLy8gUGVuZGluZyBmdXRoZXIgaW52ZXN0aWdhdGlvbjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJzZXItanMvdGVyc2VyL2lzc3Vlcy8xMjBcbiAgICAgICAgICAgIGlubGluZTogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hbmdsZToge1xuICAgICAgICAgICAgc2FmYXJpMTA6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAgIGVjbWE6IDYsXG4gICAgICAgICAgICBjb21tZW50czogZmFsc2UsXG4gICAgICAgICAgICBhc2NpaV9vbmx5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4udGVyc2VyT3B0aW9ucyxcbiAgICAgICAgICBrZWVwX2NsYXNzbmFtZXM6XG4gICAgICAgICAgICAhIWVudj8ucHJvZmlsZSB8fCAodGVyc2VyT3B0aW9ucz8ua2VlcF9jbGFzc25hbWVzID8/IHRydWUpLFxuICAgICAgICAgIGtlZXBfZm5hbWVzOiAhIWVudj8ucHJvZmlsZSB8fCB0ZXJzZXJPcHRpb25zPy5rZWVwX2ZuYW1lcyxcbiAgICAgICAgfSxcbiAgICAgICAgZXh0cmFjdENvbW1lbnRzOiB0cnVlLFxuICAgICAgfSksXG4gICAgICAvLyBjc3NuYW5vIG9uIG5vZGVfbW9kdWxlcyBhcyB3ZWxsIGFzIG91ciBsb2FkZXJzXG4gICAgICBuZXcgQ3NzTWluaW1pemVyUGx1Z2luKCksXG4gICAgXTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcub3B0aW1pemF0aW9uLm1pbmltaXplID0gZmFsc2U7XG4gIH1cbiAgY29uZmlnLnBlcmZvcm1hbmNlID0ge1xuICAgIG1heEVudHJ5cG9pbnRTaXplOiAzMDAwMDAsXG4gICAgYXNzZXRGaWx0ZXIoYXNzZXRGaWxlbmFtZSkge1xuICAgICAgcmV0dXJuICEvXFwuKG1hcHxMSUNFTlNFKSQvLnRlc3QoYXNzZXRGaWxlbmFtZSk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBzdHlsZVJ1bGVzID0gZ2V0U3R5bGVSdWxlcyh7XG4gICAgcm9vdFBhdGgsXG4gICAgYmFzZVBhdGgsXG4gICAgbGlicmFyeUluY2x1ZGUsXG4gICAgbGlicmFyeUV4Y2x1ZGUsXG4gICAgc2Fzc09wdGlvbnMsXG4gICAgc2Fzc1Jlc291cmNlcyxcbiAgICBjc3NNb2R1bGVzT3B0aW9ucyxcbiAgICBnbG9iYWxTdHlsZURpcixcbiAgICB0YXJnZXQ6IGFyZ3Y/LnRhcmdldCxcbiAgICBjc3NFeHRyYWN0T3B0aW9ucyxcbiAgfSk7XG4gIGNvbmZpZy5tb2R1bGUucnVsZXMgPSBbLi4uY29uZmlnLm1vZHVsZS5ydWxlcywgc3R5bGVSdWxlc107XG5cbiAgaWYgKGVudj8ucHJvZmlsZSkge1xuICAgIGxldCByZWFjdENsaWVudCA9ICdyZWFjdC1kb20vY2xpZW50JCc7XG4gICAgaWYgKHJlYWN0VmVyc2lvbiAmJiBzZW12ZXIubHQocmVhY3RWZXJzaW9uLCAnMTkuMC4wJykpIHtcbiAgICAgIHJlYWN0Q2xpZW50ID0gJ3JlYWN0LWRvbSQnO1xuICAgIH1cbiAgICBjb25maWcucmVzb2x2ZS5hbGlhcyA9IHtcbiAgICAgIC4uLmNvbmZpZz8ucmVzb2x2ZT8uYWxpYXMsXG4gICAgICBbcmVhY3RDbGllbnRdOiAncmVhY3QtZG9tL3Byb2ZpbGluZycsXG4gICAgICAnc2NoZWR1bGVyL3RyYWNpbmcnOiAnc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIGFzKGVudHJ5KSB7XG4gIGlmICgvXFwuY3NzJC8udGVzdChlbnRyeSkpIHJldHVybiAnc3R5bGUnO1xuICBpZiAoL1xcLihvdGZ8ZW90fHdvZmYyfHdvZmZ8dHRmKSQvLnRlc3QoZW50cnkpKSByZXR1cm4gJ2ZvbnQnO1xuICBpZiAoL1xcLihzdmd8YXBuZ3xwbmd8anBnfGdpZnxpY298d2VicHxhdmlmfGN1cnxhbmkpJC8udGVzdChlbnRyeSkpXG4gICAgcmV0dXJuICdpbWFnZSc7XG4gIHJldHVybiAnc2NyaXB0Jztcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RWZXJzaW9uKHJvb3RQYXRoKSB7XG4gIGNvbnN0IHJlYWN0ID0gcmVxdWlyZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ3JlYWN0Jywge1xuICAgICAgcGF0aHM6IFtyb290UGF0aF0sXG4gICAgfSksXG4gICk7XG4gIHJldHVybiByZWFjdCA/IHJlYWN0LnZlcnNpb24gOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLHFCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxtQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsMEJBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGtCQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxvQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sUUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQU8sMEJBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFRLEtBQUEsR0FBQVIsT0FBQTtBQUhBOztBQUtlLFNBQVNTLGNBQWNBLENBQ3BDQyxVQUFVLEVBQ1Y7RUFDRUMsUUFBUTtFQUNSQyxRQUFRO0VBQ1JDLGNBQWM7RUFDZEMsY0FBYztFQUNkQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBQ1RDLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDUkMsV0FBVyxHQUFHO0lBQUVDLEtBQUssRUFBRSxFQUFFO0lBQUVDLGFBQWEsRUFBRTtFQUFRLENBQUM7RUFDbkRDLGFBQWE7RUFDYkMsV0FBVztFQUNYQyxhQUFhO0VBQ2JDLGlCQUFpQjtFQUNqQkMsY0FBYztFQUNk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QUFDNEMsYUFBYSxDQUFDO0lBQ2hEO0VBQ0YsQ0FBQztFQUVELE1BQU1DLFVBQVUsR0FBRyxJQUFBQyxtQkFBYSxFQUFDO0lBQy9CM0YsUUFBUTtJQUNSQyxRQUFRO0lBQ1JDLGNBQWM7SUFDZEMsY0FBYztJQUNkTyxXQUFXO0lBQ1hDLGFBQWE7SUFDYkMsaUJBQWlCO0lBQ2pCQyxjQUFjO0lBQ2RVLE1BQU0sRUFBRW5CLElBQUksRUFBRW1CLE1BQU07SUFDcEJOO0VBQ0YsQ0FBQyxDQUFDO0VBQ0ZDLE1BQU0sQ0FBQ3lCLE1BQU0sQ0FBQ0MsS0FBSyxHQUFHLENBQUMsR0FBRzFCLE1BQU0sQ0FBQ3lCLE1BQU0sQ0FBQ0MsS0FBSyxFQUFFOEMsVUFBVSxDQUFDO0VBRTFELElBQUlyRixHQUFHLEVBQUU2RSxPQUFPLEVBQUU7SUFDaEIsSUFBSVUsV0FBVyxHQUFHLG1CQUFtQjtJQUNyQyxJQUFJekUsWUFBWSxJQUFJMEUsZUFBTSxDQUFDQyxFQUFFLENBQUMzRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEVBQUU7TUFDckR5RSxXQUFXLEdBQUcsWUFBWTtJQUM1QjtJQUNBMUUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNEMsS0FBSyxHQUFHO01BQ3JCLEdBQUc3RSxNQUFNLEVBQUVpQyxPQUFPLEVBQUU0QyxLQUFLO01BQ3pCLENBQUNILFdBQVcsR0FBRyxxQkFBcUI7TUFDcEMsbUJBQW1CLEVBQUU7SUFDdkIsQ0FBQztFQUNIO0VBQ0EsT0FBTzFFLE1BQU07QUFDZjtBQUVBLFNBQVN3QixFQUFFQSxDQUFDc0QsS0FBSyxFQUFFO0VBQ2pCLElBQUksUUFBUSxDQUFDbkQsSUFBSSxDQUFDbUQsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0VBQ3hDLElBQUksNkJBQTZCLENBQUNuRCxJQUFJLENBQUNtRCxLQUFLLENBQUMsRUFBRSxPQUFPLE1BQU07RUFDNUQsSUFBSSxpREFBaUQsQ0FBQ25ELElBQUksQ0FBQ21ELEtBQUssQ0FBQyxFQUMvRCxPQUFPLE9BQU87RUFDaEIsT0FBTyxRQUFRO0FBQ2pCO0FBRUEsU0FBUzVFLGVBQWVBLENBQUNwQixRQUFRLEVBQUU7RUFDakMsTUFBTTJELEtBQUssR0FBR3RFLE9BQU8sQ0FDbkJBLE9BQU8sQ0FBQzhELE9BQU8sQ0FBQyxPQUFPLEVBQUU7SUFDdkI4QyxLQUFLLEVBQUUsQ0FBQ2pHLFFBQVE7RUFDbEIsQ0FBQyxDQUNILENBQUM7RUFDRCxPQUFPMkQsS0FBSyxHQUFHQSxLQUFLLENBQUN1QyxPQUFPLEdBQUcsSUFBSTtBQUNyQyIsImlnbm9yZUxpc3QiOltdfQ==