UNPKG

vite-plugin-react-server

Version:
171 lines (168 loc) 24.7 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { PassThrough } from 'node:stream'; import { createMessageChannels, createTransferList } from './createMessageChannels.js'; import { DEFAULT_CONFIG } from '../config/defaults.js'; import { join } from 'node:path'; const handleRscStream = function _handleWorkerRscStream({ options }) { const requestId = options.id ?? `${options.route}-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`; const { dataPort1, dataPort2, controlPort1, controlPort2 } = createMessageChannels(); const rscStream = new PassThrough({ objectMode: false }); const route = options.route; const worker = options.rscWorker || options.worker; if (!worker) { throw new Error("No worker provided"); } let controlEndedReceived = false; const cleanupPorts = () => { try { dataPort1.removeListener("message", dataMessageHandler); controlPort1.removeListener("message", controlMessageHandler); dataPort1.close(); controlPort1.close(); } catch { } }; const controlMessageHandler = (message) => { if (options.verbose) { options.logger?.info( `[client] Received control message: ${message.type}` ); } switch (message.type) { case "RSC_RENDER_START": if (options.verbose) { options.logger?.info( `[client] RSC render started for ${message.id}` ); } break; case "RSC_END": if (options.verbose) { options.logger?.info(`[client] RSC render ended for ${message.id}`); } controlEndedReceived = true; rscStream.end(); break; case "ERROR": options.logger?.error( `[client] RSC render error for ${message.id}: ${message.error?.message || "Unknown error"}`, { error: message.error } ); break; default: if (options.verbose) { options.logger?.info( `[client] Unhandled control message: ${message.type}` ); } } }; controlPort1.on("message", controlMessageHandler); const dataMessageHandler = (data) => { if (data === null) { if (options.verbose) { options.logger?.info(`[client] Received end signal via dataPort - completing stream`); } rscStream.end(); } else if (data && data.type === "ERROR") { if (options.verbose) { options.logger?.error( `[client] RSC stream error via dataPort: ${data.error}` ); } rscStream.destroy(new Error(data.error)); } else if (Buffer.isBuffer(data) || data instanceof Uint8Array) { if (options.verbose) { options.logger?.info( `[client] Received RSC chunk via dataPort: ${data.length} bytes` ); } rscStream.write(data); } else { if (options.verbose) { options.logger?.warn( `[client] Unknown data format via dataPort: ${typeof data}` ); } } }; dataPort1.on("message", dataMessageHandler); worker.postMessage({ type: "INIT", id: requestId, dataPort: dataPort2, controlPort: controlPort2, options: { route, url: options.url || "", projectRoot: options.projectRoot || process.cwd(), moduleBasePath: options.moduleBasePath || DEFAULT_CONFIG.MODULE_BASE_PATH, moduleBaseURL: options.moduleBaseURL || DEFAULT_CONFIG.MODULE_BASE_URL, moduleRootPath: options.moduleRootPath || join( options.projectRoot, options.build.outDir, options.build.server, options.moduleBasePath === "" ? "/" : "" ), cssFiles: options.cssFiles || /* @__PURE__ */ new Map(), globalCss: options.globalCss || /* @__PURE__ */ new Map(), manifest: options.manifest || {}, serverPipeableStreamOptions: options.serverPipeableStreamOptions || {}, clientPipeableStreamOptions: options.clientPipeableStreamOptions || {}, verbose: options.verbose, panicThreshold: options.panicThreshold, pagePath: options.pagePath, propsPath: options.propsPath, rootPath: options.rootPath, htmlPath: options.htmlPath, pageExportName: options.pageExportName, propsExportName: options.propsExportName, rootExportName: options.rootExportName, htmlExportName: options.htmlExportName, moduleBase: options.moduleBase, publicOrigin: options.publicOrigin, rscTimeout: options.rscTimeout, htmlTimeout: options.htmlTimeout, fileWriteTimeout: options.fileWriteTimeout, workerShutdownTimeout: options.workerShutdownTimeout, rscWorkerPath: options.rscWorkerPath, htmlWorkerPath: options.htmlWorkerPath, css: options.css, build: options.build } }, createTransferList(dataPort2, controlPort2)); return new ReadableStream({ start(controller) { rscStream.on("data", (chunk) => { controller.enqueue(new Uint8Array(chunk)); }); rscStream.on("end", () => { controller.close(); if (controlEndedReceived) { cleanupPorts(); } else { setImmediate(() => { if (controlEndedReceived) { cleanupPorts(); } else { setImmediate(cleanupPorts); } }); } }); rscStream.on("error", (error) => { controller.error(error); }); }, cancel() { cleanupPorts(); rscStream.destroy(); } }); }; export { handleRscStream }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlUnNjU3RyZWFtLmNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3N0cmVhbS9oYW5kbGVSc2NTdHJlYW0uY2xpZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSGFuZGxlUnNjU3RyZWFtRm4gfSBmcm9tIFwiLi9oYW5kbGVSc2NTdHJlYW0udHlwZXMuanNcIjtcbmltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ2hhbm5lbHMsIGNyZWF0ZVRyYW5zZmVyTGlzdCB9IGZyb20gXCIuL2NyZWF0ZU1lc3NhZ2VDaGFubmVscy5qc1wiO1xuXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJRyB9IGZyb20gXCIuLi9jb25maWcvZGVmYXVsdHMuanNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbi8qKlxuICogQ2xpZW50LXNpZGUgUlNDIHN0cmVhbSBoYW5kbGVyIHVzaW5nIHVuaWZpZWQgc3RyZWFtIG1hbmFnZW1lbnRcbiAqXG4gKiBIYW5kbGUgPSBjYWxsaW5nIGNyZWF0ZVJzY1N0cmVhbSBhbmQgaGFuZGxpbmcgZXJyb3JzXG4gKiAtIHBhbmljVGhyZXNob2xkXG4gKiAtIHZlcmJvc2UgbG9nZ2luZ1xuICogLSBjYWxsaW5nIGV2ZW50IGhhbmRsZXJzXG4gKiAtIHBhc3NpbmcgdGhlIGNvcnJlY3Qgb3B0aW9ucyB0byBjcmVhdGVSc2NTdHJlYW1cbiAqIC0gdW5pZmllZCBzdHJlYW0gbWFuYWdlbWVudCB3aXRoIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAqXG4gKiBAcGFyYW0gd29ya2VyIC0gVGhlIHdvcmtlciB0aHJlYWRcbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIFJTQyByZW5kZXIgbWVzc2FnZVxuICogQHJldHVybnMgQSBSZWFkYWJsZVN0cmVhbSB0aGF0IHlpZWxkcyBSU0MgY2h1bmtzXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVSc2NTdHJlYW06IEhhbmRsZVJzY1N0cmVhbUZuPFwiY2xpZW50XCI+ID1cbiAgZnVuY3Rpb24gX2hhbmRsZVdvcmtlclJzY1N0cmVhbSh7IG9wdGlvbnMgfSkge1xuICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIHJlcXVlc3QgaWQgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggY29uY3VycmVudCByZXF1ZXN0c1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9XG4gICAgICBvcHRpb25zLmlkID8/XG4gICAgICBgJHtvcHRpb25zLnJvdXRlfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKVxuICAgICAgICAudG9TdHJpbmcoMzYpXG4gICAgICAgIC5zdWJzdHJpbmcoMiwgMTEpfWA7XG5cbiAgICAvLyBDcmVhdGUgTWVzc2FnZUNoYW5uZWxzIGZvciB0d28tcG9ydCBjb21tdW5pY2F0aW9uXG4gICAgY29uc3QgeyBkYXRhUG9ydDEsIGRhdGFQb3J0MiwgY29udHJvbFBvcnQxLCBjb250cm9sUG9ydDIgfSA9IGNyZWF0ZU1lc3NhZ2VDaGFubmVscygpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhIFBhc3NUaHJvdWdoIHN0cmVhbSB0aGF0IHByZXNlcnZlcyBVaW50OEFycmF5IGRhdGEgd2l0aG91dCBtdXRhdGlvblxuICAgIGNvbnN0IHJzY1N0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IGZhbHNlIH0pO1xuICAgIGNvbnN0IHJvdXRlID0gb3B0aW9ucy5yb3V0ZTtcblxuICAgIGNvbnN0IHdvcmtlciA9IG9wdGlvbnMucnNjV29ya2VyIHx8IG9wdGlvbnMud29ya2VyO1xuICAgIGlmICghd29ya2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB3b3JrZXIgcHJvdmlkZWRcIik7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgd2hldGhlciB0aGUgd29ya2VyIGhhcyBzaWduYWxlZCB0aGUgZW5kIG9mIGl0cyBjb250cm9sLW1lc3NhZ2VcbiAgICAvLyBzdHJlYW0gc28gY2xlYW51cCBjYW4gYmUgZGVmZXJyZWQgdW50aWwgdGhlbi4gVGhpcyBwcmV2ZW50cyB0aGUgZGF0YVxuICAgIC8vIHN0cmVhbSdzIGBudWxsYCBlbmQtc2lnbmFsIGZyb20gcmFjaW5nIHRoZSB3b3JrZXIncyBjb250cm9sLXBvcnRcbiAgICAvLyBtZXNzYWdlcyAoZS5nLiBhbiBFUlJPUiBwb3N0ZWQganVzdCBiZWZvcmUgUlNDX0VORCkg4oCUIGNsb3NpbmdcbiAgICAvLyBjb250cm9sUG9ydDEgdG9vIGVhcmx5IHdvdWxkIHNpbGVudGx5IGRyb3AgdGhvc2UgbWVzc2FnZXMsIHdoaWNoIGlzXG4gICAgLy8gZXhhY3RseSB0aGUgY3Jvc3MtY29uZGl0aW9uIGxlYWsgYmQtNnBpIHdhcyBodW50aW5nLlxuICAgIGxldCBjb250cm9sRW5kZWRSZWNlaXZlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNsZWFudXBQb3J0cyA9ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGFQb3J0MS5yZW1vdmVMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZGF0YU1lc3NhZ2VIYW5kbGVyKTtcbiAgICAgICAgY29udHJvbFBvcnQxLnJlbW92ZUxpc3RlbmVyKFwibWVzc2FnZVwiLCBjb250cm9sTWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICBkYXRhUG9ydDEuY2xvc2UoKTtcbiAgICAgICAgY29udHJvbFBvcnQxLmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNldCB1cCBjb250cm9sIG1lc3NhZ2UgaGFuZGxlcnNcbiAgICBjb25zdCBjb250cm9sTWVzc2FnZUhhbmRsZXIgPSAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgIG9wdGlvbnMubG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbY2xpZW50XSBSZWNlaXZlZCBjb250cm9sIG1lc3NhZ2U6ICR7bWVzc2FnZS50eXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIlJTQ19SRU5ERVJfU1RBUlRcIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgYFtjbGllbnRdIFJTQyByZW5kZXIgc3RhcnRlZCBmb3IgJHttZXNzYWdlLmlkfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUlNDX0VORFwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubG9nZ2VyPy5pbmZvKGBbY2xpZW50XSBSU0MgcmVuZGVyIGVuZGVkIGZvciAke21lc3NhZ2UuaWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vdyBpdCdzIHNhZmUgdG8gZW5kIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb250cm9sRW5kZWRSZWNlaXZlZCA9IHRydWU7XG4gICAgICAgICAgcnNjU3RyZWFtLmVuZCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRVJST1JcIjpcbiAgICAgICAgICAvLyBBbHdheXMgbG9nOiB0aGlzIGlzIGFuIFJTQyByZW5kZXIgZXJyb3IgZnJvbSB0aGUgd29ya2VyLiBXaXRob3V0XG4gICAgICAgICAgLy8gdGhpcyBsb2cgdGhlIGZhaWx1cmUgc3VyZmFjZXMgb25seSBhcyBhbiBpbi1iYW5kIFJTQyBlcnJvciBmcmFtZVxuICAgICAgICAgIC8vIG9uIHRoZSBjbGllbnQsIHdpdGggbm90aGluZyBvbiB0aGUgZGV2IGNvbnNvbGUuXG4gICAgICAgICAgb3B0aW9ucy5sb2dnZXI/LmVycm9yKFxuICAgICAgICAgICAgYFtjbGllbnRdIFJTQyByZW5kZXIgZXJyb3IgZm9yICR7bWVzc2FnZS5pZH06ICR7XG4gICAgICAgICAgICAgIG1lc3NhZ2UuZXJyb3I/Lm1lc3NhZ2UgfHwgXCJVbmtub3duIGVycm9yXCJcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgeyBlcnJvcjogbWVzc2FnZS5lcnJvciB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgYFtjbGllbnRdIFVuaGFuZGxlZCBjb250cm9sIG1lc3NhZ2U6ICR7bWVzc2FnZS50eXBlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb250cm9sUG9ydDEub24oXCJtZXNzYWdlXCIsIGNvbnRyb2xNZXNzYWdlSGFuZGxlcik7XG5cbiAgICAvLyBTZXQgdXAgZGF0YSBtZXNzYWdlIGhhbmRsZXJzIC0gcGFzcyBVaW50OEFycmF5IGRhdGEgd2l0aG91dCBtdXRhdGlvblxuICAgIGNvbnN0IGRhdGFNZXNzYWdlSGFuZGxlciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgIC8vIEVuZCBvZiBkYXRhIHN0cmVhbSBzaWduYWwgLSBSZWFjdCBTZXJ2ZXIgQ29tcG9uZW50IHJlbmRlcmluZyBpcyBjb21wbGV0ZVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgb3B0aW9ucy5sb2dnZXI/LmluZm8oYFtjbGllbnRdIFJlY2VpdmVkIGVuZCBzaWduYWwgdmlhIGRhdGFQb3J0IC0gY29tcGxldGluZyBzdHJlYW1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaWduYWwgdGhhdCB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlIHNvIFJlYWN0IGNhbiBmaW5pc2ggY29uc3VtaW5nXG4gICAgICAgIHJzY1N0cmVhbS5lbmQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLnR5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgLy8gU3RyZWFtIGVycm9yIHZpYSBkYXRhIHBvcnRcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIG9wdGlvbnMubG9nZ2VyPy5lcnJvcihcbiAgICAgICAgICAgIGBbY2xpZW50XSBSU0Mgc3RyZWFtIGVycm9yIHZpYSBkYXRhUG9ydDogJHtkYXRhLmVycm9yfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJzY1N0cmVhbS5kZXN0cm95KG5ldyBFcnJvcihkYXRhLmVycm9yKSk7XG4gICAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAvLyBSU0MgY2h1bmsgZGF0YSAtIHBhc3MgdGhyb3VnaCB3aXRob3V0IG11dGF0aW9uXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBvcHRpb25zLmxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbY2xpZW50XSBSZWNlaXZlZCBSU0MgY2h1bmsgdmlhIGRhdGFQb3J0OiAke2RhdGEubGVuZ3RofSBieXRlc2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIHRoZSBVaW50OEFycmF5IGRpcmVjdGx5IHdpdGhvdXQgY29udmVyc2lvbiAtIGtlZXAgaXQgYXMgcmF3IGJ5dGVzXG4gICAgICAgIHJzY1N0cmVhbS53cml0ZShkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVua25vd24gZGF0YSBmb3JtYXQgLSBsb2cgYW5kIGlnbm9yZVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgb3B0aW9ucy5sb2dnZXI/Lndhcm4oXG4gICAgICAgICAgICBgW2NsaWVudF0gVW5rbm93biBkYXRhIGZvcm1hdCB2aWEgZGF0YVBvcnQ6ICR7dHlwZW9mIGRhdGF9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGF0YVBvcnQxLm9uKFwibWVzc2FnZVwiLCBkYXRhTWVzc2FnZUhhbmRsZXIpO1xuXG4gICAgLy8gU2VuZCB0aGUgcmVuZGVyIG1lc3NhZ2UgdG8gdGhlIHdvcmtlciB3aXRoIHBvcnRzXG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiSU5JVFwiLFxuICAgICAgaWQ6IHJlcXVlc3RJZCxcbiAgICAgIGRhdGFQb3J0OiBkYXRhUG9ydDIsXG4gICAgICBjb250cm9sUG9ydDogY29udHJvbFBvcnQyLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgIHVybDogb3B0aW9ucy51cmwgfHwgXCJcIixcbiAgICAgICAgcHJvamVjdFJvb3Q6IG9wdGlvbnMucHJvamVjdFJvb3QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgbW9kdWxlQmFzZVBhdGg6XG4gICAgICAgICAgb3B0aW9ucy5tb2R1bGVCYXNlUGF0aCB8fCBERUZBVUxUX0NPTkZJRy5NT0RVTEVfQkFTRV9QQVRILFxuICAgICAgICBtb2R1bGVCYXNlVVJMOiBvcHRpb25zLm1vZHVsZUJhc2VVUkwgfHwgREVGQVVMVF9DT05GSUcuTU9EVUxFX0JBU0VfVVJMLFxuICAgICAgICBtb2R1bGVSb290UGF0aDpcbiAgICAgICAgICBvcHRpb25zLm1vZHVsZVJvb3RQYXRoIHx8XG4gICAgICAgICAgam9pbihcbiAgICAgICAgICAgIG9wdGlvbnMucHJvamVjdFJvb3QsXG4gICAgICAgICAgICBvcHRpb25zLmJ1aWxkLm91dERpcixcbiAgICAgICAgICAgIG9wdGlvbnMuYnVpbGQuc2VydmVyLFxuICAgICAgICAgICAgb3B0aW9ucy5tb2R1bGVCYXNlUGF0aCA9PT0gXCJcIiA/IFwiL1wiIDogXCJcIlxuICAgICAgICAgICksXG4gICAgICAgIGNzc0ZpbGVzOiBvcHRpb25zLmNzc0ZpbGVzIHx8IG5ldyBNYXAoKSxcbiAgICAgICAgZ2xvYmFsQ3NzOiBvcHRpb25zLmdsb2JhbENzcyB8fCBuZXcgTWFwKCksXG4gICAgICAgIG1hbmlmZXN0OiBvcHRpb25zLm1hbmlmZXN0IHx8IHt9LFxuICAgICAgICBzZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnM6IG9wdGlvbnMuc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zIHx8IHt9LFxuICAgICAgICBjbGllbnRQaXBlYWJsZVN0cmVhbU9wdGlvbnM6IG9wdGlvbnMuY2xpZW50UGlwZWFibGVTdHJlYW1PcHRpb25zIHx8IHt9LFxuICAgICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXG4gICAgICAgIHBhbmljVGhyZXNob2xkOiBvcHRpb25zLnBhbmljVGhyZXNob2xkLFxuICAgICAgICBwYWdlUGF0aDogb3B0aW9ucy5wYWdlUGF0aCxcbiAgICAgICAgcHJvcHNQYXRoOiBvcHRpb25zLnByb3BzUGF0aCxcbiAgICAgICAgcm9vdFBhdGg6IG9wdGlvbnMucm9vdFBhdGgsXG4gICAgICAgIGh0bWxQYXRoOiBvcHRpb25zLmh0bWxQYXRoLFxuICAgICAgICBwYWdlRXhwb3J0TmFtZTogb3B0aW9ucy5wYWdlRXhwb3J0TmFtZSxcbiAgICAgICAgcHJvcHNFeHBvcnROYW1lOiBvcHRpb25zLnByb3BzRXhwb3J0TmFtZSxcbiAgICAgICAgcm9vdEV4cG9ydE5hbWU6IG9wdGlvbnMucm9vdEV4cG9ydE5hbWUsXG4gICAgICAgIGh0bWxFeHBvcnROYW1lOiBvcHRpb25zLmh0bWxFeHBvcnROYW1lLFxuICAgICAgICBtb2R1bGVCYXNlOiBvcHRpb25zLm1vZHVsZUJhc2UsXG4gICAgICAgIHB1YmxpY09yaWdpbjogb3B0aW9ucy5wdWJsaWNPcmlnaW4sXG4gICAgICAgIHJzY1RpbWVvdXQ6IG9wdGlvbnMucnNjVGltZW91dCxcbiAgICAgICAgaHRtbFRpbWVvdXQ6IG9wdGlvbnMuaHRtbFRpbWVvdXQsXG4gICAgICAgIGZpbGVXcml0ZVRpbWVvdXQ6IG9wdGlvbnMuZmlsZVdyaXRlVGltZW91dCxcbiAgICAgICAgd29ya2VyU2h1dGRvd25UaW1lb3V0OiBvcHRpb25zLndvcmtlclNodXRkb3duVGltZW91dCxcbiAgICAgICAgcnNjV29ya2VyUGF0aDogb3B0aW9ucy5yc2NXb3JrZXJQYXRoLFxuICAgICAgICBodG1sV29ya2VyUGF0aDogb3B0aW9ucy5odG1sV29ya2VyUGF0aCxcbiAgICAgICAgY3NzOiBvcHRpb25zLmNzcyxcbiAgICAgICAgYnVpbGQ6IG9wdGlvbnMuYnVpbGQsXG4gICAgICB9LFxuICAgIH0sIGNyZWF0ZVRyYW5zZmVyTGlzdChkYXRhUG9ydDIsIGNvbnRyb2xQb3J0MikpOyAvLyBUcmFuc2ZlciB0aGUgcG9ydHMgcHJvcGVybHlcblxuICAgIC8vIENvbnZlcnQgTm9kZS5qcyBSZWFkYWJsZSB0byBXZWIgUmVhZGFibGVTdHJlYW0gd2l0aCBwcm9wZXIgY2xlYW51cFxuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICByc2NTdHJlYW0ub24oXCJkYXRhXCIsIChjaHVuazogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGNodW5rKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJzY1N0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIC8vIFRoZSBkYXRhIHN0cmVhbSBpcyBkb25lLCBidXQgd29ya2VyIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgICAvLyAoRVJST1IgLyBSU0NfRU5EKSBtYXkgc3RpbGwgYmUgaW4gZmxpZ2h0IG9uIGEgc2VwYXJhdGUgY2hhbm5lbC5cbiAgICAgICAgICAvLyBJZiBSU0NfRU5EIGhhcyBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgd2UgY2FuIGNsZWFuIHVwIGltbWVkaWF0ZWx5O1xuICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZWZlciBwb3J0IGNsb3N1cmUgdG8gYSBsYXRlciB0aWNrIHNvIGFueSBwZW5kaW5nXG4gICAgICAgICAgLy8gY29udHJvbCBtZXNzYWdlcyBnZXQgYSBjaGFuY2UgdG8gZGVsaXZlci4gV2l0aG91dCB0aGlzIGd1YXJkIHRoZVxuICAgICAgICAgIC8vIGRhdGFQb3J0IGBudWxsYCBzaWduYWwgcmFjZXMgY29udHJvbCBtZXNzYWdlcyBhbmQgRVJST1IgcG9zdHNcbiAgICAgICAgICAvLyBhcmUgc2lsZW50bHkgZHJvcHBlZCDigJQgc2VlIGJkLTZwaS5cbiAgICAgICAgICBpZiAoY29udHJvbEVuZGVkUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgIGNsZWFudXBQb3J0cygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udHJvbEVuZGVkUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwUG9ydHMoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXb3JrZXIgbmV2ZXIgc2VudCBSU0NfRU5EIChlLmcuIGFibm9ybWFsIGV4aXQpLiBHaXZlIHRoZVxuICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvb3Agb25lIG1vcmUgdHVybiBmb3IgYW55IGluLWZsaWdodCBjb250cm9sXG4gICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMsIHRoZW4gY2xlYW4gdXAuXG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGNsZWFudXBQb3J0cyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcnNjU3RyZWFtLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29udHJvbGxlci5lcnJvcihlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgLy8gU3RyZWFtIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNvbnN1bWVyIChlLmcuIGJyb3dzZXIgZGlzY29ubmVjdGVkKS5cbiAgICAgICAgLy8gQ2xlYW51cCBpcyBPSyBoZXJlIGJlY2F1c2UgdGhlIGNvbnN1bWVyIG5vIGxvbmdlciBjYXJlcyBhYm91dFxuICAgICAgICAvLyBwZW5kaW5nIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICBjbGVhbnVwUG9ydHMoKTtcbiAgICAgICAgLy8gRGVzdHJveSB0aGUgc3RyZWFtXG4gICAgICAgIHJzY1N0cmVhbS5kZXN0cm95KCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFxQk8sTUFBTSxlQUNYLEdBQUEsU0FBUyxzQkFBdUIsQ0FBQSxFQUFFLFNBQVcsRUFBQTtBQUUzQyxFQUFNLE1BQUEsU0FBQSxHQUNKLFFBQVEsRUFDUixJQUFBLENBQUEsRUFBRyxRQUFRLEtBQUssQ0FBQSxDQUFBLEVBQUksS0FBSyxHQUFJLEVBQUMsSUFBSSxJQUFLLENBQUEsTUFBQSxHQUNwQyxRQUFTLENBQUEsRUFBRSxFQUNYLFNBQVUsQ0FBQSxDQUFBLEVBQUcsRUFBRSxDQUFDLENBQUEsQ0FBQTtBQUdyQixFQUFBLE1BQU0sRUFBRSxTQUFXLEVBQUEsU0FBQSxFQUFXLFlBQWMsRUFBQSxZQUFBLEtBQWlCLHFCQUFzQixFQUFBO0FBR25GLEVBQUEsTUFBTSxZQUFZLElBQUksV0FBQSxDQUFZLEVBQUUsVUFBQSxFQUFZLE9BQU8sQ0FBQTtBQUN2RCxFQUFBLE1BQU0sUUFBUSxPQUFRLENBQUEsS0FBQTtBQUV0QixFQUFNLE1BQUEsTUFBQSxHQUFTLE9BQVEsQ0FBQSxTQUFBLElBQWEsT0FBUSxDQUFBLE1BQUE7QUFDNUMsRUFBQSxJQUFJLENBQUMsTUFBUSxFQUFB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