UNPKG

vite-plugin-react-server

Version:
295 lines (292 loc) 33.5 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { cleanObject } from './cleanObject.js'; import { DEFAULT_CONFIG } from '../config/defaults.js'; const VITE_NON_SERIALIZABLE_FUNCTIONS = /* @__PURE__ */ new Set([ "renderChunk", "buildStart", "buildEnd", "watchChange", "resolveId", "config", "output[].entryFileNames", "output[].chunkFileNames", "output[].assetFileNames", "transform", "handler", "configureServer", "shouldTransformCachedModule", "generateBundle", "renderStart", "writeBundle", "hotUpdate", "configResolved", "configurePreviewServer", "handleHotUpdate", "load", "augmentChunkHash", "closeBundle", "entryFileNames", "assetFileNames", "chunkFileNames", "createEnvironment", "sourcemapIgnoreList", "assetsInclude", "info", "warn", "warnOnce", "error", "clearScreen", "hasErrorLogged", "set", "plugins", "getSortedPlugins", "getSortedPluginHooks", "createResolver", "fsDenyGlob", // Nested plugin functions "plugins[].renderChunk", "plugins[].buildStart", "plugins[].buildEnd", "plugins[].watchChange", "plugins[].resolveId", "plugins[].config", "plugins[].transform", "plugins[].handler", "plugins[].configureServer", "plugins[].shouldTransformCachedModule", "plugins[].generateBundle", "plugins[].renderStart", "plugins[].writeBundle", "plugins[].hotUpdate", "plugins[].configResolved", "plugins[].configurePreviewServer", "plugins[].handleHotUpdate", "plugins[].load", "plugins[].augmentChunkHash", "plugins[].closeBundle", "plugins[].entryFileNames", "plugins[].assetFileNames", "plugins[].chunkFileNames", "plugins[].createEnvironment", "plugins[].sourcemapIgnoreList", "plugins[].assetsInclude" ]); const PLUGIN_NON_SERIALIZABLE_FUNCTIONS = /* @__PURE__ */ new Set([ "Page", "props", "normalizer", "Root", "Html", "onEvent", "onMetrics", "autoDiscover" ]); function serializeRegExp(regex) { return { source: regex.source, flags: regex.flags, __isRegExp: true }; } function deserializeRegExp(obj) { if (obj && typeof obj === "object" && obj != null && "__isRegExp" in obj && typeof obj["__isRegExp"] === "boolean" && "source" in obj && typeof obj["source"] === "string" && "flags" in obj && typeof obj["flags"] === "string") { return new RegExp(obj["source"], obj["flags"]); } if (Array.isArray(obj)) { if (obj.length > 0 && Array.isArray(obj[0]) && obj[0].length === 2) { return new Map(obj); } return obj.map(deserializeRegExp); } if (obj && typeof obj === "object") { const result = {}; for (const [key, value] of Object.entries(obj)) { result[key] = deserializeRegExp(value); } return result; } return obj; } function processForSerialization(obj) { if (obj instanceof RegExp) { return serializeRegExp(obj); } if (obj instanceof Map) { return Array.from(obj.entries()); } if (Array.isArray(obj)) { return obj.map(processForSerialization); } if (obj && typeof obj === "object") { const result = {}; for (const [key, value] of Object.entries(obj)) { result[key] = processForSerialization(value); } return result; } return obj; } function serializeResolvedConfig(config, knownNonSerializableFunctions = VITE_NON_SERIALIZABLE_FUNCTIONS) { if (!config) { return void 0; } const { getSortedPluginHooks: _getSortedPluginHooks, getSortedPlugins: _getSortedPlugins, assetsInclude: _assetsInclude, environments: _environments, // extract known vite function properties ...handlerOptions } = config; const minimalEnvironments = _environments ? { client: { resolve: { conditions: ["browser", "module", "import"] }, consumer: "client", optimizeDeps: { include: [] }, dev: { optimizeDeps: { include: [] } }, build: { outDir: "dist" } }, ssr: { resolve: { conditions: ["node", "import"] }, consumer: "server", optimizeDeps: { include: [] }, dev: { optimizeDeps: { include: [] } }, build: { outDir: "dist" } } } : void 0; const cleaned = cleanObject(handlerOptions, knownNonSerializableFunctions); if (minimalEnvironments) { cleaned.environments = minimalEnvironments; } return processForSerialization(cleaned); } function serializeResolvedUserConfig(config, knownNonSerializableFunctions = VITE_NON_SERIALIZABLE_FUNCTIONS) { const { assetsInclude: _assetsInclude, // extract known vite function properties ...handlerOptions } = config; return processForSerialization( cleanObject(handlerOptions, knownNonSerializableFunctions) ); } const serializedDevServerConfig = (config, customNonSerializableFunctions = PLUGIN_NON_SERIALIZABLE_FUNCTIONS) => { const { getSortedPluginHooks: _getSortedPluginHooks, getSortedPlugins: _getSortedPlugins, assetsInclude: _assetsInclude, build: _build, ...handlerOptions } = config; return processForSerialization( cleanObject(handlerOptions, customNonSerializableFunctions) ); }; const serializedOptions = (userOptions, autoDiscoveredFiles, customNonSerializableFunctions = PLUGIN_NON_SERIALIZABLE_FUNCTIONS) => { const { Page: _Page, props: _props, normalizer: _normalizer, Root: _Root, Html: _Html, onEvent: _onEvent, onMetrics: _onMetrics, build: _build, loader: _loader, autoDiscover, propsExportName, pageExportName, serverPipeableStreamOptions, clientPipeableStreamOptions, ...handlerOptions } = userOptions; const { entryFile: _entryFile, chunkFile: _chunkFile, assetFile: _assetFile, pages: _pages, ...buildOptions } = _build ?? {}; const serializedBuild = { ...DEFAULT_CONFIG.BUILD, // Start with defaults ...buildOptions, // Override with user options pages: autoDiscoveredFiles ? Array.from(autoDiscoveredFiles.urlMap.keys()) : [] }; const { isServerFunctionCode: _isServerFunctionCode, isClientComponentCode: _isClientComponentCode, isClientComponentByCode: _isClientComponentByCode, isClientComponentByName: _isClientComponentByName, getDirectiveType: _getDirectiveType, allowedDirectives, ...loaderOptions } = _loader ?? {}; const { modulePattern: _modulePattern, cssPattern: _cssPattern, jsonPattern: _jsonPattern, clientPattern: _clientPattern, propsPattern: _propsPattern, pagePattern: _pagePattern, htmlPattern: _htmlPattern, rscPattern: _rscPattern, serverPattern: _serverPattern, cssModulePattern: _cssModulePattern, vendorPattern: _vendorPattern, nodePattern: _nodePattern, dotPattern: _dotPattern, virtualPattern: _virtualPattern, ...serializedAutoDiscover } = autoDiscover; const result = { ...handlerOptions, Page: typeof _Page === "string" ? _Page : void 0, Html: typeof _Html === "string" ? _Html : void 0, Root: typeof _Root === "string" ? _Root : void 0, normalizer: void 0, onEvent: void 0, onMetrics: void 0, propsExportName, pageExportName, build: serializedBuild, loader: { directivePattern: { config: { validate: void 0, ...allowedDirectives } }, ...loaderOptions }, autoDiscover: { modulePattern: serializeRegExp(_modulePattern), serverPattern: serializeRegExp(_serverPattern), clientPattern: serializeRegExp(_clientPattern), pagePattern: serializeRegExp(_pagePattern), propsPattern: serializeRegExp(_propsPattern), cssPattern: serializeRegExp(_cssPattern), jsonPattern: serializeRegExp(_jsonPattern), htmlPattern: serializeRegExp(_htmlPattern), cssModulePattern: serializeRegExp(_cssModulePattern), vendorPattern: serializeRegExp(_vendorPattern), nodePattern: serializeRegExp(_nodePattern), dotPattern: serializeRegExp(_dotPattern), virtualPattern: serializeRegExp(_virtualPattern), rscPattern: serializeRegExp(_rscPattern), ...serializedAutoDiscover }, serverPipeableStreamOptions, clientPipeableStreamOptions }; const cleanedResult = cleanObject(result, customNonSerializableFunctions); const finalResult = processForSerialization(cleanedResult); return finalResult; }; export { deserializeRegExp, processForSerialization, serializeResolvedConfig, serializeResolvedUserConfig, serializedDevServerConfig, serializedOptions }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplVXNlck9wdGlvbnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9oZWxwZXJzL3NlcmlhbGl6ZVVzZXJPcHRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVzb2x2ZWRDb25maWcsIFZpdGVEZXZTZXJ2ZXIgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBdXRvRGlzY292ZXJlZEZpbGVzLFxuICBSZXNvbHZlZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemFibGVSZWNvcmQsXG4gIFJlc29sdmVkVXNlckNvbmZpZyxcbiAgU2VyaWFsaXplZFVzZXJPcHRpb25zLFxuICBTZXJpYWxpemFibGUsXG59IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgY2xlYW5PYmplY3QgfSBmcm9tIFwiLi9jbGVhbk9iamVjdC5qc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi4vY29uZmlnL2RlZmF1bHRzLmpzXCI7XG5cbi8vIENvbW1vbiBub24tc2VyaWFsaXphYmxlIGZ1bmN0aW9ucyBpbiBWaXRlJ3MgcmVzb2x2ZWQgY29uZmlnXG5jb25zdCBWSVRFX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TID0gbmV3IFNldChbXG4gIFwicmVuZGVyQ2h1bmtcIixcbiAgXCJidWlsZFN0YXJ0XCIsXG4gIFwiYnVpbGRFbmRcIixcbiAgXCJ3YXRjaENoYW5nZVwiLFxuICBcInJlc29sdmVJZFwiLFxuICBcImNvbmZpZ1wiLFxuICBcIm91dHB1dFtdLmVudHJ5RmlsZU5hbWVzXCIsXG4gIFwib3V0cHV0W10uY2h1bmtGaWxlTmFtZXNcIixcbiAgXCJvdXRwdXRbXS5hc3NldEZpbGVOYW1lc1wiLFxuICBcInRyYW5zZm9ybVwiLFxuICBcImhhbmRsZXJcIixcbiAgXCJjb25maWd1cmVTZXJ2ZXJcIixcbiAgXCJzaG91bGRUcmFuc2Zvcm1DYWNoZWRNb2R1bGVcIixcbiAgXCJnZW5lcmF0ZUJ1bmRsZVwiLFxuICBcInJlbmRlclN0YXJ0XCIsXG4gIFwid3JpdGVCdW5kbGVcIixcbiAgXCJob3RVcGRhdGVcIixcbiAgXCJjb25maWdSZXNvbHZlZFwiLFxuICBcImNvbmZpZ3VyZVByZXZpZXdTZXJ2ZXJcIixcbiAgXCJoYW5kbGVIb3RVcGRhdGVcIixcbiAgXCJsb2FkXCIsXG4gIFwiYXVnbWVudENodW5rSGFzaFwiLFxuICBcImNsb3NlQnVuZGxlXCIsXG4gIFwiZW50cnlGaWxlTmFtZXNcIixcbiAgXCJhc3NldEZpbGVOYW1lc1wiLFxuICBcImNodW5rRmlsZU5hbWVzXCIsXG4gIFwiY3JlYXRlRW52aXJvbm1lbnRcIixcbiAgXCJzb3VyY2VtYXBJZ25vcmVMaXN0XCIsXG4gIFwiYXNzZXRzSW5jbHVkZVwiLFxuICBcImluZm9cIixcbiAgXCJ3YXJuXCIsXG4gIFwid2Fybk9uY2VcIixcbiAgXCJlcnJvclwiLFxuICBcImNsZWFyU2NyZWVuXCIsXG4gIFwiaGFzRXJyb3JMb2dnZWRcIixcbiAgXCJzZXRcIixcbiAgXCJwbHVnaW5zXCIsXG4gIFwiZ2V0U29ydGVkUGx1Z2luc1wiLFxuICBcImdldFNvcnRlZFBsdWdpbkhvb2tzXCIsXG4gIFwiY3JlYXRlUmVzb2x2ZXJcIixcbiAgXCJmc0RlbnlHbG9iXCIsXG4gIC8vIE5lc3RlZCBwbHVnaW4gZnVuY3Rpb25zXG4gIFwicGx1Z2luc1tdLnJlbmRlckNodW5rXCIsXG4gIFwicGx1Z2luc1tdLmJ1aWxkU3RhcnRcIixcbiAgXCJwbHVnaW5zW10uYnVpbGRFbmRcIixcbiAgXCJwbHVnaW5zW10ud2F0Y2hDaGFuZ2VcIixcbiAgXCJwbHVnaW5zW10ucmVzb2x2ZUlkXCIsXG4gIFwicGx1Z2luc1tdLmNvbmZpZ1wiLFxuICBcInBsdWdpbnNbXS50cmFuc2Zvcm1cIixcbiAgXCJwbHVnaW5zW10uaGFuZGxlclwiLFxuICBcInBsdWdpbnNbXS5jb25maWd1cmVTZXJ2ZXJcIixcbiAgXCJwbHVnaW5zW10uc2hvdWxkVHJhbnNmb3JtQ2FjaGVkTW9kdWxlXCIsXG4gIFwicGx1Z2luc1tdLmdlbmVyYXRlQnVuZGxlXCIsXG4gIFwicGx1Z2luc1tdLnJlbmRlclN0YXJ0XCIsXG4gIFwicGx1Z2luc1tdLndyaXRlQnVuZGxlXCIsXG4gIFwicGx1Z2luc1tdLmhvdFVwZGF0ZVwiLFxuICBcInBsdWdpbnNbXS5jb25maWdSZXNvbHZlZFwiLFxuICBcInBsdWdpbnNbXS5jb25maWd1cmVQcmV2aWV3U2VydmVyXCIsXG4gIFwicGx1Z2luc1tdLmhhbmRsZUhvdFVwZGF0ZVwiLFxuICBcInBsdWdpbnNbXS5sb2FkXCIsXG4gIFwicGx1Z2luc1tdLmF1Z21lbnRDaHVua0hhc2hcIixcbiAgXCJwbHVnaW5zW10uY2xvc2VCdW5kbGVcIixcbiAgXCJwbHVnaW5zW10uZW50cnlGaWxlTmFtZXNcIixcbiAgXCJwbHVnaW5zW10uYXNzZXRGaWxlTmFtZXNcIixcbiAgXCJwbHVnaW5zW10uY2h1bmtGaWxlTmFtZXNcIixcbiAgXCJwbHVnaW5zW10uY3JlYXRlRW52aXJvbm1lbnRcIixcbiAgXCJwbHVnaW5zW10uc291cmNlbWFwSWdub3JlTGlzdFwiLFxuICBcInBsdWdpbnNbXS5hc3NldHNJbmNsdWRlXCIsXG5dKTtcblxuLy8gQ29tbW9uIG5vbi1zZXJpYWxpemFibGUgZnVuY3Rpb25zIGluIG91ciBwbHVnaW4ncyBvcHRpb25zXG5jb25zdCBQTFVHSU5fTk9OX1NFUklBTElaQUJMRV9GVU5DVElPTlMgPSBuZXcgU2V0KFtcbiAgXCJQYWdlXCIsXG4gIFwicHJvcHNcIixcbiAgXCJub3JtYWxpemVyXCIsXG4gIFwiUm9vdFwiLFxuICBcIkh0bWxcIixcbiAgXCJvbkV2ZW50XCIsXG4gIFwib25NZXRyaWNzXCIsXG4gIFwiYXV0b0Rpc2NvdmVyXCIsXG5dKTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSBSZWdFeHAgb2JqZWN0c1xuZnVuY3Rpb24gc2VyaWFsaXplUmVnRXhwKHJlZ2V4OiBSZWdFeHApIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2U6IHJlZ2V4LnNvdXJjZSxcbiAgICBmbGFnczogcmVnZXguZmxhZ3MsXG4gICAgX19pc1JlZ0V4cDogdHJ1ZSxcbiAgfTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRlc2VyaWFsaXplIFJlZ0V4cCBvYmplY3RzXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVSZWdFeHA8VD4ob2JqOiBUKTogRXh0cmFjdDxULCBTZXJpYWxpemFibGVSZWNvcmQ+IHtcbiAgaWYgKFxuICAgIG9iaiAmJlxuICAgIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiZcbiAgICBvYmogIT0gbnVsbCAmJlxuICAgIFwiX19pc1JlZ0V4cFwiIGluIG9iaiAmJlxuICAgIHR5cGVvZiBvYmpbXCJfX2lzUmVnRXhwXCJdID09PSBcImJvb2xlYW5cIiAmJlxuICAgIFwic291cmNlXCIgaW4gb2JqICYmXG4gICAgdHlwZW9mIG9ialtcInNvdXJjZVwiXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIFwiZmxhZ3NcIiBpbiBvYmogJiZcbiAgICB0eXBlb2Ygb2JqW1wiZmxhZ3NcIl0gPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAob2JqW1wic291cmNlXCJdLCBvYmpbXCJmbGFnc1wiXSkgYXMgdW5rbm93biBhcyBFeHRyYWN0PFxuICAgICAgVCxcbiAgICAgIFNlcmlhbGl6YWJsZVJlY29yZFxuICAgID47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBzZXJpYWxpemVkIE1hcCAoYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzKVxuICAgIGlmIChvYmoubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KG9ialswXSkgJiYgb2JqWzBdLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIG5ldyBNYXAob2JqKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlUmVjb3JkPjtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5tYXAoZGVzZXJpYWxpemVSZWdFeHApIGFzIHVua25vd24gYXMgRXh0cmFjdDxcbiAgICAgIFQsXG4gICAgICBTZXJpYWxpemFibGVSZWNvcmRcbiAgICA+O1xuICB9XG4gIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGRlc2VyaWFsaXplUmVnRXhwKHZhbHVlKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8XG4gICAgICAgIFQsXG4gICAgICAgIFNlcmlhbGl6YWJsZVJlY29yZFxuICAgICAgPltrZXlvZiBUXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlUmVjb3JkPjtcbiAgfVxuICByZXR1cm4gb2JqIGFzIHVua25vd24gYXMgRXh0cmFjdDxULCBTZXJpYWxpemFibGVSZWNvcmQ+O1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVjdXJzaXZlbHkgcHJvY2VzcyBvYmplY3RzIGZvciBzZXJpYWxpemF0aW9uXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZvclNlcmlhbGl6YXRpb248VD4oXG4gIG9iajogVFxuKTogRXh0cmFjdDxULCBTZXJpYWxpemFibGU+IHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBzZXJpYWxpemVSZWdFeHAob2JqKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlPjtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgLy8gQ29udmVydCBNYXAgdG8gYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzIGZvciBzZXJpYWxpemF0aW9uXG4gICAgcmV0dXJuIEFycmF5LmZyb20ob2JqLmVudHJpZXMoKSkgYXMgdW5rbm93biBhcyBFeHRyYWN0PFQsIFNlcmlhbGl6YWJsZT47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKHByb2Nlc3NGb3JTZXJpYWxpemF0aW9uKSBhcyB1bmtub3duIGFzIEV4dHJhY3Q8XG4gICAgICBULFxuICAgICAgU2VyaWFsaXphYmxlXG4gICAgPjtcbiAgfVxuICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBwcm9jZXNzRm9yU2VyaWFsaXphdGlvbih2YWx1ZSkgYXMgdW5rbm93biBhcyBFeHRyYWN0PFxuICAgICAgICBULFxuICAgICAgICBTZXJpYWxpemFibGVcbiAgICAgID5ba2V5b2YgVF07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBFeHRyYWN0PFQsIFNlcmlhbGl6YWJsZT47XG4gIH1cbiAgcmV0dXJuIG9iaiBhcyB1bmtub3duIGFzIEV4dHJhY3Q8VCwgU2VyaWFsaXphYmxlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlc29sdmVkQ29uZmlnPFQgZXh0ZW5kcyBSZXNvbHZlZENvbmZpZyA9IFJlc29sdmVkQ29uZmlnPihcbiAgY29uZmlnOiBULFxuICBrbm93bk5vblNlcmlhbGl6YWJsZUZ1bmN0aW9uczogU2V0PHN0cmluZz4gPSBWSVRFX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pIHtcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzOiBfZ2V0U29ydGVkUGx1Z2luSG9va3MsXG4gICAgZ2V0U29ydGVkUGx1Z2luczogX2dldFNvcnRlZFBsdWdpbnMsXG4gICAgYXNzZXRzSW5jbHVkZTogX2Fzc2V0c0luY2x1ZGUsXG4gICAgZW52aXJvbm1lbnRzOiBfZW52aXJvbm1lbnRzLFxuICAgIC8vIGV4dHJhY3Qga25vd24gdml0ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgLi4uaGFuZGxlck9wdGlvbnNcbiAgfSA9IGNvbmZpZztcblxuICAvLyBQcmVzZXJ2ZSBhIG1pbmltYWwgZW52aXJvbm1lbnRzIHN0cnVjdHVyZSBmb3IgQ1NTIHByb2Nlc3NpbmdcbiAgY29uc3QgbWluaW1hbEVudmlyb25tZW50cyA9IF9lbnZpcm9ubWVudHMgPyB7XG4gICAgY2xpZW50OiB7XG4gICAgICByZXNvbHZlOiB7IGNvbmRpdGlvbnM6IFsnYnJvd3NlcicsICdtb2R1bGUnLCAnaW1wb3J0J10gfSxcbiAgICAgIGNvbnN1bWVyOiAnY2xpZW50JyxcbiAgICAgIG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9LFxuICAgICAgZGV2OiB7IG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9IH0sXG4gICAgICBidWlsZDogeyBvdXREaXI6ICdkaXN0JyB9LFxuICAgIH0sXG4gICAgc3NyOiB7XG4gICAgICByZXNvbHZlOiB7IGNvbmRpdGlvbnM6IFsnbm9kZScsICdpbXBvcnQnXSB9LFxuICAgICAgY29uc3VtZXI6ICdzZXJ2ZXInLCBcbiAgICAgIG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9LFxuICAgICAgZGV2OiB7IG9wdGltaXplRGVwczogeyBpbmNsdWRlOiBbXSB9IH0sXG4gICAgICBidWlsZDogeyBvdXREaXI6ICdkaXN0JyB9LFxuICAgIH0sXG4gIH0gOiB1bmRlZmluZWQ7XG5cbiAgLy8gQ2xlYW4gdGhlIG9iamVjdCB0byByZW1vdmUgbm9uLXNlcmlhbGl6YWJsZSBwcm9wZXJ0aWVzIGFuZCBwcm9jZXNzIFJlZ0V4cCBvYmplY3RzXG4gIGNvbnN0IGNsZWFuZWQgPSBjbGVhbk9iamVjdChoYW5kbGVyT3B0aW9ucywga25vd25Ob25TZXJpYWxpemFibGVGdW5jdGlvbnMpIGFzIGFueTtcbiAgXG4gIC8vIEFkZCBiYWNrIHRoZSBtaW5pbWFsIGVudmlyb25tZW50cyBpZiB0aGV5IGV4aXN0ZWRcbiAgaWYgKG1pbmltYWxFbnZpcm9ubWVudHMpIHtcbiAgICBjbGVhbmVkLmVudmlyb25tZW50cyA9IG1pbmltYWxFbnZpcm9ubWVudHM7XG4gIH1cbiAgXG4gIHJldHVybiBwcm9jZXNzRm9yU2VyaWFsaXphdGlvbihjbGVhbmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlc29sdmVkVXNlckNvbmZpZzxUIGV4dGVuZHMgUmVzb2x2ZWRVc2VyQ29uZmlnPihcbiAgY29uZmlnOiBULFxuICBrbm93bk5vblNlcmlhbGl6YWJsZUZ1bmN0aW9uczogU2V0PHN0cmluZz4gPSBWSVRFX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pIHtcbiAgY29uc3Qge1xuICAgIGFzc2V0c0luY2x1ZGU6IF9hc3NldHNJbmNsdWRlLFxuICAgIC8vIGV4dHJhY3Qga25vd24gdml0ZSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgLi4uaGFuZGxlck9wdGlvbnNcbiAgfSA9IGNvbmZpZztcblxuICAvLyBDbGVhbiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBub24tc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgYW5kIHByb2Nlc3MgUmVnRXhwIG9iamVjdHNcbiAgcmV0dXJuIHByb2Nlc3NGb3JTZXJpYWxpemF0aW9uKFxuICAgIGNsZWFuT2JqZWN0KGhhbmRsZXJPcHRpb25zLCBrbm93bk5vblNlcmlhbGl6YWJsZUZ1bmN0aW9ucylcbiAgKTtcbn1cblxuLy8gRm9yIFZpdGUncyBjb25maWdcbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkRGV2U2VydmVyQ29uZmlnID0gPFQgZXh0ZW5kcyBWaXRlRGV2U2VydmVyW1wiY29uZmlnXCJdPihcbiAgY29uZmlnOiBULFxuICBjdXN0b21Ob25TZXJpYWxpemFibGVGdW5jdGlvbnM6IFNldDxzdHJpbmc+ID0gUExVR0lOX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzOiBfZ2V0U29ydGVkUGx1Z2luSG9va3MsXG4gICAgZ2V0U29ydGVkUGx1Z2luczogX2dldFNvcnRlZFBsdWdpbnMsXG4gICAgYXNzZXRzSW5jbHVkZTogX2Fzc2V0c0luY2x1ZGUsXG4gICAgYnVpbGQ6IF9idWlsZCxcbiAgICAuLi5oYW5kbGVyT3B0aW9uc1xuICB9ID0gY29uZmlnO1xuICBcbiAgcmV0dXJuIHByb2Nlc3NGb3JTZXJpYWxpemF0aW9uKFxuICAgIGNsZWFuT2JqZWN0KGhhbmRsZXJPcHRpb25zLCBjdXN0b21Ob25TZXJpYWxpemFibGVGdW5jdGlvbnMpXG4gICk7XG59O1xuXG5cblxuLy8gRm9yIHlvdXIgb3duIG9wdGlvbnMgKGlmIHlvdSBuZWVkIGN1c3RvbSBub24tc2VyaWFsaXphYmxlIGZ1bmN0aW9ucylcbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkT3B0aW9ucyA9IDxUIGV4dGVuZHMgUmVzb2x2ZWRVc2VyT3B0aW9ucz4oXG4gIHVzZXJPcHRpb25zOiBULFxuICBhdXRvRGlzY292ZXJlZEZpbGVzOiBBdXRvRGlzY292ZXJlZEZpbGVzLFxuICBjdXN0b21Ob25TZXJpYWxpemFibGVGdW5jdGlvbnM6IFNldDxzdHJpbmc+ID0gUExVR0lOX05PTl9TRVJJQUxJWkFCTEVfRlVOQ1RJT05TXG4pOiBTZXJpYWxpemVkVXNlck9wdGlvbnMgPT4ge1xuICBjb25zdCB7XG4gICAgUGFnZTogX1BhZ2UsXG4gICAgcHJvcHM6IF9wcm9wcyxcbiAgICBub3JtYWxpemVyOiBfbm9ybWFsaXplcixcbiAgICBSb290OiBfUm9vdCxcbiAgICBIdG1sOiBfSHRtbCxcbiAgICBvbkV2ZW50OiBfb25FdmVudCxcbiAgICBvbk1ldHJpY3M6IF9vbk1ldHJpY3MsXG4gICAgYnVpbGQ6IF9idWlsZCxcbiAgICBsb2FkZXI6IF9sb2FkZXIsXG4gICAgYXV0b0Rpc2NvdmVyOiBhdXRvRGlzY292ZXIsXG4gICAgcHJvcHNFeHBvcnROYW1lOiBwcm9wc0V4cG9ydE5hbWUsXG4gICAgcGFnZUV4cG9ydE5hbWU6IHBhZ2VFeHBvcnROYW1lLFxuICAgIHNlcnZlclBpcGVhYmxlU3RyZWFtT3B0aW9uczogc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIGNsaWVudFBpcGVhYmxlU3RyZWFtT3B0aW9uczogY2xpZW50UGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIC4uLmhhbmRsZXJPcHRpb25zXG4gIH0gPSB1c2VyT3B0aW9ucztcbiAgY29uc3Qge1xuICAgIGVudHJ5RmlsZTogX2VudHJ5RmlsZSxcbiAgICBjaHVua0ZpbGU6IF9jaHVua0ZpbGUsXG4gICAgYXNzZXRGaWxlOiBfYXNzZXRGaWxlLFxuICAgIHBhZ2VzOiBfcGFnZXMsXG4gICAgLi4uYnVpbGRPcHRpb25zXG4gIH0gPSBfYnVpbGQgPz8ge307XG4gIC8vIFByZXNlcnZlIHRoZSBidWlsZCBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAgLy8gUmVzcGVjdCB1c2VyIG9wdGlvbnMgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIGRlZmF1bHRzXG4gIGNvbnN0IHNlcmlhbGl6ZWRCdWlsZCA9IHtcbiAgICAuLi5ERUZBVUxUX0NPTkZJRy5CVUlMRCwgIC8vIFN0YXJ0IHdpdGggZGVmYXVsdHNcbiAgICAuLi5idWlsZE9wdGlvbnMsICAgICAgICAgIC8vIE92ZXJyaWRlIHdpdGggdXNlciBvcHRpb25zXG4gICAgcGFnZXM6IGF1dG9EaXNjb3ZlcmVkRmlsZXNcbiAgICAgID8gQXJyYXkuZnJvbShhdXRvRGlzY292ZXJlZEZpbGVzLnVybE1hcC5rZXlzKCkpXG4gICAgICA6IFtdLFxuICB9O1xuICBcbiAgY29uc3Qge1xuICAgIGlzU2VydmVyRnVuY3Rpb25Db2RlOiBfaXNTZXJ2ZXJGdW5jdGlvbkNvZGUsXG4gICAgaXNDbGllbnRDb21wb25lbnRDb2RlOiBfaXNDbGllbnRDb21wb25lbnRDb2RlLFxuICAgIGlzQ2xpZW50Q29tcG9uZW50QnlDb2RlOiBfaXNDbGllbnRDb21wb25lbnRCeUNvZGUsXG4gICAgaXNDbGllbnRDb21wb25lbnRCeU5hbWU6IF9pc0NsaWVudENvbXBvbmVudEJ5TmFtZSxcbiAgICBnZXREaXJlY3RpdmVUeXBlOiBfZ2V0RGlyZWN0aXZlVHlwZSxcbiAgICBhbGxvd2VkRGlyZWN0aXZlczogYWxsb3dlZERpcmVjdGl2ZXMsXG4gICAgLi4ubG9hZGVyT3B0aW9uc1xuICB9ID0gX2xvYWRlciA/PyB7fTtcbiAgY29uc3Qge1xuICAgIG1vZHVsZVBhdHRlcm46IF9tb2R1bGVQYXR0ZXJuLFxuICAgIGNzc1BhdHRlcm46IF9jc3NQYXR0ZXJuLFxuICAgIGpzb25QYXR0ZXJuOiBfanNvblBhdHRlcm4sXG4gICAgY2xpZW50UGF0dGVybjogX2NsaWVudFBhdHRlcm4sXG4gICAgcHJvcHNQYXR0ZXJuOiBfcHJvcHNQYXR0ZXJuLFxuICAgIHBhZ2VQYXR0ZXJuOiBfcGFnZVBhdHRlcm4sXG4gICAgaHRtbFBhdHRlcm46IF9odG1sUGF0dGVybixcbiAgICByc2NQYXR0ZXJuOiBfcnNjUGF0dGVybixcbiAgICBzZXJ2ZXJQYXR0ZXJuOiBfc2VydmVyUGF0dGVybixcbiAgICBjc3NNb2R1bGVQYXR0ZXJuOiBfY3NzTW9kdWxlUGF0dGVybixcbiAgICB2ZW5kb3JQYXR0ZXJuOiBfdmVuZG9yUGF0dGVybixcbiAgICBub2RlUGF0dGVybjogX25vZGVQYXR0ZXJuLFxuICAgIGRvdFBhdHRlcm46IF9kb3RQYXR0ZXJuLFxuICAgIHZpcnR1YWxQYXR0ZXJuOiBfdmlydHVhbFBhdHRlcm4sXG4gICAgLi4uc2VyaWFsaXplZEF1dG9EaXNjb3ZlclxuICB9ID0gYXV0b0Rpc2NvdmVyO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgUGFnZTogdHlwZW9mIF9QYWdlID09PSAnc3RyaW5nJyA/IF9QYWdlIDogdW5kZWZpbmVkLFxuICAgIEh0bWw6IHR5cGVvZiBfSHRtbCA9PT0gJ3N0cmluZycgPyBfSHRtbCA6IHVuZGVmaW5lZCxcbiAgICBSb290OiB0eXBlb2YgX1Jvb3QgPT09ICdzdHJpbmcnID8gX1Jvb3QgOiB1bmRlZmluZWQsXG4gICAgbm9ybWFsaXplcjogdW5kZWZpbmVkLFxuICAgIG9uRXZlbnQ6IHVuZGVmaW5lZCxcbiAgICBvbk1ldHJpY3M6IHVuZGVmaW5lZCxcbiAgICBwcm9wc0V4cG9ydE5hbWU6IHByb3BzRXhwb3J0TmFtZSxcbiAgICBwYWdlRXhwb3J0TmFtZTogcGFnZUV4cG9ydE5hbWUsXG4gICAgYnVpbGQ6IHNlcmlhbGl6ZWRCdWlsZCxcbiAgICBsb2FkZXI6IHtcbiAgICAgIGRpcmVjdGl2ZVBhdHRlcm46IHtcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgdmFsaWRhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi5hbGxvd2VkRGlyZWN0aXZlcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi5sb2FkZXJPcHRpb25zLFxuICAgIH0sXG4gICAgYXV0b0Rpc2NvdmVyOiB7XG4gICAgICBtb2R1bGVQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX21vZHVsZVBhdHRlcm4pLFxuICAgICAgc2VydmVyUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9zZXJ2ZXJQYXR0ZXJuKSxcbiAgICAgIGNsaWVudFBhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfY2xpZW50UGF0dGVybiksXG4gICAgICBwYWdlUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9wYWdlUGF0dGVybiksXG4gICAgICBwcm9wc1BhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfcHJvcHNQYXR0ZXJuKSxcbiAgICAgIGNzc1BhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfY3NzUGF0dGVybiksXG4gICAgICBqc29uUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9qc29uUGF0dGVybiksXG4gICAgICBodG1sUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF9odG1sUGF0dGVybiksXG4gICAgICBjc3NNb2R1bGVQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX2Nzc01vZHVsZVBhdHRlcm4pLFxuICAgICAgdmVuZG9yUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF92ZW5kb3JQYXR0ZXJuKSxcbiAgICAgIG5vZGVQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX25vZGVQYXR0ZXJuKSxcbiAgICAgIGRvdFBhdHRlcm46IHNlcmlhbGl6ZVJlZ0V4cChfZG90UGF0dGVybiksXG4gICAgICB2aXJ0dWFsUGF0dGVybjogc2VyaWFsaXplUmVnRXhwKF92aXJ0dWFsUGF0dGVybiksXG4gICAgICByc2NQYXR0ZXJuOiBzZXJpYWxpemVSZWdFeHAoX3JzY1BhdHRlcm4pLFxuICAgICAgLi4uc2VyaWFsaXplZEF1dG9EaXNjb3ZlcixcbiAgICB9LFxuICAgIHNlcnZlclBpcGVhYmxlU3RyZWFtT3B0aW9uczogc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgIGNsaWVudFBpcGVhYmxlU3RyZWFtT3B0aW9uczogY2xpZW50UGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICB9IGFzIGNvbnN0XG5cbiAgLy8gQ2xlYW4gdGhlIG9iamVjdCB0byByZW1vdmUgbm9uLXNlcmlhbGl6YWJsZSBwcm9wZXJ0aWVzIGFuZCBwcm9jZXNzIFJlZ0V4cCBvYmplY3RzXG4gIGNvbnN0IGNsZWFuZWRSZXN1bHQgPSBjbGVhbk9iamVjdChyZXN1bHQsIGN1c3RvbU5vblNlcmlhbGl6YWJsZUZ1bmN0aW9ucyk7XG4gIGNvbnN0IGZpbmFsUmVzdWx0ID0gcHJvY2Vzc0ZvclNlcmlhbGl6YXRpb24oY2xlYW5lZFJlc3VsdCk7XG4gIHJldHVybiBmaW5hbFJlc3VsdCBhcyBuZXZlclxufTsiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFhQSxNQUFNLCtCQUFBLHVCQUFzQyxHQUFJLENBQUE7QUFBQSxFQUM5Qyxh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