vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
168 lines (166 loc) • 24.6 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
const tokenizeNodeOptions = () => {
const nodeOptions = process.env["NODE_OPTIONS"] || "";
if (!nodeOptions.trim()) {
return [];
}
const tokens = [];
let current = "";
let inQuotes = false;
let quoteChar = "";
let i = 0;
while (i < nodeOptions.length) {
const char = nodeOptions[i];
if (inQuotes) {
if (char === quoteChar) {
inQuotes = false;
quoteChar = "";
if (current.trim()) {
tokens.push(current.trim());
current = "";
}
} else {
current += char;
}
} else {
if (char === '"' || char === "'") {
if (current.trim()) {
tokens.push(current.trim());
current = "";
}
inQuotes = true;
quoteChar = char;
} else if (char === " " || char === " " || char === "\n") {
if (current.trim()) {
tokens.push(current.trim());
current = "";
}
} else {
current += char;
}
}
i++;
}
if (current.trim()) {
tokens.push(current.trim());
}
return tokens.filter(Boolean);
};
const parseNodeArgs = (args) => {
const conditions = [];
const flags = /* @__PURE__ */ new Set();
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === "--conditions" || arg === "-C") {
if (i + 1 < args.length) {
const conditionValue = args[i + 1];
conditions.push(
...conditionValue.split(",").map((c) => c.trim()).filter(Boolean)
);
i++;
}
} else if (arg.startsWith("--conditions=")) {
const conditionValue = arg.substring("--conditions=".length);
conditions.push(
...conditionValue.split(",").map((c) => c.trim()).filter(Boolean)
);
} else if (arg === "--no-addons") {
flags.add("no-addons");
} else if (arg.startsWith("--")) {
flags.add(arg);
}
}
return { conditions, flags };
};
const getAllConditions = () => {
const nodeOptionsTokens = tokenizeNodeOptions();
const { conditions: envConditions } = parseNodeArgs(nodeOptionsTokens);
const { conditions: cliConditions } = parseNodeArgs(process.execArgv);
return [...envConditions, ...cliConditions];
};
let didWarnAmbiguousConditions = false;
const reactConditionSet = /* @__PURE__ */ new Set(["react-server", "react-client"]);
const detectReactConditionAmbiguity = () => {
const conditions = getAllConditions();
const found = conditions.filter((c) => reactConditionSet.has(c));
const unique = Array.from(new Set(found));
return unique;
};
const warnIfAmbiguousReactConditions = () => {
if (didWarnAmbiguousConditions) return;
const unique = detectReactConditionAmbiguity();
if (unique.includes("react-server") && unique.includes("react-client")) {
didWarnAmbiguousConditions = true;
const nodeOptions = process.env["NODE_OPTIONS"] || "";
const argv = process.execArgv.join(" ");
const msg = `Both react-server and react-client conditions detected in NODE_OPTIONS/execArgv. This can lead to ambiguous resolution. Found: [${unique.join(", ")}]
NODE_OPTIONS="${nodeOptions}"
execArgv="${argv}"
Tip: set exactly one condition or let the plugin manage worker conditions.`;
try {
process.emitWarning(msg, {
code: "VPRS_CONDITION_AMBIGUITY",
detail: "vite-plugin-react-server detected conflicting conditions"
});
} catch {
console.warn(`[vite-plugin-react-server] ${msg}`);
}
}
};
const getCurrentCondition = () => {
warnIfAmbiguousReactConditions();
const conditions = getAllConditions();
if (conditions.includes("react-server")) return "react-server";
if (conditions.includes("react-client")) return "react-client";
return void 0;
};
const getCondition = (prefix = "react-", defaultReturn = `${prefix}client`) => {
const condition2 = getCurrentCondition();
if (condition2 === "react-server") {
return `${prefix}server`;
}
if (condition2 === "react-client") {
return `${prefix}client`;
}
return defaultReturn;
};
function assertReactServer() {
const currentCondition = getCurrentCondition();
if (currentCondition !== "react-server") {
console.warn(
`[vite-plugin-react-server] Condition mismatch: expected react-server. Set NODE_OPTIONS="--conditions=react-server"`
);
return;
}
}
function assertNonReactServer() {
const currentCondition = getCurrentCondition();
if (currentCondition === "react-server") {
console.warn(
`[vite-plugin-react-server] Condition mismatch: unexpected react-server condition on this module.`
);
return;
}
}
const isReactServerCondition = () => getCurrentCondition() === "react-server";
const isReactClientCondition = () => getCurrentCondition() === "react-client";
const hasReactServerCondition = () => {
const allConditions = getAllConditions();
return allConditions.includes("react-server");
};
const hasReactClientCondition = () => {
const allConditions = getAllConditions();
return allConditions.includes("react-client");
};
const getNodeOptionsConditions = () => {
const nodeOptionsTokens = tokenizeNodeOptions();
const { conditions } = parseNodeArgs(nodeOptionsTokens);
return conditions;
};
const condition = getCurrentCondition();
export { assertNonReactServer, assertReactServer, condition, detectReactConditionAmbiguity, getAllConditions, getCondition, getCurrentCondition, getNodeOptionsConditions, hasReactClientCondition, hasReactServerCondition, isReactClientCondition, isReactServerCondition, warnIfAmbiguousReactConditions };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q29uZGl0aW9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vY29uZmlnL2dldENvbmRpdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBOb3RlOiBkbyBub3QgaW1wb3J0IE5vZGUtb25seSBtb2R1bGVzIGhlcmUgKGUuZy4sICdub2RlOndvcmtlcl90aHJlYWRzJykuXG4vLyBUaGlzIGZpbGUgaXMgY29uc3VtZWQgaW4gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBwbHVnaW4gY29udGV4dHMuXG5cbi8qKlxuICogVG9rZW5pemVzIE5PREVfT1BUSU9OUyBzdHJpbmcgaW50byBpbmRpdmlkdWFsIGFyZ3VtZW50c1xuICogSGFuZGxlcyBxdW90ZWQgc3RyaW5ncywgc3BhY2VzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gKi9cbmNvbnN0IHRva2VuaXplTm9kZU9wdGlvbnMgPSAoKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBub2RlT3B0aW9ucyA9IHByb2Nlc3MuZW52W1wiTk9ERV9PUFRJT05TXCJdIHx8IFwiXCI7XG4gIGlmICghbm9kZU9wdGlvbnMudHJpbSgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBpblF1b3RlcyA9IGZhbHNlO1xuICBsZXQgcXVvdGVDaGFyID0gXCJcIjtcbiAgbGV0IGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgbm9kZU9wdGlvbnMubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IG5vZGVPcHRpb25zW2ldO1xuXG4gICAgaWYgKGluUXVvdGVzKSB7XG4gICAgICBpZiAoY2hhciA9PT0gcXVvdGVDaGFyKSB7XG4gICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgIHF1b3RlQ2hhciA9IFwiXCI7XG4gICAgICAgIGlmIChjdXJyZW50LnRyaW0oKSkge1xuICAgICAgICAgIHRva2Vucy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgICAgICBjdXJyZW50ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSBcIidcIikge1xuICAgICAgICBpZiAoY3VycmVudC50cmltKCkpIHtcbiAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gICAgICAgICAgY3VycmVudCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5RdW90ZXMgPSB0cnVlO1xuICAgICAgICBxdW90ZUNoYXIgPSBjaGFyO1xuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIiBcIiB8fCBjaGFyID09PSBcIlxcdFwiIHx8IGNoYXIgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goY3VycmVudC50cmltKCkpO1xuICAgICAgICAgIGN1cnJlbnQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50ICs9IGNoYXI7XG4gICAgICB9XG4gICAgfVxuICAgIGkrKztcbiAgfVxuXG4gIGlmIChjdXJyZW50LnRyaW0oKSkge1xuICAgIHRva2Vucy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnMuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgY29uZGl0aW9ucyBhbmQgb3RoZXIgZmxhZ3NcbiAqL1xuY29uc3QgcGFyc2VOb2RlQXJncyA9IChhcmdzOiBzdHJpbmdbXSkgPT4ge1xuICBjb25zdCBjb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG5cbiAgICBpZiAoYXJnID09PSBcIi0tY29uZGl0aW9uc1wiIHx8IGFyZyA9PT0gXCItQ1wiKSB7XG4gICAgICAvLyBOZXh0IGFyZ3VtZW50IGlzIHRoZSBjb25kaXRpb24gdmFsdWVcbiAgICAgIGlmIChpICsgMSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gYXJnc1tpICsgMV07XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgICAuLi5jb25kaXRpb25WYWx1ZVxuICAgICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgLm1hcCgoYykgPT4gYy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICk7XG4gICAgICAgIGkrKzsgLy8gU2tpcCB0aGUgbmV4dCBhcmd1bWVudCBzaW5jZSB3ZSBjb25zdW1lZCBpdFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLWNvbmRpdGlvbnM9XCIpKSB7XG4gICAgICAvLyBDb25kaXRpb24gdmFsdWUgaXMgcGFydCBvZiB0aGUgc2FtZSBhcmd1bWVudFxuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBhcmcuc3Vic3RyaW5nKFwiLS1jb25kaXRpb25zPVwiLmxlbmd0aCk7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIC4uLmNvbmRpdGlvblZhbHVlXG4gICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhcmcgPT09IFwiLS1uby1hZGRvbnNcIikge1xuICAgICAgZmxhZ3MuYWRkKFwibm8tYWRkb25zXCIpO1xuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgLy8gT3RoZXIgZmxhZ3NcbiAgICAgIGZsYWdzLmFkZChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGNvbmRpdGlvbnMsIGZsYWdzIH07XG59O1xuXG4vKipcbiAqIEdldHMgYWxsIGNvbmRpdGlvbnMgZnJvbSBib3RoIE5PREVfT1BUSU9OUyBhbmQgY29tbWFuZC1saW5lIGFyZ3VtZW50c1xuICovXG5leHBvcnQgY29uc3QgZ2V0QWxsQ29uZGl0aW9ucyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIC8vIFBhcnNlIE5PREVfT1BUSU9OU1xuICBjb25zdCBub2RlT3B0aW9uc1Rva2VucyA9IHRva2VuaXplTm9kZU9wdGlvbnMoKTtcbiAgY29uc3QgeyBjb25kaXRpb25zOiBlbnZDb25kaXRpb25zIH0gPSBwYXJzZU5vZGVBcmdzKG5vZGVPcHRpb25zVG9rZW5zKTtcblxuICAvLyBQYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gIGNvbnN0IHsgY29uZGl0aW9uczogY2xpQ29uZGl0aW9ucyB9ID0gcGFyc2VOb2RlQXJncyhwcm9jZXNzLmV4ZWNBcmd2KTtcblxuICAvLyBDb21iaW5lIGFsbCBjb25kaXRpb25zXG4gIHJldHVybiBbLi4uZW52Q29uZGl0aW9ucywgLi4uY2xpQ29uZGl0aW9uc107XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBbWJpZ3VpdHkgZGV0ZWN0aW9uIGFuZCB3YXJuaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5sZXQgZGlkV2FybkFtYmlndW91c0NvbmRpdGlvbnMgPSBmYWxzZTtcbi8vIHJlYWN0LXN0YXRpYyBkb2VzIG5vdCBleGlzdHMsIGJlY2F1c2UgeW91IHN0aWxsIG5lZWQgY29uZGl0aW9uIHJlYWN0LXNlcnZlciBmb3IgdGhlIC5zdGF0aWMgaW1wb3J0cyB0byB3b3JrLlxuY29uc3QgcmVhY3RDb25kaXRpb25TZXQgPSBuZXcgU2V0KFtcInJlYWN0LXNlcnZlclwiLCBcInJlYWN0LWNsaWVudFwiXSk7XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RSZWFjdENvbmRpdGlvbkFtYmlndWl0eSA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBnZXRBbGxDb25kaXRpb25zKCk7XG4gIGNvbnN0IGZvdW5kID0gY29uZGl0aW9ucy5maWx0ZXIoKGMpID0+IHJlYWN0Q29uZGl0aW9uU2V0LmhhcyhjKSk7XG4gIGNvbnN0IHVuaXF1ZSA9IEFycmF5LmZyb20obmV3IFNldChmb3VuZCkpO1xuICByZXR1cm4gdW5pcXVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHdhcm5JZkFtYmlndW91c1JlYWN0Q29uZGl0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgaWYgKGRpZFdhcm5BbWJpZ3VvdXNDb25kaXRpb25zKSByZXR1cm47XG4gIGNvbnN0IHVuaXF1ZSA9IGRldGVjdFJlYWN0Q29uZGl0aW9uQW1iaWd1aXR5KCk7XG4gIGlmICh1bmlxdWUuaW5jbHVkZXMoXCJyZWFjdC1zZXJ2ZXJcIikgJiYgdW5pcXVlLmluY2x1ZGVzKFwicmVhY3QtY2xpZW50XCIpKSB7XG4gICAgZGlkV2FybkFtYmlndW91c0NvbmRpdGlvbnMgPSB0cnVlO1xuICAgIGNvbnN0IG5vZGVPcHRpb25zID0gcHJvY2Vzcy5lbnZbXCJOT0RFX09QVElPTlNcIl0gfHwgXCJcIjtcbiAgICBjb25zdCBhcmd2ID0gcHJvY2Vzcy5leGVjQXJndi5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBtc2cgPVxuICAgICAgYEJvdGggcmVhY3Qtc2VydmVyIGFuZCByZWFjdC1jbGllbnQgY29uZGl0aW9ucyBkZXRlY3RlZCBpbiBOT0RFX09QVElPTlMvZXhlY0FyZ3YuIGAgK1xuICAgICAgYFRoaXMgY2FuIGxlYWQgdG8gYW1iaWd1b3VzIHJlc29sdXRpb24uIEZvdW5kOiBbJHt1bmlxdWUuam9pbihcIiwgXCIpfV1cXG5gICtcbiAgICAgIGBOT0RFX09QVElPTlM9XCIke25vZGVPcHRpb25zfVwiXFxuZXhlY0FyZ3Y9XCIke2FyZ3Z9XCJcXG5gICtcbiAgICAgIGBUaXA6IHNldCBleGFjdGx5IG9uZSBjb25kaXRpb24gb3IgbGV0IHRoZSBwbHVnaW4gbWFuYWdlIHdvcmtlciBjb25kaXRpb25zLmA7XG4gICAgLy8gVXNlIHByb2Nlc3MuZW1pdFdhcm5pbmcgdG8gYXZvaWQgdGhyb3dpbmdcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtc2csIHtcbiAgICAgICAgY29kZTogXCJWUFJTX0NPTkRJVElPTl9BTUJJR1VJVFlcIixcbiAgICAgICAgZGV0YWlsOiBcInZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlciBkZXRlY3RlZCBjb25mbGljdGluZyBjb25kaXRpb25zXCIsXG4gICAgICB9IGFzIGFueSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFja1xuXG4gICAgICBjb25zb2xlLndhcm4oYFt2aXRlLXBsdWdpbi1yZWFjdC1zZXJ2ZXJdICR7bXNnfWApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGNvbmRpdGlvbiwgZGVmYXVsdGluZyB0byBcInJlYWN0LWNsaWVudFwiIGlmIG5vIGNvbmRpdGlvbnMgYXJlIHNldFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudENvbmRpdGlvbiA9ICgpOlxuICB8IFwicmVhY3Qtc2VydmVyXCJcbiAgfCBcInJlYWN0LWNsaWVudFwiXG4gIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8gV2FybiBpZiB3ZSBkZXRlY3QgYm90aCBjb25kaXRpb25zIHByZXNlbnRcbiAgd2FybklmQW1iaWd1b3VzUmVhY3RDb25kaXRpb25zKCk7XG5cbiAgLy8gQ2hlY2sgYm90aCBOT0RFX09QVElPTlMgYW5kIGV4ZWNBcmd2IGZvciBjb25kaXRpb25zXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBnZXRBbGxDb25kaXRpb25zKCk7XG4gIGlmIChjb25kaXRpb25zLmluY2x1ZGVzKFwicmVhY3Qtc2VydmVyXCIpKSByZXR1cm4gXCJyZWFjdC1zZXJ2ZXJcIjtcbiAgaWYgKGNvbmRpdGlvbnMuaW5jbHVkZXMoXCJyZWFjdC1jbGllbnRcIikpIHJldHVybiBcInJlYWN0LWNsaWVudFwiO1xuXG4gIC8vIERlZmF1bHQgdG8gcmVhY3QtY2xpZW50IHdoZW4gbm90aGluZyBpcyBzZXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZGl0aW9uIHdpdGggYSBjdXN0b20gcHJlZml4XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb25kaXRpb24gPSA8UHJlZml4IGV4dGVuZHMgc3RyaW5nID0gXCJyZWFjdC1cIiwgRGVmYXVsdENvbmRpdGlvbiBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gID0gYCR7UHJlZml4fWNsaWVudGA+KFxuICBwcmVmaXg6IFByZWZpeCA9IFwicmVhY3QtXCIgYXMgUHJlZml4LFxuICBkZWZhdWx0UmV0dXJuOlxuICAgIHwgYCR7UHJlZml4fXNlcnZlcmBcbiAgICB8IGAke1ByZWZpeH1jbGllbnRgID0gYCR7cHJlZml4fWNsaWVudGAgYXMgYCR7UHJlZml4fWNsaWVudGBcbik6IGAke1ByZWZpeH1jbGllbnRgIHwgYCR7UHJlZml4fXNlcnZlcmAgfCBEZWZhdWx0Q29uZGl0aW9uID0+IHtcbiAgY29uc3QgY29uZGl0aW9uID0gZ2V0Q3VycmVudENvbmRpdGlvbigpO1xuICBpZiAoY29uZGl0aW9uID09PSBcInJlYWN0LXNlcnZlclwiKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH1zZXJ2ZXJgIGFzIGAke1ByZWZpeH1zZXJ2ZXJgO1xuICB9XG4gIGlmIChjb25kaXRpb24gPT09IFwicmVhY3QtY2xpZW50XCIpIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fWNsaWVudGAgYXMgYCR7UHJlZml4fWNsaWVudGA7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZXR1cm47XG59O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgY3VycmVudCBjb25kaXRpb24gaXMgcmVhY3Qtc2VydmVyXG4gKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCBhIGRlc2NyaXB0aXZlIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRSZWFjdFNlcnZlcigpOiBhc3NlcnRzIHRoaXMgaXMge1xuICBjb25kaXRpb246IFwicmVhY3Qtc2VydmVyXCI7XG59IHtcbiAgY29uc3QgY3VycmVudENvbmRpdGlvbiA9IGdldEN1cnJlbnRDb25kaXRpb24oKTtcbiAgaWYgKGN1cnJlbnRDb25kaXRpb24gIT09IFwicmVhY3Qtc2VydmVyXCIpIHtcbiAgICAvLyBEZWJ1Zy1vbmx5OiBhdm9pZCBOb2RlLW9ubHkgQVBJcyB0byBrZWVwIHRoaXMgZmlsZSBicm93c2VyLXNhZmVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gQ29uZGl0aW9uIG1pc21hdGNoOiBleHBlY3RlZCByZWFjdC1zZXJ2ZXIuIFNldCBOT0RFX09QVElPTlM9XCItLWNvbmRpdGlvbnM9cmVhY3Qtc2VydmVyXCJgXG4gICAgKTtcbiAgICByZXR1cm47IC8vIERvbid0IHRocm93IOKAlCBWaXRlIDcgbWF5IGxvYWQgYm90aCBjb25kaXRpb24gdmFyaWFudHMgZHVyaW5nIGNvbmZpZyBidW5kbGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25SZWFjdFNlcnZlcigpOiBhc3NlcnRzIHRoaXMgaXMge1xuICBjb25kaXRpb246IFwicmVhY3QtY2xpZW50XCI7XG59IHtcbiAgY29uc3QgY3VycmVudENvbmRpdGlvbiA9IGdldEN1cnJlbnRDb25kaXRpb24oKTtcbiAgaWYgKGN1cnJlbnRDb25kaXRpb24gPT09IFwicmVhY3Qtc2VydmVyXCIpIHtcbiAgICAvLyBEZWJ1Zy1vbmx5OiBhdm9pZCBOb2RlLW9ubHkgQVBJcyB0byBrZWVwIHRoaXMgZmlsZSBicm93c2VyLXNhZmVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3ZpdGUtcGx1Z2luLXJlYWN0LXNlcnZlcl0gQ29uZGl0aW9uIG1pc21hdGNoOiB1bmV4cGVjdGVkIHJlYWN0LXNlcnZlciBjb25kaXRpb24gb24gdGhpcyBtb2R1bGUuYFxuICAgICk7XG4gICAgcmV0dXJuOyAvLyBEb24ndCB0aHJvdyDigJQgVml0ZSA3IG1heSBsb2FkIGJvdGggY29uZGl0aW9uIHZhcmlhbnRzIGR1cmluZyBjb25maWcgYnVuZGxpbmdcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBjb25kaXRpb24gaXMgcmVhY3Qtc2VydmVyIChzdHJpY3QgLSByZXF1aXJlcyBib3RoIE5PREVfT1BUSU9OUyBhbmQgZXhlY0FyZ3YpXG4gKiBVc2UgdGhpcyBmb3IgUmVhY3QgU2VydmVyIERPTSBjb21wYXRpYmlsaXR5IGNoZWNrc1xuICovXG5leHBvcnQgY29uc3QgaXNSZWFjdFNlcnZlckNvbmRpdGlvbiA9ICgpOiBib29sZWFuID0+XG4gIGdldEN1cnJlbnRDb25kaXRpb24oKSA9PT0gXCJyZWFjdC1zZXJ2ZXJcIjtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgY29uZGl0aW9uIGlzIHJlYWN0LWNsaWVudCAoc3RyaWN0IC0gcmVxdWlyZXMgYm90aCBOT0RFX09QVElPTlMgYW5kIGV4ZWNBcmd2KVxuICogVXNlIHRoaXMgZm9yIFJlYWN0IFNlcnZlciBET00gY29tcGF0aWJpbGl0eSBjaGVja3NcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUmVhY3RDbGllbnRDb25kaXRpb24gPSAoKTogYm9vbGVhbiA9PlxuICBnZXRDdXJyZW50Q29uZGl0aW9uKCkgPT09IFwicmVhY3QtY2xpZW50XCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJlYWN0LXNlcnZlciBjb25kaXRpb24gaXMgcHJlc2VudCBpbiBlaXRoZXIgTk9ERV9PUFRJT05TIE9SIGV4ZWNBcmd2IChsZW5pZW50KVxuICogVXNlIHRoaXMgZm9yIHBsdWdpbiBpbnRlcm5hbCBlbnZpcm9ubWVudCBnYXRpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc1JlYWN0U2VydmVyQ29uZGl0aW9uID0gKCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBhbGxDb25kaXRpb25zID0gZ2V0QWxsQ29uZGl0aW9ucygpO1xuICByZXR1cm4gYWxsQ29uZGl0aW9ucy5pbmNsdWRlcyhcInJlYWN0LXNlcnZlclwiKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJlYWN0LWNsaWVudCBjb25kaXRpb24gaXMgcHJlc2VudCBpbiBlaXRoZXIgTk9ERV9PUFRJT05TIE9SIGV4ZWNBcmd2IChsZW5pZW50KVxuICogVXNlIHRoaXMgZm9yIHBsdWdpbiBpbnRlcm5hbCBlbnZpcm9ubWVudCBnYXRpbmcgIFxuICovXG5leHBvcnQgY29uc3QgaGFzUmVhY3RDbGllbnRDb25kaXRpb24gPSAoKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGFsbENvbmRpdGlvbnMgPSBnZXRBbGxDb25kaXRpb25zKCk7XG4gIHJldHVybiBhbGxDb25kaXRpb25zLmluY2x1ZGVzKFwicmVhY3QtY2xpZW50XCIpO1xufTtcblxuLyoqXG4gKiBMZWdhY3kgZnVuY3Rpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqIEBkZXByZWNhdGVkIFVzZSBnZXRBbGxDb25kaXRpb25zKCkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgZ2V0Tm9kZU9wdGlvbnNDb25kaXRpb25zID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9kZU9wdGlvbnNUb2tlbnMgPSB0b2tlbml6ZU5vZGVPcHRpb25zKCk7XG4gIGNvbnN0IHsgY29uZGl0aW9ucyB9ID0gcGFyc2VOb2RlQXJncyhub2RlT3B0aW9uc1Rva2Vucyk7XG4gIHJldHVybiBjb25kaXRpb25zO1xufTtcblxuLyoqXG4gKiBMZWdhY3kgZXhwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiBAZGVwcmVjYXRlZCBVc2UgZ2V0Q3VycmVudENvbmRpdGlvbigpIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmRpdGlvbiA9IGdldEN1cnJlbnRDb25kaXRpb24oKTtcbiJdLCJuYW1lcyI6WyJjb25kaXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EsTUFBTSxzQkFBc0IsTUFBZ0I7QUFDMUMsRUFBQSxNQUFNLFdBQWMsR0FBQSxPQUFBLENBQVEsR0FBSSxDQUFBLGNBQWMsQ0FBSyxJQUFBLEVBQUE7QUFDbkQsRUFBSSxJQUFBLENBQUMsV0FBWSxDQUFBLElBQUEsRUFBUSxFQUFBO0FBQ3ZCLElBQUEsT0FBTyxFQUFDO0FBQUE7QUFHVixFQUFBLE1BQU0sU0FBbUIsRUFBQztBQUMxQixFQUFBLElBQUksT0FBVSxHQUFBLEVBQUE7QUFDZCxFQUFBLElBQUksUUFBVyxHQUFBLEtBQUE7QUFDZixFQUFBLElBQUksU0FBWSxHQUFBLEVBQUE7QUFDaEIsRUFBQSxJQUFJLENBQUksR0FBQSxDQUFBO0FBRVIsRUFBTyxPQUFBLENBQUEsR0FBSSxZQUFZLE1BQVEsRUFBQTtBQUM3QixJQUFNLE1BQUEsSUFBQSxHQUFPLFlBQVksQ0FBQyxDQUFBO0FBRTFCLElBQUEsSUFBSSxRQUFVLEVBQUE7QUFDWixNQUFBLElBQUksU0FBUyxTQUFXLEVBQUE7QUFDdEIsUUFBVyxRQUFBLEdBQUEsS0FBQTtBQUNYLFFBQVksU0FBQSxHQUFBLEVBQUE7QUFDWixRQUFJLElBQUEsT0FBQSxDQUFRLE1BQVEsRUFBQTtBQUNsQixVQUFPLE1BQUEsQ0FBQSxJQUFBLENBQUssT0FBUSxDQUFBLElBQUEsRUFBTSxDQUFBO0FBQzFCLFVBQVUsT0FBQSxHQUFBLEVBQUE7QUFBQTtBQUNaLE9BQ0ssTUFBQTtBQUNMLFFBQVcsT0FBQSxJQUFBLElBQUE7QUFBQTtBQUNiLEtBQ0ssTUFBQTtBQUNMLE1BQUksSUFBQSxJQUFBLEtBQVMsR0FBTyxJQUFBLElBQUEsS0FBUyxHQUFLLEVBQUE7QUFD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