UNPKG

kwikid-forms

Version:

KwikID's JSON Configuration based Forms Renderer and Builder

194 lines 27.8 kB
import { checkObjectKeyExists, isNotEmptyValue } from "kwikid-toolkit"; /** * Default when utilityFlags.isEliminateBrowserStorage is not set (undefined). * Legacy hosts keep localStorage; set the flag to true for reduxData-only reads. */ export const DEFAULT_FORMS_ELIMINATE_BROWSER_STORAGE = false; /** * Resolution order must match legacy getLanguage() (config-converter.helper): * lng first, selectedLang last — do not reorder without a breaking-change note. */ const DEFAULT_LANGUAGE_KEYS = [ "lng", "lang", "Lang", "language", "currentLang", "selectedLang" ]; const STANDARD_LOGICAL_KEYS = ["session_id", "language", "formKey"]; /** Legacy default: localStorage until host sets utilityFlags.isEliminateBrowserStorage. */ export const DEFAULT_FORMS_STORAGE_CONFIG = { defaultSource: "localStorage", session_id: { key: "session_id" }, language: { keys: DEFAULT_LANGUAGE_KEYS, fallback: "en" }, formKey: { key: "formKey" } }; function readLocalStorage(key) { if (typeof localStorage === "undefined") { return null; } try { return localStorage.getItem(key); } catch (error) { return null; } } function readReduxDataScalar(reduxData, key) { const value = reduxData[key]; if (value === undefined || value === null) { return null; } if (typeof value === "string") { return value; } if (typeof value === "number" || typeof value === "boolean") { return String(value); } return null; } function readReduxDataObject(reduxData, key) { const value = reduxData[key]; if (value === undefined || value === null) { return undefined; } if (typeof value === "string") { try { return JSON.parse(value); } catch (error) { return value; } } return value; } function readLocalStorageObject(key) { const raw = readLocalStorage(key); if (raw === null) { return undefined; } try { return JSON.parse(raw); } catch (error) { return raw; } } function readStorageObject(source, reduxData, key) { if (source === "reduxData") { return readReduxDataObject(reduxData, key); } return readLocalStorageObject(key); } function isFormsStorageKeyConfig(entry) { if (!entry || typeof entry !== "object" || Array.isArray(entry)) { return false; } return (checkObjectKeyExists(entry, "source") || checkObjectKeyExists(entry, "key") || checkObjectKeyExists(entry, "keys") || checkObjectKeyExists(entry, "fallback")); } function keyConfigFor(config, logicalKey) { const entry = config[logicalKey]; if (isFormsStorageKeyConfig(entry)) { return entry; } return undefined; } function sourceForKey(config, logicalKey) { var _a, _b, _c, _d; return ((_d = (_c = (_b = (_a = keyConfigFor(config, logicalKey)) === null || _a === void 0 ? void 0 : _a.source) !== null && _b !== void 0 ? _b : config.defaultSource) !== null && _c !== void 0 ? _c : DEFAULT_FORMS_STORAGE_CONFIG.defaultSource) !== null && _d !== void 0 ? _d : "localStorage"); } /** * Apply utilityFlags.isEliminateBrowserStorage as the single source of truth. * When true → reduxData; when false/omitted → localStorage (overrides formsStorage.defaultSource). */ function normalizeFormsStorageConfigSources(config, source) { var _a, _b, _c, _d, _e, _f; const next = Object.assign(Object.assign({}, config), { defaultSource: source }); const mergeStandardKey = (logicalKey, base) => { const existing = keyConfigFor(config, logicalKey); next[logicalKey] = Object.assign(Object.assign(Object.assign({}, base), (existing !== null && existing !== void 0 ? existing : {})), { source }); }; mergeStandardKey("session_id", { key: "session_id" }); mergeStandardKey("formKey", { key: "formKey" }); mergeStandardKey("language", { keys: (_d = (_b = (_a = keyConfigFor(config, "language")) === null || _a === void 0 ? void 0 : _a.keys) !== null && _b !== void 0 ? _b : (_c = DEFAULT_FORMS_STORAGE_CONFIG.language) === null || _c === void 0 ? void 0 : _c.keys) !== null && _d !== void 0 ? _d : DEFAULT_LANGUAGE_KEYS, fallback: (_f = (_e = keyConfigFor(config, "language")) === null || _e === void 0 ? void 0 : _e.fallback) !== null && _f !== void 0 ? _f : "en" }); Object.keys(config).forEach((key) => { if (key === "defaultSource" || STANDARD_LOGICAL_KEYS.includes(key)) { return; } const entry = config[key]; if (isFormsStorageKeyConfig(entry)) { next[key] = Object.assign(Object.assign({}, entry), { source }); } }); return next; } /** Merge userConfig.formsStorage with defaults; map utilityFlags when present. */ export function resolveFormsStorageConfig(userConfig) { var _a; const fromUser = userConfig === null || userConfig === void 0 ? void 0 : userConfig.formsStorage; const config = Object.assign(Object.assign({}, DEFAULT_FORMS_STORAGE_CONFIG), (fromUser && typeof fromUser === "object" ? fromUser : {})); const eliminateFlag = (_a = userConfig === null || userConfig === void 0 ? void 0 : userConfig.utilityFlags) === null || _a === void 0 ? void 0 : _a.isEliminateBrowserStorage; const eliminate = typeof eliminateFlag === "boolean" ? eliminateFlag : DEFAULT_FORMS_ELIMINATE_BROWSER_STORAGE; const source = eliminate ? "reduxData" : "localStorage"; return normalizeFormsStorageConfigSources(config, source); } /** Resolve a string value for a logical or explicit storage key. */ export function resolveFormsStorageString(logicalKey, reduxData = {}, config) { var _a, _b, _c, _d; const resolvedConfig = config !== null && config !== void 0 ? config : DEFAULT_FORMS_STORAGE_CONFIG; const keyCfg = keyConfigFor(resolvedConfig, logicalKey); const source = sourceForKey(resolvedConfig, logicalKey); if ((_a = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.keys) === null || _a === void 0 ? void 0 : _a.length) { for (const key of keyCfg.keys) { const value = source === "reduxData" ? readReduxDataScalar(reduxData, key) : readLocalStorage(key); if (isNotEmptyValue(value)) { return value; } } return (_b = keyCfg.fallback) !== null && _b !== void 0 ? _b : null; } const storageKey = (_c = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.key) !== null && _c !== void 0 ? _c : logicalKey; const value = source === "reduxData" ? readReduxDataScalar(reduxData, storageKey) : readLocalStorage(storageKey); if (isNotEmptyValue(value)) { return value; } return (_d = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.fallback) !== null && _d !== void 0 ? _d : null; } /** * Resolve a structured value (form config blob, eNachForm, etc.). * Supports the same logical key / keys[] / key alias config as resolveFormsStorageString. */ export function resolveFormsStorageObject(logicalKey, reduxData = {}, config) { var _a, _b; const resolvedConfig = config !== null && config !== void 0 ? config : DEFAULT_FORMS_STORAGE_CONFIG; const keyCfg = keyConfigFor(resolvedConfig, logicalKey); const source = sourceForKey(resolvedConfig, logicalKey); if ((_a = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.keys) === null || _a === void 0 ? void 0 : _a.length) { for (const key of keyCfg.keys) { const value = readStorageObject(source, reduxData, key); if (value !== undefined && value !== null) { return value; } } return undefined; } const storageKey = (_b = keyCfg === null || keyCfg === void 0 ? void 0 : keyCfg.key) !== null && _b !== void 0 ? _b : logicalKey; return readStorageObject(source, reduxData, storageKey); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXMtc3RvcmFnZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9oZWxwZXJzL2Zvcm1zLXN0b3JhZ2UuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUt2RTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxLQUFLLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixVQUFVO0lBQ1YsYUFBYTtJQUNiLGNBQWM7Q0FDZixDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFVLENBQUM7QUFnQzdFLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBdUI7SUFDOUQsYUFBYSxFQUFFLGNBQWM7SUFDN0IsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRTtJQUNqQyxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLFFBQVEsRUFBRSxJQUFJO0tBQ2Y7SUFDRCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0NBQzVCLENBQUM7QUFFRixTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUU7UUFDdkMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQUk7UUFDRixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbEM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQs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LE1BQU0sR0FBSSw0QkFBNEIsQ0FBQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFeEQsSUFBSSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLDBDQUFFLE1BQU0sRUFBRTtRQUN4QixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDekMsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxHQUFHLG1DQUFJLFVBQVUsQ0FBQztJQUM3QyxPQUFPLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNoZWNrT2JqZWN0S2V5RXhpc3RzLCBpc05vdEVtcHR5VmFsdWUgfSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcblxuLyoqIFdoZXJlIGEgY29uZmlndXJlZCBrZXkgc2hvdWxkIGJlIHJlYWQgZnJvbS4gKi9cbmV4cG9ydCB0eXBlIEZvcm1zU3RvcmFnZVNvdXJjZSA9IFwicmVkdXhEYXRhXCIgfCBcImxvY2FsU3RvcmFnZVwiO1xuXG4vKipcbiAqIERlZmF1bHQgd2hlbiB1dGlsaXR5RmxhZ3MuaXNFbGltaW5hdGVCcm93c2VyU3RvcmFnZSBpcyBub3Qgc2V0ICh1bmRlZmluZWQpLlxuICogTGVnYWN5IGhvc3RzIGtlZXAgbG9jYWxTdG9yYWdlOyBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBmb3IgcmVkdXhEYXRhLW9ubHkgcmVhZHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUk1TX0VMSU1JTkFURV9CUk9XU0VSX1NUT1JBR0UgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXNvbHV0aW9uIG9yZGVyIG11c3QgbWF0Y2ggbGVnYWN5IGdldExhbmd1YWdlKCkgKGNvbmZpZy1jb252ZXJ0ZXIuaGVscGVyKTpcbiAqIGxuZyBmaXJzdCwgc2VsZWN0ZWRMYW5nIGxhc3Qg4oCUIGRvIG5vdCByZW9yZGVyIHdpdGhvdXQgYSBicmVha2luZy1jaGFuZ2Ugbm90ZS5cbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRV9LRVlTID0gW1xuICBcImxuZ1wiLFxuICBcImxhbmdcIixcbiAgXCJMYW5nXCIsXG4gIFwibGFuZ3VhZ2VcIixcbiAgXCJjdXJyZW50TGFuZ1wiLFxuICBcInNlbGVjdGVkTGFuZ1wiXG5dO1xuXG5jb25zdCBTVEFOREFSRF9MT0dJQ0FMX0tFWVMgPSBbXCJzZXNzaW9uX2lkXCIsIFwibGFuZ3VhZ2VcIiwgXCJmb3JtS2V5XCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1zU3RvcmFnZUtleUNvbmZpZyB7XG4gIC8qKiBPbWl0IHRvIHVzZSBGb3Jtc1N0b3JhZ2VDb25maWcuZGVmYXVsdFNvdXJjZSAob25lIHNvdXJjZSBwZXIgY2xpZW50KS4gKi9cbiAgc291cmNlPzogRm9ybXNTdG9yYWdlU291cmNlO1xuICAvKiogU3RvcmFnZSBrZXkgKGRlZmF1bHRzIHRvIHRoZSBsb2dpY2FsIGlkIHBhc3NlZCB0byByZXNvbHZlKS4gKi9cbiAga2V5Pzogc3RyaW5nO1xuICAvKiogVHJ5IG11bHRpcGxlIGtleXMgaW4gb3JkZXIgKGUuZy4gbGFuZ3VhZ2UpLiAqL1xuICBrZXlzPzogc3RyaW5nW107XG4gIGZhbGxiYWNrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvc3Qgc3VwcGxpZXMgdmlhIHVzZXJDb25maWcuZm9ybXNTdG9yYWdlLCBvciBkZXJpdmVkIGZyb20gdXRpbGl0eUZsYWdzLlxuICogUGVyLWtleSBgc291cmNlYCBpcyBvcHRpb25hbCDigJQgZmFsbHMgYmFjayB0byBkZWZhdWx0U291cmNlIChzYW1lIGlkZWEgYXMgdG9vbGtpdFxuICogQlJPV1NFUl9TVE9SQUdFOiB7IHR5cGUsIGtleSB9IHdpdGggYSBzaW5nbGUgdHlwZSBmb3IgdGhlIGNsaWVudCkuXG4gKiBFeGFtcGxlIChlbGltaW5hdGUgbW9kZSDigJQgc2V0IHZpYSB1dGlsaXR5RmxhZ3Mgb3IgZGVmYXVsdFNvdXJjZSk6XG4gKiB7XG4gKiAgIFwiZGVmYXVsdFNvdXJjZVwiOiBcInJlZHV4RGF0YVwiLFxuICogICBcInNlc3Npb25faWRcIjogeyBcImtleVwiOiBcInNlc3Npb25faWRcIiB9LFxuICogICBcImxhbmd1YWdlXCI6IHsgXCJrZXlzXCI6IFtcImxuZ1wiLCBcImxhbmdcIiwgXCJzZWxlY3RlZExhbmdcIl0sIFwiZmFsbGJhY2tcIjogXCJlblwiIH0sXG4gKiAgIFwiZm9ybUtleVwiOiB7IFwia2V5XCI6IFwiZm9ybUtleVwiIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3Jtc1N0b3JhZ2VDb25maWcge1xuICBkZWZhdWx0U291cmNlPzogRm9ybXNTdG9yYWdlU291cmNlO1xuICBzZXNzaW9uX2lkPzogRm9ybXNTdG9yYWdlS2V5Q29uZmlnO1xuICBsYW5ndWFnZT86IEZvcm1zU3RvcmFnZUtleUNvbmZpZztcbiAgZm9ybUtleT86IEZvcm1zU3RvcmFnZUtleUNvbmZpZztcbiAgW2xvZ2ljYWxLZXk6IHN0cmluZ106IEZvcm1zU3RvcmFnZUtleUNvbmZpZyB8IEZvcm1zU3RvcmFnZVNvdXJjZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIExlZ2FjeSBkZWZhdWx0OiBsb2NhbFN0b3JhZ2UgdW50aWwgaG9zdCBzZXRzIHV0aWxpdHlGbGFncy5pc0VsaW1pbmF0ZUJyb3dzZXJTdG9yYWdlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUc6IEZvcm1zU3RvcmFnZUNvbmZpZyA9IHtcbiAgZGVmYXVsdFNvdXJjZTogXCJsb2NhbFN0b3JhZ2VcIixcbiAgc2Vzc2lvbl9pZDogeyBrZXk6IFwic2Vzc2lvbl9pZFwiIH0sXG4gIGxhbmd1YWdlOiB7XG4gICAga2V5czogREVGQVVMVF9MQU5HVUFHRV9LRVlTLFxuICAgIGZhbGxiYWNrOiBcImVuXCJcbiAgfSxcbiAgZm9ybUtleTogeyBrZXk6IFwiZm9ybUtleVwiIH1cbn07XG5cbmZ1bmN0aW9uIHJlYWRMb2NhbFN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFJlZHV4RGF0YVNjYWxhcihcbiAgcmVkdXhEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OiBzdHJpbmdcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHJlZHV4RGF0YVtrZXldO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlYWRSZWR1eERhdGFPYmplY3QoXG4gIHJlZHV4RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGtleTogc3RyaW5nXG4pOiB1bmtub3duIHtcbiAgY29uc3QgdmFsdWUgPSByZWR1eERhdGFba2V5XTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRMb2NhbFN0b3JhZ2VPYmplY3Qoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgcmF3ID0gcmVhZExvY2FsU3RvcmFnZShrZXkpO1xuICBpZiAocmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRTdG9yYWdlT2JqZWN0KFxuICBzb3VyY2U6IEZvcm1zU3RvcmFnZVNvdXJjZSxcbiAgcmVkdXhEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OiBzdHJpbmdcbik6IHVua25vd24ge1xuICBpZiAoc291cmNlID09PSBcInJlZHV4RGF0YVwiKSB7XG4gICAgcmV0dXJuIHJlYWRSZWR1eERhdGFPYmplY3QocmVkdXhEYXRhLCBrZXkpO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRMb2NhbFN0b3JhZ2VPYmplY3Qoa2V5KTtcbn1cblxuZnVuY3Rpb24gaXNGb3Jtc1N0b3JhZ2VLZXlDb25maWcoZW50cnk6IHVua25vd24pOiBlbnRyeSBpcyBGb3Jtc1N0b3JhZ2VLZXlDb25maWcge1xuICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZW50cnksIFwic291cmNlXCIpIHx8XG4gICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZW50cnksIFwia2V5XCIpIHx8XG4gICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZW50cnksIFwia2V5c1wiKSB8fFxuICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGVudHJ5LCBcImZhbGxiYWNrXCIpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGtleUNvbmZpZ0ZvcihcbiAgY29uZmlnOiBGb3Jtc1N0b3JhZ2VDb25maWcsXG4gIGxvZ2ljYWxLZXk6IHN0cmluZ1xuKTogRm9ybXNTdG9yYWdlS2V5Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBjb25maWdbbG9naWNhbEtleV07XG4gIGlmIChpc0Zvcm1zU3RvcmFnZUtleUNvbmZpZyhlbnRyeSkpIHtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc291cmNlRm9yS2V5KFxuICBjb25maWc6IEZvcm1zU3RvcmFnZUNvbmZpZyxcbiAgbG9naWNhbEtleTogc3RyaW5nXG4pOiBGb3Jtc1N0b3JhZ2VTb3VyY2Uge1xuICByZXR1cm4gKFxuICAgIGtleUNvbmZpZ0Zvcihjb25maWcsIGxvZ2ljYWxLZXkpPy5zb3VyY2UgPz9cbiAgICBjb25maWcuZGVmYXVsdFNvdXJjZSA/P1xuICAgIERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUcuZGVmYXVsdFNvdXJjZSA/P1xuICAgIFwibG9jYWxTdG9yYWdlXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBBcHBseSB1dGlsaXR5RmxhZ3MuaXNFbGltaW5hdGVCcm93c2VyU3RvcmFnZSBhcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC5cbiAqIFdoZW4gdHJ1ZSDihpIgcmVkdXhEYXRhOyB3aGVuIGZhbHNlL29taXR0ZWQg4oaSIGxvY2FsU3RvcmFnZSAob3ZlcnJpZGVzIGZvcm1zU3RvcmFnZS5kZWZhdWx0U291cmNlKS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRm9ybXNTdG9yYWdlQ29uZmlnU291cmNlcyhcbiAgY29uZmlnOiBGb3Jtc1N0b3JhZ2VDb25maWcsXG4gIHNvdXJjZTogRm9ybXNTdG9yYWdlU291cmNlXG4pOiBGb3Jtc1N0b3JhZ2VDb25maWcge1xuICBjb25zdCBuZXh0OiBGb3Jtc1N0b3JhZ2VDb25maWcgPSB7XG4gICAgLi4uY29uZmlnLFxuICAgIGRlZmF1bHRTb3VyY2U6IHNvdXJjZVxuICB9O1xuXG4gIGNvbnN0IG1lcmdlU3RhbmRhcmRLZXkgPSAoXG4gICAgbG9naWNhbEtleTogc3RyaW5nLFxuICAgIGJhc2U6IEZvcm1zU3RvcmFnZUtleUNvbmZpZ1xuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGtleUNvbmZpZ0Zvcihjb25maWcsIGxvZ2ljYWxLZXkpO1xuICAgIG5leHRbbG9naWNhbEtleV0gPSB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgLi4uKGV4aXN0aW5nID8/IHt9KSxcbiAgICAgIHNvdXJjZVxuICAgIH07XG4gIH07XG5cbiAgbWVyZ2VTdGFuZGFyZEtleShcInNlc3Npb25faWRcIiwgeyBrZXk6IFwic2Vzc2lvbl9pZFwiIH0pO1xuICBtZXJnZVN0YW5kYXJkS2V5KFwiZm9ybUtleVwiLCB7IGtleTogXCJmb3JtS2V5XCIgfSk7XG4gIG1lcmdlU3RhbmRhcmRLZXkoXCJsYW5ndWFnZVwiLCB7XG4gICAga2V5czpcbiAgICAgIGtleUNvbmZpZ0Zvcihjb25maWcsIFwibGFuZ3VhZ2VcIik/LmtleXMgPz9cbiAgICAgIERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUcubGFuZ3VhZ2U/LmtleXMgPz9cbiAgICAgIERFRkFVTFRfTEFOR1VBR0VfS0VZUyxcbiAgICBmYWxsYmFjazoga2V5Q29uZmlnRm9yKGNvbmZpZywgXCJsYW5ndWFnZVwiKT8uZmFsbGJhY2sgPz8gXCJlblwiXG4gIH0pO1xuXG4gIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJkZWZhdWx0U291cmNlXCIgfHwgU1RBTkRBUkRfTE9HSUNBTF9LRVlTLmluY2x1ZGVzKGtleSBhcyBhbnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnkgPSBjb25maWdba2V5XTtcbiAgICBpZiAoaXNGb3Jtc1N0b3JhZ2VLZXlDb25maWcoZW50cnkpKSB7XG4gICAgICBuZXh0W2tleV0gPSB7IC4uLmVudHJ5LCBzb3VyY2UgfTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZXh0O1xufVxuXG4vKiogTWVyZ2UgdXNlckNvbmZpZy5mb3Jtc1N0b3JhZ2Ugd2l0aCBkZWZhdWx0czsgbWFwIHV0aWxpdHlGbGFncyB3aGVuIHByZXNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvcm1zU3RvcmFnZUNvbmZpZyh1c2VyQ29uZmlnPzogYW55KTogRm9ybXNTdG9yYWdlQ29uZmlnIHtcbiAgY29uc3QgZnJvbVVzZXIgPSB1c2VyQ29uZmlnPy5mb3Jtc1N0b3JhZ2U7XG4gIGNvbnN0IGNvbmZpZzogRm9ybXNTdG9yYWdlQ29uZmlnID0ge1xuICAgIC4uLkRFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUcsXG4gICAgLi4uKGZyb21Vc2VyICYmIHR5cGVvZiBmcm9tVXNlciA9PT0gXCJvYmplY3RcIiA/IGZyb21Vc2VyIDoge30pXG4gIH07XG5cbiAgY29uc3QgZWxpbWluYXRlRmxhZyA9IHVzZXJDb25maWc/LnV0aWxpdHlGbGFncz8uaXNFbGltaW5hdGVCcm93c2VyU3RvcmFnZTtcbiAgY29uc3QgZWxpbWluYXRlID1cbiAgICB0eXBlb2YgZWxpbWluYXRlRmxhZyA9PT0gXCJib29sZWFuXCJcbiAgICAgID8gZWxpbWluYXRlRmxhZ1xuICAgICAgOiBERUZBVUxUX0ZPUk1TX0VMSU1JTkFURV9CUk9XU0VSX1NUT1JBR0U7XG5cbiAgY29uc3Qgc291cmNlOiBGb3Jtc1N0b3JhZ2VTb3VyY2UgPSBlbGltaW5hdGUgPyBcInJlZHV4RGF0YVwiIDogXCJsb2NhbFN0b3JhZ2VcIjtcblxuICByZXR1cm4gbm9ybWFsaXplRm9ybXNTdG9yYWdlQ29uZmlnU291cmNlcyhjb25maWcsIHNvdXJjZSk7XG59XG5cbi8qKiBSZXNvbHZlIGEgc3RyaW5nIHZhbHVlIGZvciBhIGxvZ2ljYWwgb3IgZXhwbGljaXQgc3RvcmFnZSBrZXkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvcm1zU3RvcmFnZVN0cmluZyhcbiAgbG9naWNhbEtleTogc3RyaW5nLFxuICByZWR1eERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGNvbmZpZz86IEZvcm1zU3RvcmFnZUNvbmZpZ1xuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gY29uZmlnID8/IERFRkFVTFRfRk9STVNfU1RPUkFHRV9DT05GSUc7XG4gIGNvbnN0IGtleUNmZyA9IGtleUNvbmZpZ0ZvcihyZXNvbHZlZENvbmZpZywgbG9naWNhbEtleSk7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUZvcktleShyZXNvbHZlZENvbmZpZywgbG9naWNhbEtleSk7XG5cbiAgaWYgKGtleUNmZz8ua2V5cz8ubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5Q2ZnLmtleXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgc291cmNlID09PSBcInJlZHV4RGF0YVwiXG4gICAgICAgICAgPyByZWFkUmVkdXhEYXRhU2NhbGFyKHJlZHV4RGF0YSwga2V5KVxuICAgICAgICAgIDogcmVhZExvY2FsU3RvcmFnZShrZXkpO1xuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGFzIHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleUNmZy5mYWxsYmFjayA/PyBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3RvcmFnZUtleSA9IGtleUNmZz8ua2V5ID8/IGxvZ2ljYWxLZXk7XG4gIGNvbnN0IHZhbHVlID1cbiAgICBzb3VyY2UgPT09IFwicmVkdXhEYXRhXCJcbiAgICAgID8gcmVhZFJlZHV4RGF0YVNjYWxhcihyZWR1eERhdGEsIHN0b3JhZ2VLZXkpXG4gICAgICA6IHJlYWRMb2NhbFN0b3JhZ2Uoc3RvcmFnZUtleSk7XG5cbiAgaWYgKGlzTm90RW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIGtleUNmZz8uZmFsbGJhY2sgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RydWN0dXJlZCB2YWx1ZSAoZm9ybSBjb25maWcgYmxvYiwgZU5hY2hGb3JtLCBldGMuKS5cbiAqIFN1cHBvcnRzIHRoZSBzYW1lIGxvZ2ljYWwga2V5IC8ga2V5c1tdIC8ga2V5IGFsaWFzIGNvbmZpZyBhcyByZXNvbHZlRm9ybXNTdG9yYWdlU3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvcm1zU3RvcmFnZU9iamVjdChcbiAgbG9naWNhbEtleTogc3RyaW5nLFxuICByZWR1eERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGNvbmZpZz86IEZvcm1zU3RvcmFnZUNvbmZpZ1xuKTogYW55IHtcbiAgY29uc3QgcmVzb2x2ZWRDb25maWcgPSBjb25maWcgPz8gREVGQVVMVF9GT1JNU19TVE9SQUdFX0NPTkZJRztcbiAgY29uc3Qga2V5Q2ZnID0ga2V5Q29uZmlnRm9yKHJlc29sdmVkQ29uZmlnLCBsb2dpY2FsS2V5KTtcbiAgY29uc3Qgc291cmNlID0gc291cmNlRm9yS2V5KHJlc29sdmVkQ29uZmlnLCBsb2dpY2FsS2V5KTtcblxuICBpZiAoa2V5Q2ZnPy5rZXlzPy5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlDZmcua2V5cykge1xuICAgICAgY29uc3QgdmFsdWUgPSByZWFkU3RvcmFnZU9iamVjdChzb3VyY2UsIHJlZHV4RGF0YSwga2V5KTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHN0b3JhZ2VLZXkgPSBrZXlDZmc/LmtleSA/PyBsb2dpY2FsS2V5O1xuICByZXR1cm4gcmVhZFN0b3JhZ2VPYmplY3Qoc291cmNlLCByZWR1eERhdGEsIHN0b3JhZ2VLZXkpO1xufVxuIl19