__vite_ssr_exportName__("runStreamInEnvironment", () => { try { return __vite_ssr_import_3__.runStreamInEnvironment } catch {} });
__vite_ssr_exportName__("followStreamInEnvironment", () => { try { return __vite_ssr_import_3__.followStreamInEnvironment } catch {} });
__vite_ssr_exportName__("createAtomCommandScheduler", () => { try { return createAtomCommandScheduler } catch {} });
__vite_ssr_exportName__("scheduleAtomCommandEffect", () => { try { return scheduleAtomCommandEffect } catch {} });
__vite_ssr_exportName__("runAtomCommand", () => { try { return runAtomCommand } catch {} });
__vite_ssr_exportName__("mapAtomCommandResult", () => { try { return mapAtomCommandResult } catch {} });
__vite_ssr_exportName__("isAtomCommandInterrupted", () => { try { return isAtomCommandInterrupted } catch {} });
__vite_ssr_exportName__("squashAtomCommandFailure", () => { try { return squashAtomCommandFailure } catch {} });
__vite_ssr_exportName__("settleAsyncResult", () => { try { return settleAsyncResult } catch {} });
__vite_ssr_exportName__("executeAtomCommand", () => { try { return executeAtomCommand } catch {} });
__vite_ssr_exportName__("executeAtomQuery", () => { try { return executeAtomQuery } catch {} });
__vite_ssr_exportName__("createRuntimeCommand", () => { try { return createRuntimeCommand } catch {} });
__vite_ssr_exportName__("reportAtomCommandResult", () => { try { return reportAtomCommandResult } catch {} });
__vite_ssr_exportName__("settlePromise", () => { try { return settlePromise } catch {} });
__vite_ssr_exportName__("environmentRpcKey", () => { try { return environmentRpcKey } catch {} });
__vite_ssr_exportName__("selectEnvironmentQueryData", () => { try { return selectEnvironmentQueryData } catch {} });
__vite_ssr_exportName__("createEnvironmentQueryAtomFamily", () => { try { return createEnvironmentQueryAtomFamily } catch {} });
__vite_ssr_exportName__("createEnvironmentSubscriptionAtomFamily", () => { try { return createEnvironmentSubscriptionAtomFamily } catch {} });
__vite_ssr_exportName__("createEnvironmentCommand", () => { try { return createEnvironmentCommand } catch {} });
__vite_ssr_exportName__("createEnvironmentRpcQueryAtomFamily", () => { try { return createEnvironmentRpcQueryAtomFamily } catch {} });
__vite_ssr_exportName__("createEnvironmentRpcSubscriptionAtomFamily", () => { try { return createEnvironmentRpcSubscriptionAtomFamily } catch {} });
__vite_ssr_exportName__("createEnvironmentRpcCommand", () => { try { return createEnvironmentRpcCommand } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/state/commandPermissions.ts", {"importedNames":["createCommandPermissions"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/state/environmentStreams.ts", {"importedNames":["followStreamInEnvironment"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/state/serverConfigProjection.ts", {"importedNames":["reuseUnchanged"]});
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/state/environmentStreams.ts", {"importedNames":["runStreamInEnvironment","followStreamInEnvironment"]});
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/index.ts", {"importedNames":["EnvironmentId"]});
const __vite_ssr_import_5__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Cause.js");
const __vite_ssr_import_6__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Effect.js");
const __vite_ssr_import_7__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Exit.js");
const __vite_ssr_import_8__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Option.js");
const __vite_ssr_import_9__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Schema.js");
const __vite_ssr_import_10__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Stream.js");
const __vite_ssr_import_11__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/SubscriptionRef.js");
const __vite_ssr_import_12__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/reactivity/index.js", {"importedNames":["AsyncResult","Atom","AtomRegistry"]});
const __vite_ssr_import_13__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/registry.ts");
const __vite_ssr_import_14__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/rpc/client.ts", {"importedNames":["EnvironmentRpcUnavailableError","request","requestGuarded","RpcPermissionGuard","subscribe"]});
const __vite_ssr_import_15__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/supervisor.ts");
















const isEnvironmentRpcUnavailable = __vite_ssr_import_9__.is((0,__vite_ssr_import_14__.EnvironmentRpcUnavailableError));
/**
* Holds back the unavailable failure of a query whose session went away. The
* query atom reruns when it sees that session change, so settling first would
* show a failure for a query that is about to retry. While `session` is still
* current no rerun is coming, and the failure stands.
*/
const pendingOnceSessionReplaced = (session) => (effect) => effect.pipe(
	// The query's error type is generic, so its tags are unknown to `catchTags`.
	__vite_ssr_import_6__.catchIf(isEnvironmentRpcUnavailable, (error) => __vite_ssr_import_15__.EnvironmentSupervisor.pipe(__vite_ssr_import_6__.flatMap((supervisor) => __vite_ssr_import_11__.get(supervisor.session)), __vite_ssr_import_6__.flatMap((current) => __vite_ssr_import_8__.isSome(current) && current.value === session ? __vite_ssr_import_6__.fail(error) : __vite_ssr_import_6__.never)))
);
async function settleAtomCommandResult(execute) {
	try {
		return await execute();
	} catch (defect) {
		return __vite_ssr_import_12__.AsyncResult.failure(__vite_ssr_import_5__.die(defect));
	}
}
function createAtomCommandScheduler() {
	const registryStates = new WeakMap();
	const stateFor = (registry) => {
		const existing = registryStates.get(registry);
		if (existing !== undefined) {
			return existing;
		};
		const state = {
			serial: new Map(),
			singleFlight: new Map(),
			latest: new Map()
		};
		registryStates.set(registry, state);
		return state;
	};
	return { schedule: (registry, concurrency, input, execute) => {
		if (concurrency.mode === "parallel") {
			return execute();
		};
		const key = concurrency.key(input);
		const state = stateFor(registry);
		if (concurrency.mode === "singleFlight") {
			const existing = state.singleFlight.get(key);
			if (existing !== undefined) {
				return existing;
			};
			const current = execute();
			state.singleFlight.set(key, current);
			void current.then(() => {
				if (state.singleFlight.get(key) === current) {
					state.singleFlight.delete(key);
				}
			}, () => {
				if (state.singleFlight.get(key) === current) {
					state.singleFlight.delete(key);
				}
			});
			return current;
		};
		if (concurrency.mode === "serial") {
			const previous = state.serial.get(key);
			const current = previous === undefined ? execute() : previous.then(execute, execute);
			state.serial.set(key, current);
			void current.then(() => {
				if (state.serial.get(key) === current) {
					state.serial.delete(key);
				}
			}, () => {
				if (state.serial.get(key) === current) {
					state.serial.delete(key);
				}
			});
			return current;
		};
		let lane = state.latest.get(key);
		if (lane === undefined) {
			lane = {
				running: false,
				pending: undefined
			};
			state.latest.set(key, lane);
		};
		const activeLane = lane;
		const result = new Promise((resolve) => {
			if (activeLane.pending === undefined) {
				activeLane.pending = {
					execute,
					resolve: [resolve]
				};
				return;
			};
			activeLane.pending.execute = execute;
			activeLane.pending.resolve.push(resolve);
		});
		if (!activeLane.running) {
			activeLane.running = true;
			void (async () => {
				while (activeLane.pending !== undefined) {
					const batch = activeLane.pending;
					activeLane.pending = undefined;
					let batchResult;
					try {
						batchResult = await batch.execute();
					} catch (defect) {
						batchResult = __vite_ssr_import_12__.AsyncResult.failure(__vite_ssr_import_5__.die(defect));
					};
					for (const resolve of batch.resolve) {
						resolve(batchResult);
					}
				};
				activeLane.running = false;
				if (state.latest.get(key) === activeLane) {
					state.latest.delete(key);
				}
			})();
		};
		return result;
	} };
};
const scheduleAtomCommandEffect = __vite_ssr_import_6__.fnUntraced(function* (registry, scheduler, concurrency, input, effect) {
	const context = yield* __vite_ssr_import_6__.context();
	const result = yield* __vite_ssr_import_6__.promise((signal) => scheduler.schedule(registry, concurrency, input, async () => {
		const exit = await __vite_ssr_import_6__.runPromiseExitWith(context)(effect, { signal });
		return __vite_ssr_import_7__.isSuccess(exit) ? __vite_ssr_import_12__.AsyncResult.success(exit.value) : __vite_ssr_import_12__.AsyncResult.failure(exit.cause);
	}));
	return result._tag === "Success" ? result.value : yield* __vite_ssr_import_6__.failCause(result.cause);
});
async function runAtomCommand(registry, command, input, options = {}, reporter = console) {
	const result = await settleAtomCommandResult(() => command.run(registry, input));
	reportAtomCommandResult(result, {
		...options,
		label: options.label ?? command.label
	}, reporter);
	return result;
};
function mapAtomCommandResult(result, map) {
	return result._tag === "Success" ? __vite_ssr_import_12__.AsyncResult.success(map(result.value)) : __vite_ssr_import_12__.AsyncResult.failure(result.cause);
};
function isAtomCommandInterrupted(result) {
	return result._tag === "Failure" && __vite_ssr_import_5__.hasInterruptsOnly(result.cause);
};
function squashAtomCommandFailure(result) {
	return __vite_ssr_import_5__.squash(result.cause);
};
async function settleAsyncResult(execute) {
	try {
		return __vite_ssr_import_12__.AsyncResult.fromExit(await execute());
	} catch (defect) {
		return __vite_ssr_import_12__.AsyncResult.failure(__vite_ssr_import_5__.die(defect));
	}
};
async function executeAtomCommand(execute, options = {}, reporter = console) {
	const result = await settleAsyncResult(execute);
	reportAtomCommandResult(result, options, reporter);
	return result;
};
async function executeAtomQuery(registry, atom, options = {}, reporter = console) {
	const query = __vite_ssr_import_6__.scoped(__vite_ssr_import_6__.gen(function* () {
		yield* __vite_ssr_import_12__.AtomRegistry.mount(registry, atom);
		if (options.refresh) {
			yield* __vite_ssr_import_6__.sync(() => {
				const current = registry.get(atom);
				if (current._tag !== "Initial" && !current.waiting) {
					registry.refresh(atom);
				}
			});
		};
		return yield* __vite_ssr_import_12__.AtomRegistry.getResult(registry, atom, { suspendOnWaiting: true });
	}));
	return executeAtomCommand(() => __vite_ssr_import_6__.runPromiseExit(query, { signal: options.signal }), options, reporter);
};
function createRuntimeCommand(runtime, options) {
	const scheduler = options.scheduler ?? createAtomCommandScheduler();
	const concurrency = options.concurrency ?? { mode: "parallel" };
	return {
		label: options.label,
		run: (registry, input) => settleAtomCommandResult(() => scheduler.schedule(registry, concurrency, input, () => {
			const atom = runtime.atom(options.execute(input, registry)).pipe(__vite_ssr_import_12__.Atom.withLabel(options.label));
			return executeAtomQuery(registry, atom, {
				reportDefect: false,
				reportFailure: false
			});
		}))
	};
};
function reportAtomCommandResult(result, options = {}, reporter = console) {
	if (__vite_ssr_import_12__.AsyncResult.isSuccess(result) || __vite_ssr_import_5__.hasInterruptsOnly(result.cause)) {
		return;
	};
	const label = options.label ?? "atom command";
	if (__vite_ssr_import_5__.hasDies(result.cause)) {
		if (options.reportDefect ?? true) {
			reporter.error(`[atom-command] ${label} defected`, result.cause);
		}
	} else if (options.reportFailure ?? true) {
		reporter.warn(`[atom-command] ${label} failed`, result.cause);
	}
};
async function settlePromise(execute) {
	try {
		return __vite_ssr_import_12__.AsyncResult.success(await execute());
	} catch (defect) {
		return __vite_ssr_import_12__.AsyncResult.failure(__vite_ssr_import_5__.die(defect));
	}
};
function environmentRpcKey(target) {
	return JSON.stringify([target.environmentId, target.input]);
};
function parseEnvironmentRpcKey(key) {
	const decoded = JSON.parse(key);
	return {
		environmentId: __vite_ssr_import_4__.EnvironmentId.make(decoded[0]),
		input: decoded[1]
	};
}
function runInEnvironment(environmentId, effect) {
	return __vite_ssr_import_13__.EnvironmentRegistry.pipe(__vite_ssr_import_6__.flatMap((registry) => registry.run(environmentId, effect)));
}
/**
* `Atom.makeRefreshOnSignal` subscribes to the signal, so a query that outlives its view on an
* idle TTL still re-runs on every change. Reading the signal as a dependency instead lets the
* registry re-run a mounted query right away and only mark an idle one stale, which then
* refreshes on its next read.
*/
const refreshOnSignalWhileRead = (signal, isFinal) => (self) => {
	// The signal value each registry's data was read under. Held outside the node because the
	// registry can sweep this node while `self` keeps the data, and the rebuilt node must still
	// see a change it missed.
	const readUnder = new WeakMap();
	return __vite_ssr_import_12__.Atom.transform(self, (get) => {
		const current = get(signal);
		get.subscribe(self, (value) => get.setSelf(value));
		const changed = readUnder.has(get.registry) && !Object.is(readUnder.get(get.registry), current);
		readUnder.set(get.registry, current);
		if (changed && !isFinal(get.once(self))) get.refresh(self);
		return get.once(self);
	}, { initialValueTarget: self });
};
const refreshEveryUntilFinal = (intervalMs, isFinal) => (self) => __vite_ssr_import_12__.Atom.transform(self, (get) => {
	const value = get(self);
	if (!isFinal(value)) {
		// @effect-diagnostics-next-line globalTimers:off - Mirrors `Atom.withRefresh`, outside an Effect runtime.
		const handle = setTimeout(() => get.refresh(self), intervalMs);
		get.addFinalizer(() => clearTimeout(handle));
	};
	return value;
}, { initialValueTarget: self });
/**
* A query result's data alone. A refetch always publishes a new result (a new
* timestamp, `waiting` on and off), while equal data keeps its identity, so a
* reader of only this skips the refetches that changed nothing.
*/
const selectEnvironmentQueryData = (result) => __vite_ssr_import_8__.getOrNull(__vite_ssr_import_12__.AsyncResult.value(result));
function createEnvironmentQueryAtomFamily(runtime, options) {
	const connectionAtom = __vite_ssr_import_12__.Atom.family((environmentId) => runtime.atom((0,__vite_ssr_import_1__.followStreamInEnvironment)(environmentId, __vite_ssr_import_10__.unwrap(__vite_ssr_import_15__.EnvironmentSupervisor.pipe(__vite_ssr_import_6__.map((supervisor) => __vite_ssr_import_11__.changes(supervisor.state).pipe(__vite_ssr_import_10__.zipLatest(__vite_ssr_import_11__.changes(supervisor.session))))))), { initialValue: null }));
	const family = __vite_ssr_import_12__.Atom.family((key) => {
		const target = parseEnvironmentRpcKey(key);
		const idleTtlMs = options.idleTtlMs ?? 5 * 6e4;
		const queryAtom = runtime.atom((get) => {
			const connection = __vite_ssr_import_8__.getOrNull(__vite_ssr_import_12__.AsyncResult.value(get(connectionAtom(target.environmentId))));
			// A refetch that returns equal content keeps the previous value's
			// references, so readers of the data skip re-rendering on idle polls.
			const share = (value) => (0,__vite_ssr_import_2__.reuseUnchanged)(__vite_ssr_import_8__.getOrUndefined(__vite_ssr_import_8__.flatMap(get.self(), __vite_ssr_import_12__.AsyncResult.value)), value);
			const emit = (value) => __vite_ssr_import_6__.sync(() => get.setSelf(__vite_ssr_import_12__.AsyncResult.success(share(value), { waiting: true }))).pipe(
				// A value set while the atom builds wins over the build's own
				// result, so a query that then settled synchronously would stay
				// waiting forever. Suspend on a promise (`yieldNow` is drained
				// inside the build) so the settled result arrives asynchronously.
				__vite_ssr_import_6__.andThen(__vite_ssr_import_6__.promise(() => Promise.resolve()))
			);
			const execute = () => {
				if (connection === null) return __vite_ssr_import_6__.never;
				const [connectionState, session] = connection;
				switch (connectionState.phase) {
					case "connected": return __vite_ssr_import_8__.isSome(session) ? runInEnvironment(target.environmentId, options.execute(target.input, emit).pipe(pendingOnceSessionReplaced(session.value))) : __vite_ssr_import_6__.never;
					case "connecting":
					case "backoff": return __vite_ssr_import_6__.never;
					case "available":
					case "offline":
					case "blocked":
						if (connectionState.lastFailure !== null) {
							return __vite_ssr_import_6__.fail(connectionState.lastFailure);
						};
						return __vite_ssr_import_6__.fail(new __vite_ssr_import_14__.EnvironmentRpcUnavailableError({
							environmentId: target.environmentId,
							message: `Environment ${target.environmentId} is ${connectionState.phase === "available" ? "not connected" : connectionState.phase}.`
						}));
				}
			};
			if (!options.persistence) return execute().pipe(__vite_ssr_import_6__.map(share));
			const persistence = options.persistence;
			const cacheKey = JSON.stringify([options.label, target.input]);
			const previous = __vite_ssr_import_8__.flatMap(get.self(), __vite_ssr_import_12__.AsyncResult.value);
			return __vite_ssr_import_6__.gen(function* () {
				const cached = __vite_ssr_import_8__.isSome(previous) ? previous : yield* persistence.load(target.environmentId, cacheKey);
				if (__vite_ssr_import_8__.isSome(cached) && (connection === null || connection[0].phase !== "connected")) {
					return cached.value;
				};
				if (__vite_ssr_import_8__.isNone(previous) && __vite_ssr_import_8__.isSome(cached)) yield* emit(cached.value);
				return yield* execute().pipe(__vite_ssr_import_6__.map(share), __vite_ssr_import_6__.tap((value) => persistence.save(target.environmentId, cacheKey, value)));
			});
		}).pipe(__vite_ssr_import_12__.Atom.swr({
			staleTime: options.staleTimeMs ?? 3e4,
			revalidateOnMount: true
		}), __vite_ssr_import_12__.Atom.setIdleTTL(idleTtlMs));
		const isFinal = (result) => options.isFinal !== undefined && __vite_ssr_import_8__.exists(__vite_ssr_import_12__.AsyncResult.value(result), options.isFinal);
		const intervalQuery = options.refreshIntervalMs === undefined ? queryAtom : queryAtom.pipe(refreshEveryUntilFinal(options.refreshIntervalMs, isFinal));
		const refreshTrigger = options.refreshTrigger?.(target);
		return (refreshTrigger === undefined ? intervalQuery : intervalQuery.pipe(refreshOnSignalWhileRead(refreshTrigger, isFinal))).pipe(__vite_ssr_import_12__.Atom.setIdleTTL(idleTtlMs), __vite_ssr_import_12__.Atom.withLabel(`${options.label}:${key}`));
	});
	return (target) => family(environmentRpcKey(target));
};
function createEnvironmentSubscriptionAtomFamily(runtime, options) {
	const family = __vite_ssr_import_12__.Atom.family((key) => {
		const target = parseEnvironmentRpcKey(key);
		return runtime.atom(__vite_ssr_import_10__.suspend(() => (0,__vite_ssr_import_1__.followStreamInEnvironment)(target.environmentId, options.subscribe(target.input))).pipe(options.completeWhen ? __vite_ssr_import_10__.takeUntil(options.completeWhen) : (stream) => stream)).pipe(__vite_ssr_import_12__.Atom.setIdleTTL(options.idleTtlMs ?? 5 * 6e4), __vite_ssr_import_12__.Atom.withLabel(options.sensitiveInput ? `${options.label}:${target.environmentId}` : `${options.label}:${key}`));
	});
	return (target) => family(environmentRpcKey(target));
};
function createEnvironmentCommand(runtime, options) {
	return createRuntimeCommand(runtime, {
		label: options.label,
		...options.scheduler === undefined ? {} : { scheduler: options.scheduler },
		...options.concurrency === undefined ? {} : { concurrency: options.concurrency },
		execute: (target, registry) => runInEnvironment(target.environmentId, options.execute(target.input, registry, target.environmentId))
	});
};
function createEnvironmentRpcQueryAtomFamily(runtime, options) {
	return createEnvironmentQueryAtomFamily(runtime, {
		label: options.label,
		...options.persistence === undefined ? {} : { persistence: options.persistence },
		...options.staleTimeMs === undefined ? {} : { staleTimeMs: options.staleTimeMs },
		...options.idleTtlMs === undefined ? {} : { idleTtlMs: options.idleTtlMs },
		...options.refreshIntervalMs === undefined ? {} : { refreshIntervalMs: options.refreshIntervalMs },
		...options.refreshTrigger === undefined ? {} : { refreshTrigger: options.refreshTrigger },
		...options.isFinal === undefined ? {} : { isFinal: options.isFinal },
		execute: (input, emit) => options.execute?.(input, emit) ?? (0,__vite_ssr_import_14__.request)(options.tag, input)
	});
};
function createEnvironmentRpcSubscriptionAtomFamily(runtime, options) {
	return createEnvironmentSubscriptionAtomFamily(runtime, {
		label: options.label,
		...options.completeWhen === undefined ? {} : { completeWhen: options.completeWhen },
		...options.idleTtlMs === undefined ? {} : { idleTtlMs: options.idleTtlMs },
		subscribe: (input) => {
			const stream = (0,__vite_ssr_import_14__.subscribe)(options.tag, input);
			return options.transform === undefined ? stream : options.transform(stream);
		}
	});
};
function createEnvironmentRpcCommand(runtime, options) {
	const permissions = (0,__vite_ssr_import_0__.createCommandPermissions)(runtime, options.tag);
	const command = createEnvironmentCommand(runtime, {
		label: options.label,
		...options.scheduler === undefined ? {} : { scheduler: options.scheduler },
		...options.concurrency === undefined ? {} : { concurrency: options.concurrency },
		execute: (input, registry, environmentId) => {
			const target = {
				environmentId,
				input
			};
			// Routing requires consent on the origin as well as the actual destination.
			// The transport check below deliberately checks the destination again.
			return permissions.authorize(registry, environmentId, input).pipe(__vite_ssr_import_6__.andThen(() => options.execute?.(input) ?? (0,__vite_ssr_import_14__.requestGuarded)(options.tag, input)), __vite_ssr_import_6__.provideService((0,__vite_ssr_import_14__.RpcPermissionGuard), { authorize: (id, method, payload) => (0,__vite_ssr_import_0__.createCommandPermissions)(runtime, method).authorize(registry, id, payload) }), __vite_ssr_import_6__.tap((result) => options.onSuccess?.(target, registry, result) ?? __vite_ssr_import_6__.void), __vite_ssr_import_6__.ensuring(options.onSettled?.(target, registry) ?? __vite_ssr_import_6__.void));
		}
	});
	return {
		...command,
		requiredScopes: permissions.requiredScopes,
		permissionAtom: permissions.permissionAtom
	};
}
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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Q2I7SUFDQTtHQUNGOzs7R0FHQSxPQUFPLFlBQVksVUFBVSxVQUFVLGVBQWUsS0FBSyxDQUFDLENBQUMsS0FDM0Qsc0JBQU8sY0FBYyxRQUFRLFVBQVUsS0FBSyxLQUFLLDBDQUFlLFFBQVEsS0FBSyxLQUFLLENBQUMsR0FDbkYsc0JBQU8sa0JBQWUsNENBQW9CLEVBQ3hDLFlBQVksSUFBSSxRQUFRLFlBQ3RCLG1EQUF5QixTQUFTLE1BQU0sQ0FBQyxDQUFDLFVBQVUsVUFBVSxJQUFJLE9BQU8sRUFDN0UsQ0FBQyxHQUNELHNCQUFPLEtBQUssV0FBVyxRQUFRLFlBQVksUUFBUSxVQUFVLE1BQU0sS0FBSyxzQkFBTyxJQUFJLEdBQ25GLHNCQUFPLFNBQVMsUUFBUSxZQUFZLFFBQVEsUUFBUSxLQUFLLHNCQUFPLElBQUksQ0FDdEU7RUFDRjtDQUNGLENBQUM7Q0FDRCxPQUFPO0VBQ0wsR0FBRztFQUNILGdCQUFnQixZQUFZO0VBQzVCLGdCQUFnQixZQUFZO0NBQzlCO0FBQ0YiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbInJ1bnRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBRdWVyeVBlcnNpc3RlbmNlIH0gZnJvbSBcIi4vcXVlcnlQZXJzaXN0ZW5jZS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29tbWFuZFBlcm1pc3Npb25zIH0gZnJvbSBcIi4vY29tbWFuZFBlcm1pc3Npb25zLnRzXCI7XG5pbXBvcnQgeyBmb2xsb3dTdHJlYW1JbkVudmlyb25tZW50IH0gZnJvbSBcIi4vZW52aXJvbm1lbnRTdHJlYW1zLnRzXCI7XG5pbXBvcnQgeyByZXVzZVVuY2hhbmdlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1Byb2plY3Rpb24udHNcIjtcbmV4cG9ydCB7IHJ1blN0cmVhbUluRW52aXJvbm1lbnQsIGZvbGxvd1N0cmVhbUluRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9lbnZpcm9ubWVudFN0cmVhbXMudHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2xpZW50R3VhcmRlZFJwY1RhZyxcbiAgRW52aXJvbm1lbnRJZCxcbiAgdHlwZSBFbnZpcm9ubWVudElkIGFzIEVudmlyb25tZW50SWRUeXBlLFxufSBmcm9tIFwiQHQzdG9vbHMvY29udHJhY3RzXCI7XG5pbXBvcnQgKiBhcyBDYXVzZSBmcm9tIFwiZWZmZWN0L0NhdXNlXCI7XG5pbXBvcnQgKiBhcyBFZmZlY3QgZnJvbSBcImVmZmVjdC9FZmZlY3RcIjtcbmltcG9ydCAqIGFzIEV4aXQgZnJvbSBcImVmZmVjdC9FeGl0XCI7XG5pbXBvcnQgKiBhcyBPcHRpb24gZnJvbSBcImVmZmVjdC9PcHRpb25cIjtcbmltcG9ydCAqIGFzIFNjaGVtYSBmcm9tIFwiZWZmZWN0L1NjaGVtYVwiO1xuaW1wb3J0ICogYXMgU3RyZWFtIGZyb20gXCJlZmZlY3QvU3RyZWFtXCI7XG5pbXBvcnQgKiBhcyBTdWJzY3JpcHRpb25SZWYgZnJvbSBcImVmZmVjdC9TdWJzY3JpcHRpb25SZWZcIjtcbmltcG9ydCB7IEFzeW5jUmVzdWx0LCBBdG9tLCBBdG9tUmVnaXN0cnkgfSBmcm9tIFwiZWZmZWN0L3JlYWN0aXZpdHlcIjtcblxuaW1wb3J0IHR5cGUgeyBDb25uZWN0aW9uQXR0ZW1wdEVycm9yIH0gZnJvbSBcIi4uL2Nvbm5lY3Rpb24vbW9kZWwudHNcIjtcbmltcG9ydCAqIGFzIEVudmlyb25tZW50UmVnaXN0cnkgZnJvbSBcIi4uL2Nvbm5lY3Rpb24vcmVnaXN0cnkudHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW52aXJvbm1lbnRScGNJbnB1dCxcbiAgdHlwZSBFbnZpcm9ubWVudFJwY1N1Y2Nlc3MsXG4gIHR5cGUgRW52aXJvbm1lbnRScGNGYWlsdXJlLFxuICB0eXBlIEVudmlyb25tZW50UnBjU3RyZWFtRmFpbHVyZSxcbiAgdHlwZSBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlLFxuICB0eXBlIEVudmlyb25tZW50U3Vic2NyaXB0aW9uUnBjVGFnLFxuICB0eXBlIEVudmlyb25tZW50VW5hcnlScGNUYWcsXG4gIEVudmlyb25tZW50UnBjVW5hdmFpbGFibGVFcnJvcixcbiAgcmVxdWVzdCxcbiAgcmVxdWVzdEd1YXJkZWQsXG4gIFJwY1Blcm1pc3Npb25HdWFyZCxcbiAgc3Vic2NyaWJlLFxufSBmcm9tIFwiLi4vcnBjL2NsaWVudC50c1wiO1xuaW1wb3J0ICogYXMgRW52aXJvbm1lbnRTdXBlcnZpc29yIGZyb20gXCIuLi9jb25uZWN0aW9uL3N1cGVydmlzb3IudHNcIjtcbmltcG9ydCB0eXBlICogYXMgUnBjU2Vzc2lvbiBmcm9tIFwiLi4vcnBjL3Nlc3Npb24udHNcIjtcblxuY29uc3QgaXNFbnZpcm9ubWVudFJwY1VuYXZhaWxhYmxlID0gU2NoZW1hLmlzKEVudmlyb25tZW50UnBjVW5hdmFpbGFibGVFcnJvcik7XG5cbi8qKlxuICogSG9sZHMgYmFjayB0aGUgdW5hdmFpbGFibGUgZmFpbHVyZSBvZiBhIHF1ZXJ5IHdob3NlIHNlc3Npb24gd2VudCBhd2F5LiBUaGVcbiAqIHF1ZXJ5IGF0b20gcmVydW5zIHdoZW4gaXQgc2VlcyB0aGF0IHNlc3Npb24gY2hhbmdlLCBzbyBzZXR0bGluZyBmaXJzdCB3b3VsZFxuICogc2hvdyBhIGZhaWx1cmUgZm9yIGEgcXVlcnkgdGhhdCBpcyBhYm91dCB0byByZXRyeS4gV2hpbGUgYHNlc3Npb25gIGlzIHN0aWxsXG4gKiBjdXJyZW50IG5vIHJlcnVuIGlzIGNvbWluZywgYW5kIHRoZSBmYWlsdXJlIHN0YW5kcy5cbiAqL1xuY29uc3QgcGVuZGluZ09uY2VTZXNzaW9uUmVwbGFjZWQgPVxuICAoc2Vzc2lvbjogUnBjU2Vzc2lvbi5ScGNTZXNzaW9uKSA9PlxuICA8QSwgRSwgUj4oZWZmZWN0OiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+KSA9PlxuICAgIGVmZmVjdC5waXBlKFxuICAgICAgLy8gVGhlIHF1ZXJ5J3MgZXJyb3IgdHlwZSBpcyBnZW5lcmljLCBzbyBpdHMgdGFncyBhcmUgdW5rbm93biB0byBgY2F0Y2hUYWdzYC5cbiAgICAgIEVmZmVjdC5jYXRjaElmKGlzRW52aXJvbm1lbnRScGNVbmF2YWlsYWJsZSwgKGVycm9yKSA9PlxuICAgICAgICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKHN1cGVydmlzb3IpID0+IFN1YnNjcmlwdGlvblJlZi5nZXQoc3VwZXJ2aXNvci5zZXNzaW9uKSksXG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKGN1cnJlbnQpID0+XG4gICAgICAgICAgICBPcHRpb24uaXNTb21lKGN1cnJlbnQpICYmIGN1cnJlbnQudmFsdWUgPT09IHNlc3Npb24gPyBFZmZlY3QuZmFpbChlcnJvcikgOiBFZmZlY3QubmV2ZXIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuaW50ZXJmYWNlIEVudmlyb25tZW50QXRvbU9wdGlvbnM8SW5wdXQsIEEsIEUsIFI+IHtcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhlY3V0ZTogKGlucHV0OiBJbnB1dCkgPT4gRWZmZWN0LkVmZmVjdDxBLCBFLCBSPjtcbiAgcmVhZG9ubHkgc2NoZWR1bGVyPzogQXRvbUNvbW1hbmRTY2hlZHVsZXI7XG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogQXRvbUNvbW1hbmRDb25jdXJyZW5jeTx7XG4gICAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGU7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IElucHV0O1xuICB9Pjtcbn1cblxuaW50ZXJmYWNlIEVudmlyb25tZW50Q29tbWFuZEF0b21PcHRpb25zPElucHV0LCBBLCBFLCBSPiBleHRlbmRzIE9taXQ8XG4gIEVudmlyb25tZW50QXRvbU9wdGlvbnM8SW5wdXQsIEEsIEUsIFI+LFxuICBcImV4ZWN1dGVcIlxuPiB7XG4gIHJlYWRvbmx5IGV4ZWN1dGU6IChcbiAgICBpbnB1dDogSW5wdXQsXG4gICAgcmVnaXN0cnk6IEF0b21SZWdpc3RyeS5BdG9tUmVnaXN0cnksXG4gICAgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGUsXG4gICkgPT4gRWZmZWN0LkVmZmVjdDxBLCBFLCBSPjtcbn1cblxuaW50ZXJmYWNlIEVudmlyb25tZW50UXVlcnlBdG9tT3B0aW9uczxJbnB1dCwgQSwgRSwgUj4gZXh0ZW5kcyBPbWl0PFxuICBFbnZpcm9ubWVudEF0b21PcHRpb25zPElucHV0LCBBLCBFLCBSPixcbiAgXCJleGVjdXRlXCJcbj4ge1xuICAvKipcbiAgICogYGVtaXRgIHNob3dzIGEgcHJvdmlzaW9uYWwgdmFsdWUgd2hpbGUgdGhlIHF1ZXJ5IGtlZXBzIHdhaXRpbmcuIFRoZSBzZXR0bGVkXG4gICAqIHJlc3VsdCByZXBsYWNlcyBpdCwgc28gY2F0Y2ggZmFpbHVyZXMgdGhhdCBzaG91bGQga2VlcCBpdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBleGVjdXRlOiAoXG4gICAgaW5wdXQ6IElucHV0LFxuICAgIGVtaXQ6ICh2YWx1ZTogQSkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPixcbiAgKSA9PiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+O1xuICByZWFkb25seSBwZXJzaXN0ZW5jZT86IFF1ZXJ5UGVyc2lzdGVuY2U8QT47XG4gIHJlYWRvbmx5IHN0YWxlVGltZU1zPzogbnVtYmVyO1xuICByZWFkb25seSBpZGxlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICByZWFkb25seSByZWZyZXNoVHJpZ2dlcj86ICh0YXJnZXQ6IHtcbiAgICByZWFkb25seSBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkVHlwZTtcbiAgICByZWFkb25seSBpbnB1dDogSW5wdXQ7XG4gIH0pID0+IEF0b20uQXRvbTx1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgaXNGaW5hbD86ICh2YWx1ZTogQSkgPT4gYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEVudmlyb25tZW50U3Vic2NyaXB0aW9uQXRvbU9wdGlvbnM8SW5wdXQsIEEsIEUsIFI+IHtcbiAgcmVhZG9ubHkgc2Vuc2l0aXZlSW5wdXQ/OiBib29sZWFuO1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBzdWJzY3JpYmU6IChpbnB1dDogSW5wdXQpID0+IFN0cmVhbS5TdHJlYW08QSwgRSwgUj47XG4gIHJlYWRvbmx5IGNvbXBsZXRlV2hlbj86ICh2YWx1ZTogQSkgPT4gYm9vbGVhbjtcbiAgcmVhZG9ubHkgaWRsZVR0bE1zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXR0bGVkQXN5bmNSZXN1bHQ8QSwgRT4gPSBBc3luY1Jlc3VsdC5TdWNjZXNzPEEsIEU+IHwgQXN5bmNSZXN1bHQuRmFpbHVyZTxBLCBFPjtcblxuZXhwb3J0IHR5cGUgQXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4gPSBTZXR0bGVkQXN5bmNSZXN1bHQ8QSwgRT47XG5cbmV4cG9ydCB0eXBlIEF0b21Db21tYW5kU3VjY2VzczxSPiA9IFIgZXh0ZW5kcyBBdG9tQ29tbWFuZFJlc3VsdDxpbmZlciBBLCBpbmZlciBfRT4gPyBBIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEF0b21Db21tYW5kRmFpbHVyZTxSPiA9IFIgZXh0ZW5kcyBBdG9tQ29tbWFuZFJlc3VsdDxpbmZlciBfQSwgaW5mZXIgRT4gPyBFIDogbmV2ZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXRvbUNvbW1hbmRPcHRpb25zIHtcbiAgcmVhZG9ubHkgbGFiZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG9ydEZhaWx1cmU/OiBib29sZWFuO1xuICByZWFkb25seSByZXBvcnREZWZlY3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0b21Db21tYW5kUmVwb3J0ZXIge1xuICByZWFkb25seSB3YXJuOiAobWVzc2FnZTogc3RyaW5nLCBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4pID0+IHZvaWQ7XG4gIHJlYWRvbmx5IGVycm9yOiAobWVzc2FnZTogc3RyaW5nLCBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXRvbUNvbW1hbmQ8VywgQSwgRT4ge1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBydW46IChyZWdpc3RyeTogQXRvbVJlZ2lzdHJ5LkF0b21SZWdpc3RyeSwgaW5wdXQ6IFcpID0+IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+O1xufVxuXG5leHBvcnQgdHlwZSBBdG9tQ29tbWFuZENvbmN1cnJlbmN5PFc+ID1cbiAgfCB7IHJlYWRvbmx5IG1vZGU6IFwicGFyYWxsZWxcIiB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgbW9kZTogXCJzZXJpYWxcIiB8IFwic2luZ2xlRmxpZ2h0XCIgfCBcImxhdGVzdFwiO1xuICAgICAgcmVhZG9ubHkga2V5OiAoaW5wdXQ6IFcpID0+IHN0cmluZztcbiAgICB9O1xuXG5pbnRlcmZhY2UgQXRvbUNvbW1hbmRTY2hlZHVsZXJTdGF0ZSB7XG4gIHJlYWRvbmx5IHNlcmlhbDogTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj47XG4gIHJlYWRvbmx5IHNpbmdsZUZsaWdodDogTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj47XG4gIHJlYWRvbmx5IGxhdGVzdDogTWFwPHN0cmluZywgQXRvbUNvbW1hbmRMYXRlc3RMYW5lPjtcbn1cblxuaW50ZXJmYWNlIEF0b21Db21tYW5kTGF0ZXN0QmF0Y2gge1xuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPEF0b21Db21tYW5kUmVzdWx0PHVua25vd24sIHVua25vd24+PjtcbiAgcmVhZG9ubHkgcmVzb2x2ZTogQXJyYXk8KHJlc3VsdDogQXRvbUNvbW1hbmRSZXN1bHQ8dW5rbm93biwgdW5rbm93bj4pID0+IHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgQXRvbUNvbW1hbmRMYXRlc3RMYW5lIHtcbiAgcnVubmluZzogYm9vbGVhbjtcbiAgcGVuZGluZzogQXRvbUNvbW1hbmRMYXRlc3RCYXRjaCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdG9tQ29tbWFuZFNjaGVkdWxlciB7XG4gIHJlYWRvbmx5IHNjaGVkdWxlOiA8VywgQSwgRT4oXG4gICAgcmVnaXN0cnk6IEF0b21SZWdpc3RyeS5BdG9tUmVnaXN0cnksXG4gICAgY29uY3VycmVuY3k6IEF0b21Db21tYW5kQ29uY3VycmVuY3k8Vz4sXG4gICAgaW5wdXQ6IFcsXG4gICAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTxBdG9tQ29tbWFuZFJlc3VsdDxBLCBFPj4sXG4gICkgPT4gUHJvbWlzZTxBdG9tQ29tbWFuZFJlc3VsdDxBLCBFPj47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHRsZUF0b21Db21tYW5kUmVzdWx0PEEsIEU+KFxuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPEF0b21Db21tYW5kUmVzdWx0PEEsIEU+Pixcbik6IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSgpO1xuICB9IGNhdGNoIChkZWZlY3QpIHtcbiAgICByZXR1cm4gQXN5bmNSZXN1bHQuZmFpbHVyZShDYXVzZS5kaWUoZGVmZWN0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0b21Db21tYW5kU2NoZWR1bGVyKCk6IEF0b21Db21tYW5kU2NoZWR1bGVyIHtcbiAgY29uc3QgcmVnaXN0cnlTdGF0ZXMgPSBuZXcgV2Vha01hcDxBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5LCBBdG9tQ29tbWFuZFNjaGVkdWxlclN0YXRlPigpO1xuXG4gIGNvbnN0IHN0YXRlRm9yID0gKHJlZ2lzdHJ5OiBBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5KTogQXRvbUNvbW1hbmRTY2hlZHVsZXJTdGF0ZSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSByZWdpc3RyeVN0YXRlcy5nZXQocmVnaXN0cnkpO1xuICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlOiBBdG9tQ29tbWFuZFNjaGVkdWxlclN0YXRlID0ge1xuICAgICAgc2VyaWFsOiBuZXcgTWFwKCksXG4gICAgICBzaW5nbGVGbGlnaHQ6IG5ldyBNYXAoKSxcbiAgICAgIGxhdGVzdDogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgcmVnaXN0cnlTdGF0ZXMuc2V0KHJlZ2lzdHJ5LCBzdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2NoZWR1bGU6IDxXLCBBLCBFPihcbiAgICAgIHJlZ2lzdHJ5OiBBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5LFxuICAgICAgY29uY3VycmVuY3k6IEF0b21Db21tYW5kQ29uY3VycmVuY3k8Vz4sXG4gICAgICBpbnB1dDogVyxcbiAgICAgIGV4ZWN1dGU6ICgpID0+IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+LFxuICAgICk6IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+ID0+IHtcbiAgICAgIGlmIChjb25jdXJyZW5jeS5tb2RlID09PSBcInBhcmFsbGVsXCIpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGUoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gY29uY3VycmVuY3kua2V5KGlucHV0KTtcbiAgICAgIGNvbnN0IHN0YXRlID0gc3RhdGVGb3IocmVnaXN0cnkpO1xuICAgICAgaWYgKGNvbmN1cnJlbmN5Lm1vZGUgPT09IFwic2luZ2xlRmxpZ2h0XCIpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBzdGF0ZS5zaW5nbGVGbGlnaHQuZ2V0KGtleSkgYXNcbiAgICAgICAgICB8IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBleGVjdXRlKCk7XG4gICAgICAgIHN0YXRlLnNpbmdsZUZsaWdodC5zZXQoa2V5LCBjdXJyZW50KTtcbiAgICAgICAgdm9pZCBjdXJyZW50LnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnNpbmdsZUZsaWdodC5nZXQoa2V5KSA9PT0gY3VycmVudCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zaW5nbGVGbGlnaHQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2luZ2xlRmxpZ2h0LmdldChrZXkpID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNpbmdsZUZsaWdodC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmN1cnJlbmN5Lm1vZGUgPT09IFwic2VyaWFsXCIpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBzdGF0ZS5zZXJpYWwuZ2V0KGtleSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwcmV2aW91cyA9PT0gdW5kZWZpbmVkID8gZXhlY3V0ZSgpIDogcHJldmlvdXMudGhlbihleGVjdXRlLCBleGVjdXRlKTtcbiAgICAgICAgc3RhdGUuc2VyaWFsLnNldChrZXksIGN1cnJlbnQpO1xuICAgICAgICB2b2lkIGN1cnJlbnQudGhlbihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2VyaWFsLmdldChrZXkpID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlcmlhbC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zZXJpYWwuZ2V0KGtleSkgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VyaWFsLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBsZXQgbGFuZSA9IHN0YXRlLmxhdGVzdC5nZXQoa2V5KTtcbiAgICAgIGlmIChsYW5lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGFuZSA9IHsgcnVubmluZzogZmFsc2UsIHBlbmRpbmc6IHVuZGVmaW5lZCB9O1xuICAgICAgICBzdGF0ZS5sYXRlc3Quc2V0KGtleSwgbGFuZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBhY3RpdmVMYW5lID0gbGFuZTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmVMYW5lLnBlbmRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdGl2ZUxhbmUucGVuZGluZyA9IHtcbiAgICAgICAgICAgIGV4ZWN1dGU6IGV4ZWN1dGUgYXMgKCkgPT4gUHJvbWlzZTxBdG9tQ29tbWFuZFJlc3VsdDx1bmtub3duLCB1bmtub3duPj4sXG4gICAgICAgICAgICByZXNvbHZlOiBbcmVzb2x2ZSBhcyAocmVzdWx0OiBBdG9tQ29tbWFuZFJlc3VsdDx1bmtub3duLCB1bmtub3duPikgPT4gdm9pZF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWN0aXZlTGFuZS5wZW5kaW5nLmV4ZWN1dGUgPSBleGVjdXRlIGFzICgpID0+IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8dW5rbm93biwgdW5rbm93bj4+O1xuICAgICAgICBhY3RpdmVMYW5lLnBlbmRpbmcucmVzb2x2ZS5wdXNoKFxuICAgICAgICAgIHJlc29sdmUgYXMgKHJlc3VsdDogQXRvbUNvbW1hbmRSZXN1bHQ8dW5rbm93biwgdW5rbm93bj4pID0+IHZvaWQsXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFhY3RpdmVMYW5lLnJ1bm5pbmcpIHtcbiAgICAgICAgYWN0aXZlTGFuZS5ydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHdoaWxlIChhY3RpdmVMYW5lLnBlbmRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBhY3RpdmVMYW5lLnBlbmRpbmc7XG4gICAgICAgICAgICBhY3RpdmVMYW5lLnBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgYmF0Y2hSZXN1bHQ6IEF0b21Db21tYW5kUmVzdWx0PHVua25vd24sIHVua25vd24+O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYmF0Y2hSZXN1bHQgPSBhd2FpdCBiYXRjaC5leGVjdXRlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChkZWZlY3QpIHtcbiAgICAgICAgICAgICAgYmF0Y2hSZXN1bHQgPSBBc3luY1Jlc3VsdC5mYWlsdXJlKENhdXNlLmRpZShkZWZlY3QpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiBiYXRjaC5yZXNvbHZlKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoYmF0Y2hSZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVMYW5lLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoc3RhdGUubGF0ZXN0LmdldChrZXkpID09PSBhY3RpdmVMYW5lKSB7XG4gICAgICAgICAgICBzdGF0ZS5sYXRlc3QuZGVsZXRlKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBzY2hlZHVsZUF0b21Db21tYW5kRWZmZWN0ID1cbiAgLyogRXZlcnkgYXRvbSBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIHRoaXMgc2NoZWR1bGVyOyB0aGUgY29tbWFuZCBvd25zIGl0cyB0cmFjaW5nIGJvdW5kYXJ5LiAqL1xuICBFZmZlY3QuZm5VbnRyYWNlZChmdW5jdGlvbiogPFcsIEEsIEUsIFI+KFxuICAgIHJlZ2lzdHJ5OiBBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5LFxuICAgIHNjaGVkdWxlcjogQXRvbUNvbW1hbmRTY2hlZHVsZXIsXG4gICAgY29uY3VycmVuY3k6IEF0b21Db21tYW5kQ29uY3VycmVuY3k8Vz4sXG4gICAgaW5wdXQ6IFcsXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuICApOiBFZmZlY3QuZm4uUmV0dXJuPEEsIEUsIFI+IHtcbiAgICBjb25zdCBjb250ZXh0ID0geWllbGQqIEVmZmVjdC5jb250ZXh0PFI+KCk7XG4gICAgY29uc3QgcmVzdWx0ID0geWllbGQqIEVmZmVjdC5wcm9taXNlKChzaWduYWwpID0+XG4gICAgICBzY2hlZHVsZXIuc2NoZWR1bGU8VywgQSwgRT4ocmVnaXN0cnksIGNvbmN1cnJlbmN5LCBpbnB1dCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBleGl0ID0gYXdhaXQgRWZmZWN0LnJ1blByb21pc2VFeGl0V2l0aChjb250ZXh0KShlZmZlY3QsIHsgc2lnbmFsIH0pO1xuICAgICAgICByZXR1cm4gRXhpdC5pc1N1Y2Nlc3MoZXhpdClcbiAgICAgICAgICA/IEFzeW5jUmVzdWx0LnN1Y2Nlc3MoZXhpdC52YWx1ZSlcbiAgICAgICAgICA6IEFzeW5jUmVzdWx0LmZhaWx1cmUoZXhpdC5jYXVzZSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQuX3RhZyA9PT0gXCJTdWNjZXNzXCIgPyByZXN1bHQudmFsdWUgOiB5aWVsZCogRWZmZWN0LmZhaWxDYXVzZShyZXN1bHQuY2F1c2UpO1xuICB9KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkF0b21Db21tYW5kPFcsIEEsIEU+KFxuICByZWdpc3RyeTogQXRvbVJlZ2lzdHJ5LkF0b21SZWdpc3RyeSxcbiAgY29tbWFuZDogQXRvbUNvbW1hbmQ8VywgQSwgRT4sXG4gIGlucHV0OiBXLFxuICBvcHRpb25zOiBBdG9tQ29tbWFuZE9wdGlvbnMgPSB7fSxcbiAgcmVwb3J0ZXI6IEF0b21Db21tYW5kUmVwb3J0ZXIgPSBjb25zb2xlLFxuKTogUHJvbWlzZTxBdG9tQ29tbWFuZFJlc3VsdDxBLCBFPj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXR0bGVBdG9tQ29tbWFuZFJlc3VsdCgoKSA9PiBjb21tYW5kLnJ1bihyZWdpc3RyeSwgaW5wdXQpKTtcbiAgcmVwb3J0QXRvbUNvbW1hbmRSZXN1bHQocmVzdWx0LCB7IC4uLm9wdGlvbnMsIGxhYmVsOiBvcHRpb25zLmxhYmVsID8/IGNvbW1hbmQubGFiZWwgfSwgcmVwb3J0ZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwQXRvbUNvbW1hbmRSZXN1bHQ8QSwgRSwgQj4oXG4gIHJlc3VsdDogQXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4sXG4gIG1hcDogKHZhbHVlOiBBKSA9PiBCLFxuKTogQXRvbUNvbW1hbmRSZXN1bHQ8QiwgRT4ge1xuICByZXR1cm4gcmVzdWx0Ll90YWcgPT09IFwiU3VjY2Vzc1wiXG4gICAgPyBBc3luY1Jlc3VsdC5zdWNjZXNzKG1hcChyZXN1bHQudmFsdWUpKVxuICAgIDogQXN5bmNSZXN1bHQuZmFpbHVyZShyZXN1bHQuY2F1c2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBdG9tQ29tbWFuZEludGVycnVwdGVkKHJlc3VsdDogQXRvbUNvbW1hbmRSZXN1bHQ8dW5rbm93biwgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3VsdC5fdGFnID09PSBcIkZhaWx1cmVcIiAmJiBDYXVzZS5oYXNJbnRlcnJ1cHRzT25seShyZXN1bHQuY2F1c2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXNoQXRvbUNvbW1hbmRGYWlsdXJlKHJlc3VsdDoge1xuICByZWFkb25seSBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj47XG59KTogdW5rbm93biB7XG4gIHJldHVybiBDYXVzZS5zcXVhc2gocmVzdWx0LmNhdXNlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHRsZUFzeW5jUmVzdWx0PEEsIEU+KFxuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPEV4aXQuRXhpdDxBLCBFPj4sXG4pOiBQcm9taXNlPFNldHRsZWRBc3luY1Jlc3VsdDxBLCBFPj4ge1xuICB0cnkge1xuICAgIHJldHVybiBBc3luY1Jlc3VsdC5mcm9tRXhpdChhd2FpdCBleGVjdXRlKCkpO1xuICB9IGNhdGNoIChkZWZlY3QpIHtcbiAgICByZXR1cm4gQXN5bmNSZXN1bHQuZmFpbHVyZShDYXVzZS5kaWUoZGVmZWN0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBdG9tQ29tbWFuZDxBLCBFPihcbiAgZXhlY3V0ZTogKCkgPT4gUHJvbWlzZTxFeGl0LkV4aXQ8QSwgRT4+LFxuICBvcHRpb25zOiBBdG9tQ29tbWFuZE9wdGlvbnMgPSB7fSxcbiAgcmVwb3J0ZXI6IEF0b21Db21tYW5kUmVwb3J0ZXIgPSBjb25zb2xlLFxuKTogUHJvbWlzZTxBdG9tQ29tbWFuZFJlc3VsdDxBLCBFPj4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXR0bGVBc3luY1Jlc3VsdChleGVjdXRlKTtcbiAgcmVwb3J0QXRvbUNvbW1hbmRSZXN1bHQocmVzdWx0LCBvcHRpb25zLCByZXBvcnRlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXRvbVF1ZXJ5T3B0aW9ucyBleHRlbmRzIEF0b21Db21tYW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGb3JjZSBhIGZyZXNoIGV4ZWN1dGlvbiBpbnN0ZWFkIG9mIGFjY2VwdGluZyBhIHZhbHVlIHRoZSBhdG9tIGFscmVhZHlcbiAgICogaG9sZHMgKGUuZy4gYW4gU1dSLWNhY2hlZCByZXN1bHQgd2l0aGluIGl0cyBzdGFsZSB3aW5kb3cpLiBVc2VkIGJ5XG4gICAqIHZlcmlmaWNhdGlvbiBmbG93cyB3aGVyZSBhIGNhY2hlZCBmYWlsdXJlIG11c3Qgbm90IHNhdGlzZnkgYSByZXRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZnJlc2g/OiBib29sZWFuO1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBdG9tUXVlcnk8QSwgRT4oXG4gIHJlZ2lzdHJ5OiBBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5LFxuICBhdG9tOiBBdG9tLkF0b208QXN5bmNSZXN1bHQuQXN5bmNSZXN1bHQ8QSwgRT4+LFxuICBvcHRpb25zOiBBdG9tUXVlcnlPcHRpb25zID0ge30sXG4gIHJlcG9ydGVyOiBBdG9tQ29tbWFuZFJlcG9ydGVyID0gY29uc29sZSxcbik6IFByb21pc2U8QXRvbUNvbW1hbmRSZXN1bHQ8QSwgRT4+IHtcbiAgY29uc3QgcXVlcnkgPSBFZmZlY3Quc2NvcGVkKFxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIHlpZWxkKiBBdG9tUmVnaXN0cnkubW91bnQocmVnaXN0cnksIGF0b20pO1xuICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaCkge1xuICAgICAgICB5aWVsZCogRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSByZWdpc3RyeS5nZXQoYXRvbSk7XG4gICAgICAgICAgaWYgKGN1cnJlbnQuX3RhZyAhPT0gXCJJbml0aWFsXCIgJiYgIWN1cnJlbnQud2FpdGluZykge1xuICAgICAgICAgICAgcmVnaXN0cnkucmVmcmVzaChhdG9tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHlpZWxkKiBBdG9tUmVnaXN0cnkuZ2V0UmVzdWx0KHJlZ2lzdHJ5LCBhdG9tLCB7XG4gICAgICAgIHN1c3BlbmRPbldhaXRpbmc6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KSxcbiAgKTtcbiAgcmV0dXJuIGV4ZWN1dGVBdG9tQ29tbWFuZChcbiAgICAoKSA9PiBFZmZlY3QucnVuUHJvbWlzZUV4aXQocXVlcnksIHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9KSxcbiAgICBvcHRpb25zLFxuICAgIHJlcG9ydGVyLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUnVudGltZUNvbW1hbmQ8UiwgRVIsIFcsIEEsIEU+KFxuICBydW50aW1lOiBBdG9tLkF0b21SdW50aW1lPFIsIEVSPixcbiAgb3B0aW9uczoge1xuICAgIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXhlY3V0ZTogKGlucHV0OiBXLCByZWdpc3RyeTogQXRvbVJlZ2lzdHJ5LkF0b21SZWdpc3RyeSkgPT4gRWZmZWN0LkVmZmVjdDxBLCBFLCBSPjtcbiAgICByZWFkb25seSBzY2hlZHVsZXI/OiBBdG9tQ29tbWFuZFNjaGVkdWxlcjtcbiAgICByZWFkb25seSBjb25jdXJyZW5jeT86IEF0b21Db21tYW5kQ29uY3VycmVuY3k8Vz47XG4gIH0sXG4pOiBBdG9tQ29tbWFuZDxXLCBBLCBFIHwgRVI+IHtcbiAgY29uc3Qgc2NoZWR1bGVyID0gb3B0aW9ucy5zY2hlZHVsZXIgPz8gY3JlYXRlQXRvbUNvbW1hbmRTY2hlZHVsZXIoKTtcbiAgY29uc3QgY29uY3VycmVuY3kgPSBvcHRpb25zLmNvbmN1cnJlbmN5ID8/IHsgbW9kZTogXCJwYXJhbGxlbFwiIGFzIGNvbnN0IH07XG4gIHJldHVybiB7XG4gICAgbGFiZWw6IG9wdGlvbnMubGFiZWwsXG4gICAgcnVuOiAocmVnaXN0cnksIGlucHV0KSA9PlxuICAgICAgc2V0dGxlQXRvbUNvbW1hbmRSZXN1bHQoKCkgPT5cbiAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlKHJlZ2lzdHJ5LCBjb25jdXJyZW5jeSwgaW5wdXQsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBhdG9tID0gcnVudGltZVxuICAgICAgICAgICAgLmF0b20ob3B0aW9ucy5leGVjdXRlKGlucHV0LCByZWdpc3RyeSkpXG4gICAgICAgICAgICAucGlwZShBdG9tLndpdGhMYWJlbChvcHRpb25zLmxhYmVsKSk7XG4gICAgICAgICAgcmV0dXJuIGV4ZWN1dGVBdG9tUXVlcnkocmVnaXN0cnksIGF0b20sIHsgcmVwb3J0RGVmZWN0OiBmYWxzZSwgcmVwb3J0RmFpbHVyZTogZmFsc2UgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEF0b21Db21tYW5kUmVzdWx0KFxuICByZXN1bHQ6IEF0b21Db21tYW5kUmVzdWx0PHVua25vd24sIHVua25vd24+LFxuICBvcHRpb25zOiBBdG9tQ29tbWFuZE9wdGlvbnMgPSB7fSxcbiAgcmVwb3J0ZXI6IEF0b21Db21tYW5kUmVwb3J0ZXIgPSBjb25zb2xlLFxuKTogdm9pZCB7XG4gIGlmIChBc3luY1Jlc3VsdC5pc1N1Y2Nlc3MocmVzdWx0KSB8fCBDYXVzZS5oYXNJbnRlcnJ1cHRzT25seShyZXN1bHQuY2F1c2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBvcHRpb25zLmxhYmVsID8/IFwiYXRvbSBjb21tYW5kXCI7XG4gIGlmIChDYXVzZS5oYXNEaWVzKHJlc3VsdC5jYXVzZSkpIHtcbiAgICBpZiAob3B0aW9ucy5yZXBvcnREZWZlY3QgPz8gdHJ1ZSkge1xuICAgICAgcmVwb3J0ZXIuZXJyb3IoYFthdG9tLWNvbW1hbmRdICR7bGFiZWx9IGRlZmVjdGVkYCwgcmVzdWx0LmNhdXNlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5yZXBvcnRGYWlsdXJlID8/IHRydWUpIHtcbiAgICByZXBvcnRlci53YXJuKGBbYXRvbS1jb21tYW5kXSAke2xhYmVsfSBmYWlsZWRgLCByZXN1bHQuY2F1c2UpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR0bGVQcm9taXNlPEE+KFxuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPEE+LFxuKTogUHJvbWlzZTxBdG9tQ29tbWFuZFJlc3VsdDxBLCBuZXZlcj4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gQXN5bmNSZXN1bHQuc3VjY2Vzcyhhd2FpdCBleGVjdXRlKCkpO1xuICB9IGNhdGNoIChkZWZlY3QpIHtcbiAgICByZXR1cm4gQXN5bmNSZXN1bHQuZmFpbHVyZShDYXVzZS5kaWUoZGVmZWN0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudmlyb25tZW50UnBjS2V5PElucHV0Pih0YXJnZXQ6IHtcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGU7XG4gIHJlYWRvbmx5IGlucHV0OiBJbnB1dDtcbn0pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW3RhcmdldC5lbnZpcm9ubWVudElkLCB0YXJnZXQuaW5wdXRdKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnZpcm9ubWVudFJwY0tleTxJbnB1dD4oa2V5OiBzdHJpbmcpOiB7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWRUeXBlO1xuICByZWFkb25seSBpbnB1dDogSW5wdXQ7XG59IHtcbiAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2Uoa2V5KSBhcyBbRW52aXJvbm1lbnRJZFR5cGUsIElucHV0XTtcbiAgcmV0dXJuIHtcbiAgICBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkLm1ha2UoZGVjb2RlZFswXSksXG4gICAgaW5wdXQ6IGRlY29kZWRbMV0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJ1bkluRW52aXJvbm1lbnQ8QSwgRSwgUj4oXG4gIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWRUeXBlLFxuICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4sXG4pOiBFZmZlY3QuRWZmZWN0PFxuICBBLFxuICBFIHwgRW52aXJvbm1lbnRSZWdpc3RyeS5FbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvcixcbiAgRW52aXJvbm1lbnRSZWdpc3RyeS5FbnZpcm9ubWVudFJlZ2lzdHJ5IHwgRXhjbHVkZTxSLCBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yPlxuPiB7XG4gIHJldHVybiBFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnkucGlwZShcbiAgICBFZmZlY3QuZmxhdE1hcCgocmVnaXN0cnkpID0+IHJlZ2lzdHJ5LnJ1bihlbnZpcm9ubWVudElkLCBlZmZlY3QpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBgQXRvbS5tYWtlUmVmcmVzaE9uU2lnbmFsYCBzdWJzY3JpYmVzIHRvIHRoZSBzaWduYWwsIHNvIGEgcXVlcnkgdGhhdCBvdXRsaXZlcyBpdHMgdmlldyBvbiBhblxuICogaWRsZSBUVEwgc3RpbGwgcmUtcnVucyBvbiBldmVyeSBjaGFuZ2UuIFJlYWRpbmcgdGhlIHNpZ25hbCBhcyBhIGRlcGVuZGVuY3kgaW5zdGVhZCBsZXRzIHRoZVxuICogcmVnaXN0cnkgcmUtcnVuIGEgbW91bnRlZCBxdWVyeSByaWdodCBhd2F5IGFuZCBvbmx5IG1hcmsgYW4gaWRsZSBvbmUgc3RhbGUsIHdoaWNoIHRoZW5cbiAqIHJlZnJlc2hlcyBvbiBpdHMgbmV4dCByZWFkLlxuICovXG5jb25zdCByZWZyZXNoT25TaWduYWxXaGlsZVJlYWQgPVxuICA8Vj4oc2lnbmFsOiBBdG9tLkF0b208dW5rbm93bj4sIGlzRmluYWw6ICh2YWx1ZTogVikgPT4gYm9vbGVhbikgPT5cbiAgPEEgZXh0ZW5kcyBWPihzZWxmOiBBdG9tLkF0b208QT4pOiBBdG9tLkF0b208QT4gPT4ge1xuICAgIC8vIFRoZSBzaWduYWwgdmFsdWUgZWFjaCByZWdpc3RyeSdzIGRhdGEgd2FzIHJlYWQgdW5kZXIuIEhlbGQgb3V0c2lkZSB0aGUgbm9kZSBiZWNhdXNlIHRoZVxuICAgIC8vIHJlZ2lzdHJ5IGNhbiBzd2VlcCB0aGlzIG5vZGUgd2hpbGUgYHNlbGZgIGtlZXBzIHRoZSBkYXRhLCBhbmQgdGhlIHJlYnVpbHQgbm9kZSBtdXN0IHN0aWxsXG4gICAgLy8gc2VlIGEgY2hhbmdlIGl0IG1pc3NlZC5cbiAgICBjb25zdCByZWFkVW5kZXIgPSBuZXcgV2Vha01hcDxBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5LCB1bmtub3duPigpO1xuICAgIHJldHVybiBBdG9tLnRyYW5zZm9ybShcbiAgICAgIHNlbGYsXG4gICAgICAoZ2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBnZXQoc2lnbmFsKTtcbiAgICAgICAgZ2V0LnN1YnNjcmliZShzZWxmLCAodmFsdWUpID0+IGdldC5zZXRTZWxmKHZhbHVlKSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPVxuICAgICAgICAgIHJlYWRVbmRlci5oYXMoZ2V0LnJlZ2lzdHJ5KSAmJiAhT2JqZWN0LmlzKHJlYWRVbmRlci5nZXQoZ2V0LnJlZ2lzdHJ5KSwgY3VycmVudCk7XG4gICAgICAgIHJlYWRVbmRlci5zZXQoZ2V0LnJlZ2lzdHJ5LCBjdXJyZW50KTtcbiAgICAgICAgaWYgKGNoYW5nZWQgJiYgIWlzRmluYWwoZ2V0Lm9uY2Uoc2VsZikpKSBnZXQucmVmcmVzaChzZWxmKTtcbiAgICAgICAgcmV0dXJuIGdldC5vbmNlKHNlbGYpO1xuICAgICAgfSxcbiAgICAgIHsgaW5pdGlhbFZhbHVlVGFyZ2V0OiBzZWxmIH0sXG4gICAgKTtcbiAgfTtcblxuY29uc3QgcmVmcmVzaEV2ZXJ5VW50aWxGaW5hbCA9XG4gIDxWPihpbnRlcnZhbE1zOiBudW1iZXIsIGlzRmluYWw6ICh2YWx1ZTogVikgPT4gYm9vbGVhbikgPT5cbiAgPEEgZXh0ZW5kcyBWPihzZWxmOiBBdG9tLkF0b208QT4pOiBBdG9tLkF0b208QT4gPT5cbiAgICBBdG9tLnRyYW5zZm9ybShcbiAgICAgIHNlbGYsXG4gICAgICAoZ2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0KHNlbGYpO1xuICAgICAgICBpZiAoIWlzRmluYWwodmFsdWUpKSB7XG4gICAgICAgICAgLy8gQGVmZmVjdC1kaWFnbm9zdGljcy1uZXh0LWxpbmUgZ2xvYmFsVGltZXJzOm9mZiAtIE1pcnJvcnMgYEF0b20ud2l0aFJlZnJlc2hgLCBvdXRzaWRlIGFuIEVmZmVjdCBydW50aW1lLlxuICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4gZ2V0LnJlZnJlc2goc2VsZiksIGludGVydmFsTXMpO1xuICAgICAgICAgIGdldC5hZGRGaW5hbGl6ZXIoKCkgPT4gY2xlYXJUaW1lb3V0KGhhbmRsZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICB7IGluaXRpYWxWYWx1ZVRhcmdldDogc2VsZiB9LFxuICAgICk7XG5cbi8qKlxuICogQSBxdWVyeSByZXN1bHQncyBkYXRhIGFsb25lLiBBIHJlZmV0Y2ggYWx3YXlzIHB1Ymxpc2hlcyBhIG5ldyByZXN1bHQgKGEgbmV3XG4gKiB0aW1lc3RhbXAsIGB3YWl0aW5nYCBvbiBhbmQgb2ZmKSwgd2hpbGUgZXF1YWwgZGF0YSBrZWVwcyBpdHMgaWRlbnRpdHksIHNvIGFcbiAqIHJlYWRlciBvZiBvbmx5IHRoaXMgc2tpcHMgdGhlIHJlZmV0Y2hlcyB0aGF0IGNoYW5nZWQgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdEVudmlyb25tZW50UXVlcnlEYXRhID0gPEEsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQuQXN5bmNSZXN1bHQ8QSwgRT4pOiBBIHwgbnVsbCA9PlxuICBPcHRpb24uZ2V0T3JOdWxsKEFzeW5jUmVzdWx0LnZhbHVlKHJlc3VsdCkpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52aXJvbm1lbnRRdWVyeUF0b21GYW1pbHk8UiwgRVIsIElucHV0LCBBLCBFPihcbiAgcnVudGltZTogQXRvbS5BdG9tUnVudGltZTxFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnkgfCBSLCBFUj4sXG4gIG9wdGlvbnM6IEVudmlyb25tZW50UXVlcnlBdG9tT3B0aW9uczxcbiAgICBJbnB1dCxcbiAgICBBLFxuICAgIEUsXG4gICAgfCBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yXG4gICAgfCBFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnlcbiAgICB8IEF0b21SZWdpc3RyeS5BdG9tUmVnaXN0cnlcbiAgICB8IFJcbiAgPixcbik6ICh0YXJnZXQ6IHtcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGU7XG4gIHJlYWRvbmx5IGlucHV0OiBJbnB1dDtcbn0pID0+IEF0b20uQXRvbTxBc3luY1Jlc3VsdC5Bc3luY1Jlc3VsdDxBLCBFIHwgRVIgfCBFcnJvcj4+IHtcbiAgY29uc3QgY29ubmVjdGlvbkF0b20gPSBBdG9tLmZhbWlseSgoZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGUpID0+XG4gICAgcnVudGltZS5hdG9tKFxuICAgICAgZm9sbG93U3RyZWFtSW5FbnZpcm9ubWVudChcbiAgICAgICAgZW52aXJvbm1lbnRJZCxcbiAgICAgICAgU3RyZWFtLnVud3JhcChcbiAgICAgICAgICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QubWFwKChzdXBlcnZpc29yKSA9PlxuICAgICAgICAgICAgICBTdWJzY3JpcHRpb25SZWYuY2hhbmdlcyhzdXBlcnZpc29yLnN0YXRlKS5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS56aXBMYXRlc3QoU3Vic2NyaXB0aW9uUmVmLmNoYW5nZXMoc3VwZXJ2aXNvci5zZXNzaW9uKSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgeyBpbml0aWFsVmFsdWU6IG51bGwgfSxcbiAgICApLFxuICApO1xuICBjb25zdCBmYW1pbHkgPSBBdG9tLmZhbWlseSgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXJzZUVudmlyb25tZW50UnBjS2V5PElucHV0PihrZXkpO1xuICAgIGNvbnN0IGlkbGVUdGxNcyA9IG9wdGlvbnMuaWRsZVR0bE1zID8/IDUgKiA2MF8wMDA7XG4gICAgY29uc3QgcXVlcnlBdG9tID0gcnVudGltZVxuICAgICAgLmF0b208XG4gICAgICAgIEEsXG4gICAgICAgIHwgRVxuICAgICAgICB8IENvbm5lY3Rpb25BdHRlbXB0RXJyb3JcbiAgICAgICAgfCBFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50Tm90UmVnaXN0ZXJlZEVycm9yXG4gICAgICAgIHwgRW52aXJvbm1lbnRScGNVbmF2YWlsYWJsZUVycm9yXG4gICAgICA+KChnZXQpID0+IHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IE9wdGlvbi5nZXRPck51bGwoXG4gICAgICAgICAgQXN5bmNSZXN1bHQudmFsdWUoZ2V0KGNvbm5lY3Rpb25BdG9tKHRhcmdldC5lbnZpcm9ubWVudElkKSkpLFxuICAgICAgICApO1xuICAgICAgICAvLyBBIHJlZmV0Y2ggdGhhdCByZXR1cm5zIGVxdWFsIGNvbnRlbnQga2VlcHMgdGhlIHByZXZpb3VzIHZhbHVlJ3NcbiAgICAgICAgLy8gcmVmZXJlbmNlcywgc28gcmVhZGVycyBvZiB0aGUgZGF0YSBza2lwIHJlLXJlbmRlcmluZyBvbiBpZGxlIHBvbGxzLlxuICAgICAgICBjb25zdCBzaGFyZSA9ICh2YWx1ZTogQSk6IEEgPT5cbiAgICAgICAgICByZXVzZVVuY2hhbmdlZChcbiAgICAgICAgICAgIE9wdGlvbi5nZXRPclVuZGVmaW5lZChcbiAgICAgICAgICAgICAgT3B0aW9uLmZsYXRNYXAoZ2V0LnNlbGY8QXN5bmNSZXN1bHQuQXN5bmNSZXN1bHQ8QSwgdW5rbm93bj4+KCksIEFzeW5jUmVzdWx0LnZhbHVlKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICApO1xuICAgICAgICBjb25zdCBlbWl0ID0gKHZhbHVlOiBBKSA9PlxuICAgICAgICAgIEVmZmVjdC5zeW5jKCgpID0+IGdldC5zZXRTZWxmKEFzeW5jUmVzdWx0LnN1Y2Nlc3Moc2hhcmUodmFsdWUpLCB7IHdhaXRpbmc6IHRydWUgfSkpKS5waXBlKFxuICAgICAgICAgICAgLy8gQSB2YWx1ZSBzZXQgd2hpbGUgdGhlIGF0b20gYnVpbGRzIHdpbnMgb3ZlciB0aGUgYnVpbGQncyBvd25cbiAgICAgICAgICAgIC8vIHJlc3VsdCwgc28gYSBxdWVyeSB0aGF0IHRoZW4gc2V0dGxlZCBzeW5jaHJvbm91c2x5IHdvdWxkIHN0YXlcbiAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yZXZlci4gU3VzcGVuZCBvbiBhIHByb21pc2UgKGB5aWVsZE5vd2AgaXMgZHJhaW5lZFxuICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSBidWlsZCkgc28gdGhlIHNldHRsZWQgcmVzdWx0IGFycml2ZXMgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgICAgICBFZmZlY3QuYW5kVGhlbihFZmZlY3QucHJvbWlzZSgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSkpLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGUgPSAoKTogRWZmZWN0LkVmZmVjdDxcbiAgICAgICAgICBBLFxuICAgICAgICAgIHwgRVxuICAgICAgICAgIHwgQ29ubmVjdGlvbkF0dGVtcHRFcnJvclxuICAgICAgICAgIHwgRW52aXJvbm1lbnRSZWdpc3RyeS5FbnZpcm9ubWVudE5vdFJlZ2lzdGVyZWRFcnJvclxuICAgICAgICAgIHwgRW52aXJvbm1lbnRScGNVbmF2YWlsYWJsZUVycm9yLFxuICAgICAgICAgIHwgRW52aXJvbm1lbnRSZWdpc3RyeS5FbnZpcm9ubWVudFJlZ2lzdHJ5XG4gICAgICAgICAgfCBBdG9tUmVnaXN0cnkuQXRvbVJlZ2lzdHJ5XG4gICAgICAgICAgfCBFeGNsdWRlPFIsIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3I+XG4gICAgICAgID4gPT4ge1xuICAgICAgICAgIGlmIChjb25uZWN0aW9uID09PSBudWxsKSByZXR1cm4gRWZmZWN0Lm5ldmVyO1xuICAgICAgICAgIGNvbnN0IFtjb25uZWN0aW9uU3RhdGUsIHNlc3Npb25dID0gY29ubmVjdGlvbjtcbiAgICAgICAgICBzd2l0Y2ggKGNvbm5lY3Rpb25TdGF0ZS5waGFzZSkge1xuICAgICAgICAgICAgY2FzZSBcImNvbm5lY3RlZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uLmlzU29tZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgID8gcnVuSW5FbnZpcm9ubWVudChcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmVudmlyb25tZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSh0YXJnZXQuaW5wdXQsIGVtaXQpXG4gICAgICAgICAgICAgICAgICAgICAgLnBpcGUocGVuZGluZ09uY2VTZXNzaW9uUmVwbGFjZWQoc2Vzc2lvbi52YWx1ZSkpLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogRWZmZWN0Lm5ldmVyO1xuICAgICAgICAgICAgY2FzZSBcImNvbm5lY3RpbmdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiYWNrb2ZmXCI6XG4gICAgICAgICAgICAgIHJldHVybiBFZmZlY3QubmV2ZXI7XG4gICAgICAgICAgICBjYXNlIFwiYXZhaWxhYmxlXCI6XG4gICAgICAgICAgICBjYXNlIFwib2ZmbGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcImJsb2NrZWRcIjpcbiAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25TdGF0ZS5sYXN0RmFpbHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChjb25uZWN0aW9uU3RhdGUubGFzdEZhaWx1cmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChcbiAgICAgICAgICAgICAgICBuZXcgRW52aXJvbm1lbnRScGNVbmF2YWlsYWJsZUVycm9yKHtcbiAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50SWQ6IHRhcmdldC5lbnZpcm9ubWVudElkLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVudmlyb25tZW50ICR7dGFyZ2V0LmVudmlyb25tZW50SWR9IGlzICR7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0ZS5waGFzZSA9PT0gXCJhdmFpbGFibGVcIiA/IFwibm90IGNvbm5lY3RlZFwiIDogY29ubmVjdGlvblN0YXRlLnBoYXNlXG4gICAgICAgICAgICAgICAgICB9LmAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIW9wdGlvbnMucGVyc2lzdGVuY2UpIHJldHVybiBleGVjdXRlKCkucGlwZShFZmZlY3QubWFwKHNoYXJlKSk7XG4gICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gb3B0aW9ucy5wZXJzaXN0ZW5jZTtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBKU09OLnN0cmluZ2lmeShbb3B0aW9ucy5sYWJlbCwgdGFyZ2V0LmlucHV0XSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gT3B0aW9uLmZsYXRNYXAoXG4gICAgICAgICAgZ2V0LnNlbGY8QXN5bmNSZXN1bHQuQXN5bmNSZXN1bHQ8QSwgdW5rbm93bj4+KCksXG4gICAgICAgICAgQXN5bmNSZXN1bHQudmFsdWUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgY2FjaGVkID0gT3B0aW9uLmlzU29tZShwcmV2aW91cylcbiAgICAgICAgICAgID8gcHJldmlvdXNcbiAgICAgICAgICAgIDogeWllbGQqIHBlcnNpc3RlbmNlLmxvYWQodGFyZ2V0LmVudmlyb25tZW50SWQsIGNhY2hlS2V5KTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBPcHRpb24uaXNTb21lKGNhY2hlZCkgJiZcbiAgICAgICAgICAgIChjb25uZWN0aW9uID09PSBudWxsIHx8IGNvbm5lY3Rpb25bMF0ucGhhc2UgIT09IFwiY29ubmVjdGVkXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoT3B0aW9uLmlzTm9uZShwcmV2aW91cykgJiYgT3B0aW9uLmlzU29tZShjYWNoZWQpKSB5aWVsZCogZW1pdChjYWNoZWQudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB5aWVsZCogZXhlY3V0ZSgpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QubWFwKHNoYXJlKSxcbiAgICAgICAgICAgIEVmZmVjdC50YXAoKHZhbHVlKSA9PiBwZXJzaXN0ZW5jZS5zYXZlKHRhcmdldC5lbnZpcm9ubWVudElkLCBjYWNoZUtleSwgdmFsdWUpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgQXRvbS5zd3Ioe1xuICAgICAgICAgIHN0YWxlVGltZTogb3B0aW9ucy5zdGFsZVRpbWVNcyA/PyAzMF8wMDAsXG4gICAgICAgICAgcmV2YWxpZGF0ZU9uTW91bnQ6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICBBdG9tLnNldElkbGVUVEwoaWRsZVR0bE1zKSxcbiAgICAgICk7XG4gICAgY29uc3QgaXNGaW5hbCA9IChyZXN1bHQ6IEFzeW5jUmVzdWx0LkFzeW5jUmVzdWx0PEEsIHVua25vd24+KSA9PlxuICAgICAgb3B0aW9ucy5pc0ZpbmFsICE9PSB1bmRlZmluZWQgJiYgT3B0aW9uLmV4aXN0cyhBc3luY1Jlc3VsdC52YWx1ZShyZXN1bHQpLCBvcHRpb25zLmlzRmluYWwpO1xuICAgIGNvbnN0IGludGVydmFsUXVlcnkgPVxuICAgICAgb3B0aW9ucy5yZWZyZXNoSW50ZXJ2YWxNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gcXVlcnlBdG9tXG4gICAgICAgIDogcXVlcnlBdG9tLnBpcGUocmVmcmVzaEV2ZXJ5VW50aWxGaW5hbChvcHRpb25zLnJlZnJlc2hJbnRlcnZhbE1zLCBpc0ZpbmFsKSk7XG4gICAgY29uc3QgcmVmcmVzaFRyaWdnZXIgPSBvcHRpb25zLnJlZnJlc2hUcmlnZ2VyPy4odGFyZ2V0KTtcbiAgICByZXR1cm4gKFxuICAgICAgcmVmcmVzaFRyaWdnZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGludGVydmFsUXVlcnlcbiAgICAgICAgOiBpbnRlcnZhbFF1ZXJ5LnBpcGUocmVmcmVzaE9uU2lnbmFsV2hpbGVSZWFkKHJlZnJlc2hUcmlnZ2VyLCBpc0ZpbmFsKSlcbiAgICApLnBpcGUoQXRvbS5zZXRJZGxlVFRMKGlkbGVUdGxNcyksIEF0b20ud2l0aExhYmVsKGAke29wdGlvbnMubGFiZWx9OiR7a2V5fWApKTtcbiAgfSk7XG4gIHJldHVybiAodGFyZ2V0KSA9PiBmYW1pbHkoZW52aXJvbm1lbnRScGNLZXkodGFyZ2V0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFN1YnNjcmlwdGlvbkF0b21GYW1pbHk8UiwgRVIsIElucHV0LCBBLCBFPihcbiAgcnVudGltZTogQXRvbS5BdG9tUnVudGltZTxFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnkgfCBSLCBFUj4sXG4gIG9wdGlvbnM6IEVudmlyb25tZW50U3Vic2NyaXB0aW9uQXRvbU9wdGlvbnM8XG4gICAgSW5wdXQsXG4gICAgQSxcbiAgICBFLFxuICAgIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3IgfCBSXG4gID4sXG4pIHtcbiAgY29uc3QgZmFtaWx5ID0gQXRvbS5mYW1pbHkoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gcGFyc2VFbnZpcm9ubWVudFJwY0tleTxJbnB1dD4oa2V5KTtcbiAgICByZXR1cm4gcnVudGltZVxuICAgICAgLmF0b20oXG4gICAgICAgIFN0cmVhbS5zdXNwZW5kKCgpID0+XG4gICAgICAgICAgZm9sbG93U3RyZWFtSW5FbnZpcm9ubWVudCh0YXJnZXQuZW52aXJvbm1lbnRJZCwgb3B0aW9ucy5zdWJzY3JpYmUodGFyZ2V0LmlucHV0KSksXG4gICAgICAgICkucGlwZShvcHRpb25zLmNvbXBsZXRlV2hlbiA/IFN0cmVhbS50YWtlVW50aWwob3B0aW9ucy5jb21wbGV0ZVdoZW4pIDogKHN0cmVhbSkgPT4gc3RyZWFtKSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBBdG9tLnNldElkbGVUVEwob3B0aW9ucy5pZGxlVHRsTXMgPz8gNSAqIDYwXzAwMCksXG4gICAgICAgIEF0b20ud2l0aExhYmVsKFxuICAgICAgICAgIG9wdGlvbnMuc2Vuc2l0aXZlSW5wdXRcbiAgICAgICAgICAgID8gYCR7b3B0aW9ucy5sYWJlbH06JHt0YXJnZXQuZW52aXJvbm1lbnRJZH1gXG4gICAgICAgICAgICA6IGAke29wdGlvbnMubGFiZWx9OiR7a2V5fWAsXG4gICAgICAgICksXG4gICAgICApO1xuICB9KTtcbiAgcmV0dXJuICh0YXJnZXQ6IHsgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGU7IHJlYWRvbmx5IGlucHV0OiBJbnB1dCB9KSA9PlxuICAgIGZhbWlseShlbnZpcm9ubWVudFJwY0tleSh0YXJnZXQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudmlyb25tZW50Q29tbWFuZDxSLCBFUiwgSW5wdXQsIEEsIEU+KFxuICBydW50aW1lOiBBdG9tLkF0b21SdW50aW1lPEVudmlyb25tZW50UmVnaXN0cnkuRW52aXJvbm1lbnRSZWdpc3RyeSB8IFIsIEVSPixcbiAgb3B0aW9uczogRW52aXJvbm1lbnRDb21tYW5kQXRvbU9wdGlvbnM8XG4gICAgSW5wdXQsXG4gICAgQSxcbiAgICBFLFxuICAgIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3IgfCBFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnkgfCBSXG4gID4sXG4pIHtcbiAgcmV0dXJuIGNyZWF0ZVJ1bnRpbWVDb21tYW5kKHJ1bnRpbWUsIHtcbiAgICBsYWJlbDogb3B0aW9ucy5sYWJlbCxcbiAgICAuLi4ob3B0aW9ucy5zY2hlZHVsZXIgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzY2hlZHVsZXI6IG9wdGlvbnMuc2NoZWR1bGVyIH0pLFxuICAgIC4uLihvcHRpb25zLmNvbmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY29uY3VycmVuY3k6IG9wdGlvbnMuY29uY3VycmVuY3kgfSksXG4gICAgZXhlY3V0ZTogKHRhcmdldCwgcmVnaXN0cnkpID0+XG4gICAgICBydW5JbkVudmlyb25tZW50KFxuICAgICAgICB0YXJnZXQuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgb3B0aW9ucy5leGVjdXRlKHRhcmdldC5pbnB1dCwgcmVnaXN0cnksIHRhcmdldC5lbnZpcm9ubWVudElkKSxcbiAgICAgICksXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52aXJvbm1lbnRScGNRdWVyeUF0b21GYW1pbHk8XG4gIFIsXG4gIEVSLFxuICBUVGFnIGV4dGVuZHMgRXhjbHVkZTxFbnZpcm9ubWVudFVuYXJ5UnBjVGFnLCBDbGllbnRHdWFyZGVkUnBjVGFnPixcbj4oXG4gIHJ1bnRpbWU6IEF0b20uQXRvbVJ1bnRpbWU8RW52aXJvbm1lbnRSZWdpc3RyeS5FbnZpcm9ubWVudFJlZ2lzdHJ5IHwgUiwgRVI+LFxuICBvcHRpb25zOiB7XG4gICAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgICByZWFkb25seSB0YWc6IFRUYWc7XG4gICAgcmVhZG9ubHkgZXhlY3V0ZT86IChcbiAgICAgIGlucHV0OiBFbnZpcm9ubWVudFJwY0lucHV0PFRUYWc+LFxuICAgICAgZW1pdDogKHZhbHVlOiBFbnZpcm9ubWVudFJwY1N1Y2Nlc3M8VFRhZz4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD4sXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PFxuICAgICAgRW52aXJvbm1lbnRScGNTdWNjZXNzPFRUYWc+LFxuICAgICAgRW52aXJvbm1lbnRScGNGYWlsdXJlPFRUYWc+IHwgRW52aXJvbm1lbnRScGNVbmF2YWlsYWJsZUVycm9yLFxuICAgICAgRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvciB8IEVudmlyb25tZW50UmVnaXN0cnkuRW52aXJvbm1lbnRSZWdpc3RyeVxuICAgID47XG4gICAgcmVhZG9ubHkgcGVyc2lzdGVuY2U/OiBRdWVyeVBlcnNpc3RlbmNlPEVudmlyb25tZW50UnBjU3VjY2VzczxUVGFnPj47XG4gICAgcmVhZG9ubHkgc3RhbGVUaW1lTXM/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgaWRsZVR0bE1zPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHJlZnJlc2hUcmlnZ2VyPzogKHRhcmdldDoge1xuICAgICAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGU7XG4gICAgICByZWFkb25seSBpbnB1dDogRW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPjtcbiAgICB9KSA9PiBBdG9tLkF0b208dW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgcmVhZG9ubHkgaXNGaW5hbD86ICh2YWx1ZTogRW52aXJvbm1lbnRScGNTdWNjZXNzPFRUYWc+KSA9PiBib29sZWFuO1xuICB9LFxuKSB7XG4gIHJldHVybiBjcmVhdGVFbnZpcm9ubWVudFF1ZXJ5QXRvbUZhbWlseShydW50aW1lLCB7XG4gICAgbGFiZWw6IG9wdGlvbnMubGFiZWwsXG4gICAgLi4uKG9wdGlvbnMucGVyc2lzdGVuY2UgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBwZXJzaXN0ZW5jZTogb3B0aW9ucy5wZXJzaXN0ZW5jZSB9KSxcbiAgICAuLi4ob3B0aW9ucy5zdGFsZVRpbWVNcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHN0YWxlVGltZU1zOiBvcHRpb25zLnN0YWxlVGltZU1zIH0pLFxuICAgIC4uLihvcHRpb25zLmlkbGVUdGxNcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGlkbGVUdGxNczogb3B0aW9ucy5pZGxlVHRsTXMgfSksXG4gICAgLi4uKG9wdGlvbnMucmVmcmVzaEludGVydmFsTXMgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7fVxuICAgICAgOiB7IHJlZnJlc2hJbnRlcnZhbE1zOiBvcHRpb25zLnJlZnJlc2hJbnRlcnZhbE1zIH0pLFxuICAgIC4uLihvcHRpb25zLnJlZnJlc2hUcmlnZ2VyID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcmVmcmVzaFRyaWdnZXI6IG9wdGlvbnMucmVmcmVzaFRyaWdnZXIgfSksXG4gICAgLi4uKG9wdGlvbnMuaXNGaW5hbCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGlzRmluYWw6IG9wdGlvbnMuaXNGaW5hbCB9KSxcbiAgICBleGVjdXRlOiAoXG4gICAgICBpbnB1dDogRW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPixcbiAgICAgIGVtaXQ6ICh2YWx1ZTogRW52aXJvbm1lbnRScGNTdWNjZXNzPFRUYWc+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+LFxuICAgICkgPT4gb3B0aW9ucy5leGVjdXRlPy4oaW5wdXQsIGVtaXQpID8/IHJlcXVlc3Qob3B0aW9ucy50YWcsIGlucHV0KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFJwY1N1YnNjcmlwdGlvbkF0b21GYW1pbHk8XG4gIFIsXG4gIEVSLFxuICBUVGFnIGV4dGVuZHMgRW52aXJvbm1lbnRTdWJzY3JpcHRpb25ScGNUYWcsXG4gIEIgPSBFbnZpcm9ubWVudFJwY1N0cmVhbVZhbHVlPFRUYWc+LFxuPihcbiAgcnVudGltZTogQXRvbS5BdG9tUnVudGltZTxFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnkgfCBSLCBFUj4sXG4gIG9wdGlvbnM6IHtcbiAgICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHRhZzogVFRhZztcbiAgICByZWFkb25seSBpZGxlVHRsTXM/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgY29tcGxldGVXaGVuPzogKHZhbHVlOiBCKSA9PiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHRyYW5zZm9ybT86IChcbiAgICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxcbiAgICAgICAgRW52aXJvbm1lbnRScGNTdHJlYW1WYWx1ZTxUVGFnPixcbiAgICAgICAgRW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+LFxuICAgICAgICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yIHwgUlxuICAgICAgPixcbiAgICApID0+IFN0cmVhbS5TdHJlYW08XG4gICAgICBCLFxuICAgICAgRW52aXJvbm1lbnRScGNTdHJlYW1GYWlsdXJlPFRUYWc+LFxuICAgICAgRW52aXJvbm1lbnRTdXBlcnZpc29yLkVudmlyb25tZW50U3VwZXJ2aXNvciB8IFJcbiAgICA+O1xuICB9LFxuKSB7XG4gIHJldHVybiBjcmVhdGVFbnZpcm9ubWVudFN1YnNjcmlwdGlvbkF0b21GYW1pbHkocnVudGltZSwge1xuICAgIGxhYmVsOiBvcHRpb25zLmxhYmVsLFxuICAgIC4uLihvcHRpb25zLmNvbXBsZXRlV2hlbiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGNvbXBsZXRlV2hlbjogb3B0aW9ucy5jb21wbGV0ZVdoZW4gfSksXG4gICAgLi4uKG9wdGlvbnMuaWRsZVR0bE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHsgaWRsZVR0bE1zOiBvcHRpb25zLmlkbGVUdGxNcyB9KSxcbiAgICBzdWJzY3JpYmU6IChpbnB1dDogRW52aXJvbm1lbnRScGNJbnB1dDxUVGFnPikgPT4ge1xuICAgICAgY29uc3Qgc3RyZWFtID0gc3Vic2NyaWJlKG9wdGlvbnMudGFnLCBpbnB1dCk7XG4gICAgICByZXR1cm4gb3B0aW9ucy50cmFuc2Zvcm0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChzdHJlYW0gYXMgU3RyZWFtLlN0cmVhbTxcbiAgICAgICAgICAgIEIsXG4gICAgICAgICAgICBFbnZpcm9ubWVudFJwY1N0cmVhbUZhaWx1cmU8VFRhZz4sXG4gICAgICAgICAgICBFbnZpcm9ubWVudFN1cGVydmlzb3IuRW52aXJvbm1lbnRTdXBlcnZpc29yIHwgUlxuICAgICAgICAgID4pXG4gICAgICAgIDogb3B0aW9ucy50cmFuc2Zvcm0oc3RyZWFtKTtcbiAgICB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudmlyb25tZW50UnBjQ29tbWFuZDxcbiAgUixcbiAgRVIsXG4gIFRUYWcgZXh0ZW5kcyBFbnZpcm9ubWVudFVuYXJ5UnBjVGFnLFxuICBJbnB1dCBleHRlbmRzIEVudmlyb25tZW50UnBjSW5wdXQ8VFRhZz4gPSBFbnZpcm9ubWVudFJwY0lucHV0PFRUYWc+LFxuPihcbiAgcnVudGltZTogQXRvbS5BdG9tUnVudGltZTxFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnkgfCBSLCBFUj4sXG4gIG9wdGlvbnM6IHtcbiAgICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHRhZzogVFRhZztcbiAgICByZWFkb25seSBleGVjdXRlPzogKFxuICAgICAgaW5wdXQ6IElucHV0LFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxcbiAgICAgIEVudmlyb25tZW50UnBjU3VjY2VzczxUVGFnPixcbiAgICAgIEVudmlyb25tZW50UnBjRmFpbHVyZTxUVGFnPiB8IEVudmlyb25tZW50UnBjVW5hdmFpbGFibGVFcnJvcixcbiAgICAgIEVudmlyb25tZW50U3VwZXJ2aXNvci5FbnZpcm9ubWVudFN1cGVydmlzb3IgfCBFbnZpcm9ubWVudFJlZ2lzdHJ5LkVudmlyb25tZW50UmVnaXN0cnlcbiAgICA+O1xuICAgIHJlYWRvbmx5IHNjaGVkdWxlcj86IEF0b21Db21tYW5kU2NoZWR1bGVyO1xuICAgIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogQXRvbUNvbW1hbmRDb25jdXJyZW5jeTx7XG4gICAgICByZWFkb25seSBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkVHlwZTtcbiAgICAgIHJlYWRvbmx5IGlucHV0OiBOb0luZmVyPElucHV0PjtcbiAgICB9PjtcbiAgICByZWFkb25seSBvblN1Y2Nlc3M/OiAoXG4gICAgICB0YXJnZXQ6IHtcbiAgICAgICAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogRW52aXJvbm1lbnRJZFR5cGU7XG4gICAgICAgIHJlYWRvbmx5IGlucHV0OiBOb0luZmVyPElucHV0PjtcbiAgICAgIH0sXG4gICAgICByZWdpc3RyeTogQXRvbVJlZ2lzdHJ5LkF0b21SZWdpc3RyeSxcbiAgICAgIHJlc3VsdDogRW52aXJvbm1lbnRScGNTdWNjZXNzPFRUYWc+LFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgUj47XG4gICAgcmVhZG9ubHkgb25TZXR0bGVkPzogKFxuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIHJlYWRvbmx5IGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWRUeXBlO1xuICAgICAgICByZWFkb25seSBpbnB1dDogTm9JbmZlcjxJbnB1dD47XG4gICAgICB9LFxuICAgICAgcmVnaXN0cnk6IEF0b21SZWdpc3RyeS5BdG9tUmVnaXN0cnksXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBSPjtcbiAgfSxcbikge1xuICBjb25zdCBwZXJtaXNzaW9ucyA9IGNyZWF0ZUNvbW1hbmRQZXJtaXNzaW9ucyhydW50aW1lLCBvcHRpb25zLnRhZyk7XG4gIGNvbnN0IGNvbW1hbmQgPSBjcmVhdGVFbnZpcm9ubWVudENvbW1hbmQocnVudGltZSwge1xuICAgIGxhYmVsOiBvcHRpb25zLmxhYmVsLFxuICAgIC4uLihvcHRpb25zLnNjaGVkdWxlciA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHNjaGVkdWxlcjogb3B0aW9ucy5zY2hlZHVsZXIgfSksXG4gICAgLi4uKG9wdGlvbnMuY29uY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBjb25jdXJyZW5jeTogb3B0aW9ucy5jb25jdXJyZW5jeSB9KSxcbiAgICBleGVjdXRlOiAoaW5wdXQ6IElucHV0LCByZWdpc3RyeSwgZW52aXJvbm1lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0ge1xuICAgICAgICBlbnZpcm9ubWVudElkLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH07XG4gICAgICAvLyBSb3V0aW5nIHJlcXVpcmVzIGNvbnNlbnQgb24gdGhlIG9yaWdpbiBhcyB3ZWxsIGFzIHRoZSBhY3R1YWwgZGVzdGluYXRpb24uXG4gICAgICAvLyBUaGUgdHJhbnNwb3J0IGNoZWNrIGJlbG93IGRlbGliZXJhdGVseSBjaGVja3MgdGhlIGRlc3RpbmF0aW9uIGFnYWluLlxuICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmF1dGhvcml6ZShyZWdpc3RyeSwgZW52aXJvbm1lbnRJZCwgaW5wdXQpLnBpcGUoXG4gICAgICAgIEVmZmVjdC5hbmRUaGVuKCgpID0+IG9wdGlvbnMuZXhlY3V0ZT8uKGlucHV0KSA/PyByZXF1ZXN0R3VhcmRlZChvcHRpb25zLnRhZywgaW5wdXQpKSxcbiAgICAgICAgRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKFJwY1Blcm1pc3Npb25HdWFyZCwge1xuICAgICAgICAgIGF1dGhvcml6ZTogKGlkLCBtZXRob2QsIHBheWxvYWQpID0+XG4gICAgICAgICAgICBjcmVhdGVDb21tYW5kUGVybWlzc2lvbnMocnVudGltZSwgbWV0aG9kKS5hdXRob3JpemUocmVnaXN0cnksIGlkLCBwYXlsb2FkKSxcbiAgICAgICAgfSksXG4gICAgICAgIEVmZmVjdC50YXAoKHJlc3VsdCkgPT4gb3B0aW9ucy5vblN1Y2Nlc3M/Lih0YXJnZXQsIHJlZ2lzdHJ5LCByZXN1bHQpID8/IEVmZmVjdC52b2lkKSxcbiAgICAgICAgRWZmZWN0LmVuc3VyaW5nKG9wdGlvbnMub25TZXR0bGVkPy4odGFyZ2V0LCByZWdpc3RyeSkgPz8gRWZmZWN0LnZvaWQpLFxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb21tYW5kLFxuICAgIHJlcXVpcmVkU2NvcGVzOiBwZXJtaXNzaW9ucy5yZXF1aXJlZFNjb3BlcyxcbiAgICBwZXJtaXNzaW9uQXRvbTogcGVybWlzc2lvbnMucGVybWlzc2lvbkF0b20sXG4gIH07XG59XG4iXSwiZmlsZSI6Ii9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3N0YXRlL3J1bnRpbWUudHMifQ==

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3N0YXRlL3J1bnRpbWUudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9zdGF0ZS9ydW50aW1lLnRzIix7InVybHMiOiI2IiwiaWRzIjoiNyJ9LFsiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiJdLFtdLFsiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiJdLHt9LCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9zdGF0ZS9jb21tYW5kUGVybWlzc2lvbnMudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9zdGF0ZS9lbnZpcm9ubWVudFN0cmVhbXMudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9zdGF0ZS9zZXJ2ZXJDb25maWdQcm9qZWN0aW9uLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jb250cmFjdHMvc3JjL2luZGV4LnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9DYXVzZS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvRWZmZWN0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FeGl0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9PcHRpb24uanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NjaGVtYS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvU3RyZWFtLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9TdWJzY3JpcHRpb25SZWYuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L3JlYWN0aXZpdHkvaW5kZXguanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL3JlZ2lzdHJ5LnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvcnBjL2NsaWVudC50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vc3VwZXJ2aXNvci50cyJd