__vite_ssr_exportName__("RpcSessionFactory", () => { try { return RpcSessionFactory } catch {} });
__vite_ssr_exportName__("make", () => { try { return make } catch {} });
__vite_ssr_exportName__("layer", () => { try { return layer } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/index.ts", {"importedNames":["WsSubscribeServerConfigRpc","WS_METHODS"]});
const __vite_ssr_import_1__ = 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_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Context.js");
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Deferred.js");
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Duration.js");
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/Effect.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/Equal.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/Layer.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/Option.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/PubSub.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/Ref.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/Schedule.js");
const __vite_ssr_import_13__ = 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_14__ = 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_15__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/rpc/RpcClient.js");
const __vite_ssr_import_16__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/rpc/RpcClientError.js");
const __vite_ssr_import_17__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/rpc/RpcSerialization.js");
const __vite_ssr_import_18__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/socket/Socket.js");
const __vite_ssr_import_19__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/rpc/protocol.ts", {"importedNames":["makeWsRpcProtocolClient","PING_TIMEOUT"]});
const __vite_ssr_import_20__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/errors/network.ts", {"importedNames":["NETWORK_BLOCKING_HINT","UNRESPONSIVE_HOST_HINT"]});
const __vite_ssr_import_21__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/model.ts", {"importedNames":["ConnectionBlockedError","ConnectionTransientError"]});
const __vite_ssr_import_22__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/state/serverConfigProjection.ts", {"importedNames":["applyServerConfigProjection","withoutEnvironmentThemes"]});
const __vite_ssr_import_23__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/errors.ts", {"importedNames":["environmentMismatchError"]});
























const SOCKET_OPEN_TIMEOUT = "15 seconds";
class RpcSessionFactory extends __vite_ssr_import_2__.Service()("@t3tools/client-runtime/rpc/session/RpcSessionFactory") {};
function serverConfigReplayEvents(state) {
	const snapshot = {
		version: 1,
		type: "snapshot",
		config: (0,__vite_ssr_import_22__.withoutEnvironmentThemes)(state.projection.config)
	};
	return [
		snapshot,
		...state.themesEvent === undefined ? [] : [state.themesEvent],
		...state.sourcesEvent === undefined ? [] : [state.sourcesEvent]
	];
}
const isSocketErrorReason = __vite_ssr_import_13__.is(__vite_ssr_import_18__.SocketErrorReason);
const PING_TIMEOUT_SECONDS = __vite_ssr_import_4__.toSeconds((0,__vite_ssr_import_19__.PING_TIMEOUT));
function mapSessionRpcError(error, networkHint, via) {
	switch (error._tag) {
		case "EnvironmentAuthorizationError": return new __vite_ssr_import_21__.ConnectionBlockedError({
			reason: "permission",
			detail: error.message,
			hop: "server",
			via
		});
		case "KeybindingsConfigParseError":
		case "ServerSettingsError": return new __vite_ssr_import_21__.ConnectionTransientError({
			reason: "remote-unavailable",
			detail: error.message,
			hop: "server",
			via
		});
		case "RpcClientError": return new __vite_ssr_import_21__.ConnectionTransientError({
			reason: "transport",
			detail: `${error.message}${isSocketErrorReason(error.reason) ? networkHint : ""}`,
			...socketFailureLocation(via)
		});
	}
}
/** Over T3 Connect the relay already reached the host, so a socket that drops failed between this device and the tunnel. */
function socketFailureLocation(via) {
	return {
		hop: via === "relay" ? "tunnel" : "server",
		via
	};
}
/** @public */
const make = __vite_ssr_import_5__.fn("RpcSessionFactory.make")(function* (options = {}) {
	const webSocketConstructor = yield* __vite_ssr_import_18__.WebSocketConstructor;
	const serverConfigInput = {
		...options.environmentThemes === true ? { environmentThemes: true } : {},
		...options.usageLimitSources === true ? { usageLimitSources: true } : {},
		...options.usageLimitsCommand === true ? { usageLimitsCommand: true } : {}
	};
	const connect = __vite_ssr_import_5__.fnUntraced(function* (connection) {
		const via = connection.target._tag === "RelayConnectionTarget" ? "relay" : "direct";
		const networkHint = via === "relay" ? ` ${__vite_ssr_import_20__.NETWORK_BLOCKING_HINT}` : "";
		const mapRpcError = (error) => mapSessionRpcError(error, networkHint, via);
		yield* __vite_ssr_import_5__.annotateCurrentSpan({ "connection.environment.id": connection.environmentId });
		const connected = yield* __vite_ssr_import_3__.make();
		const disconnected = yield* __vite_ssr_import_3__.make();
		const pingTimedOut = yield* __vite_ssr_import_11__.make(false);
		const hooks = __vite_ssr_import_15__.ConnectionHooks.of({
			onConnect: __vite_ssr_import_3__.succeed(connected, undefined).pipe(__vite_ssr_import_5__.asVoid),
			onDisconnect: __vite_ssr_import_5__.all([__vite_ssr_import_3__.isDone(connected), __vite_ssr_import_11__.get(pingTimedOut)]).pipe(__vite_ssr_import_5__.flatMap(([wasConnected, timedOut]) => __vite_ssr_import_3__.fail(disconnected, new __vite_ssr_import_21__.ConnectionTransientError({
				reason: "transport",
				// The network hint only fits a socket that never opened. Once it
				// opened, the path worked, and a host that goes quiet is more
				// often overloaded or asleep than blocked.
				detail: !wasConnected ? `${connection.label} could not establish a WebSocket connection.${networkHint}` : timedOut ? `${connection.label} stopped responding for ${PING_TIMEOUT_SECONDS}s. ${__vite_ssr_import_20__.UNRESPONSIVE_HOST_HINT}` : `${connection.label} disconnected.`,
				...socketFailureLocation(via)
			}))), __vite_ssr_import_5__.asVoid)
		});
		const layerSocket = __vite_ssr_import_18__.layerWebSocket(connection.socketUrl, { openTimeout: SOCKET_OPEN_TIMEOUT }).pipe(__vite_ssr_import_8__.provide(__vite_ssr_import_8__.succeed(__vite_ssr_import_18__.WebSocketConstructor, webSocketConstructor)));
		const layerProtocol = __vite_ssr_import_8__.effect(__vite_ssr_import_15__.Protocol, __vite_ssr_import_15__.makeProtocolSocket({
			pingTimeout: __vite_ssr_import_19__.PING_TIMEOUT,
			retryTransientErrors: false,
			retryPolicy: __vite_ssr_import_12__.recurs(0),
			onPingTimeout: __vite_ssr_import_11__.set(pingTimedOut, true)
		})).pipe(__vite_ssr_import_8__.provide(__vite_ssr_import_8__.mergeAll(layerSocket, __vite_ssr_import_17__.layerJson, __vite_ssr_import_8__.succeed(__vite_ssr_import_15__.ConnectionHooks, hooks))));
		const protocolContext = yield* __vite_ssr_import_8__.build(layerProtocol).pipe(__vite_ssr_import_5__.withSpan("environment.websocket.connect"));
		// Building the protocol only starts the socket; this span times the
		// handshake up to the first open, without making `connect` wait for it.
		yield* __vite_ssr_import_3__.await(connected).pipe(__vite_ssr_import_5__.raceFirst(__vite_ssr_import_3__.await(disconnected)), __vite_ssr_import_5__.withSpan("environment.websocket.open"), __vite_ssr_import_5__.ignore, __vite_ssr_import_5__.forkScoped);
		const protocolClient = yield* __vite_ssr_import_19__.makeWsRpcProtocolClient.pipe(__vite_ssr_import_5__.provide(protocolContext));
		const initialConfigDeferred = yield* __vite_ssr_import_3__.make();
		const serverConfigExit = yield* __vite_ssr_import_3__.make();
		const configSubscriptionClosed = yield* __vite_ssr_import_3__.make();
		const serverConfigState = yield* __vite_ssr_import_11__.make(__vite_ssr_import_9__.none());
		const serverConfigUpdates = yield* __vite_ssr_import_10__.sliding(64);
		const configSubscriptionEndedError = new __vite_ssr_import_21__.ConnectionTransientError({
			reason: "remote-unavailable",
			detail: `${connection.label} config subscription ended.`
		});
		const serverConfigSource = protocolClient[__vite_ssr_import_0__.WS_METHODS.subscribeServerConfig](serverConfigInput).pipe(__vite_ssr_import_14__.runForEach((event) => __vite_ssr_import_5__.gen(function* () {
			const buffered = yield* __vite_ssr_import_11__.modify(serverConfigState, (current) => {
				const projection = (0,__vite_ssr_import_22__.applyServerConfigProjection)(__vite_ssr_import_9__.map(current, (state) => state.projection), event);
				if (__vite_ssr_import_9__.isNone(projection)) {
					return [__vite_ssr_import_9__.none(), current];
				};
				const next = {
					projection: projection.value,
					revision: __vite_ssr_import_9__.match(current, {
						onNone: () => 1,
						onSome: (state) => state.revision + 1
					}),
					themesEvent: event.type === "environmentThemesUpdated" ? event : event.type === "snapshot" && event.config.environment.capabilities.environmentThemes !== true ? undefined : __vite_ssr_import_9__.getOrUndefined(current)?.themesEvent,
					sourcesEvent: event.type === "usageLimitSourcesUpdated" ? event : event.type === "snapshot" && event.config.environment.capabilities.usageLimitSources !== true ? undefined : __vite_ssr_import_9__.getOrUndefined(current)?.sourcesEvent
				};
				return [__vite_ssr_import_9__.some({
					event,
					replay: next,
					revision: next.revision
				}), __vite_ssr_import_9__.some(next)];
			});
			if (__vite_ssr_import_9__.isSome(buffered)) {
				yield* __vite_ssr_import_10__.publish(serverConfigUpdates, buffered.value);
			};
			if (event.type === "snapshot") {
				yield* __vite_ssr_import_3__.succeed(initialConfigDeferred, event.config);
			}
		})), __vite_ssr_import_5__.onExit((exit) => {
			if (__vite_ssr_import_7__.isSuccess(exit)) {
				return __vite_ssr_import_5__.all([__vite_ssr_import_3__.succeed(serverConfigExit, undefined), __vite_ssr_import_3__.fail(configSubscriptionClosed, configSubscriptionEndedError)]).pipe(__vite_ssr_import_5__.asVoid);
			};
			if (__vite_ssr_import_1__.hasInterruptsOnly(exit.cause)) {
				return __vite_ssr_import_5__.void;
			};
			return __vite_ssr_import_5__.all([__vite_ssr_import_3__.failCause(serverConfigExit, exit.cause), __vite_ssr_import_3__.failCause(configSubscriptionClosed, __vite_ssr_import_1__.map(exit.cause, mapRpcError))]).pipe(__vite_ssr_import_5__.asVoid);
		}));
		yield* serverConfigSource.pipe(__vite_ssr_import_5__.forkScoped);
		const initialConfig = __vite_ssr_import_5__.raceFirst(__vite_ssr_import_3__.await(initialConfigDeferred), __vite_ssr_import_3__.await(serverConfigExit).pipe(__vite_ssr_import_5__.mapError(mapRpcError), __vite_ssr_import_5__.flatMap(() => __vite_ssr_import_5__.fail(configSubscriptionEndedError)))).pipe(__vite_ssr_import_5__.filterOrElse((config) => config.environment.environmentId === connection.environmentId, (config) => (0,__vite_ssr_import_23__.environmentMismatchError)({
			expected: connection.environmentId,
			actual: config.environment.environmentId
		})), __vite_ssr_import_5__.withSpan("environment.initialSync"));
		const serverConfigEvents = __vite_ssr_import_14__.unwrap(__vite_ssr_import_5__.gen(function* () {
			const subscription = yield* __vite_ssr_import_10__.subscribe(serverConfigUpdates);
			const snapshot = yield* __vite_ssr_import_11__.get(serverConfigState);
			if (__vite_ssr_import_9__.isNone(snapshot)) {
				return __vite_ssr_import_14__.empty;
			};
			const updates = __vite_ssr_import_14__.fromSubscription(subscription).pipe(__vite_ssr_import_14__.filter((buffered) => buffered.revision > snapshot.value.revision), __vite_ssr_import_14__.mapAccum(() => snapshot.value.revision, (revision, buffered) => [buffered.revision, buffered.revision === revision + 1 ? [buffered.event] : serverConfigReplayEvents(buffered.replay)]));
			const terminal = __vite_ssr_import_14__.fromEffect(__vite_ssr_import_3__.await(serverConfigExit)).pipe(__vite_ssr_import_14__.drain);
			return __vite_ssr_import_14__.concat(__vite_ssr_import_14__.fromIterable(serverConfigReplayEvents(snapshot.value)), __vite_ssr_import_14__.merge(updates, terminal, { haltStrategy: "either" }));
		})).pipe(__vite_ssr_import_14__.catchCause((cause) => {
			if (__vite_ssr_import_1__.hasInterruptsOnly(cause)) {
				return __vite_ssr_import_14__.failCause(cause);
			};
			// The supervisor keeps the original cause. Shared durable consumers
			// need a transport-shaped failure so they wait for its replacement.
			return __vite_ssr_import_14__.fail(new __vite_ssr_import_16__.RpcClientError({ reason: new __vite_ssr_import_16__.RpcClientDefect({
				message: `${connection.label} config subscription failed.`,
				cause
			}) }));
		}));
		const validatedInitialConfig = initialConfig.pipe(__vite_ssr_import_5__.mapError((cause) => new __vite_ssr_import_16__.RpcClientError({ reason: new __vite_ssr_import_16__.RpcClientDefect({
			message: `${connection.label} config subscription failed.`,
			cause
		}) })));
		const subscribeServerConfig = (input) => __vite_ssr_import_14__.unwrap(validatedInitialConfig.pipe(__vite_ssr_import_5__.as(__vite_ssr_import_6__.equals(input, serverConfigInput) ? serverConfigEvents : protocolClient[__vite_ssr_import_0__.WS_METHODS.subscribeServerConfig](input))));
		const probe = initialConfig.pipe(__vite_ssr_import_5__.flatMap((config) => (config.environment.capabilities.connectionProbe === true ? protocolClient[__vite_ssr_import_0__.WS_METHODS.serverProbe]({}) : protocolClient[__vite_ssr_import_0__.WS_METHODS.serverGetConfig]({})).pipe(__vite_ssr_import_5__.mapError(mapRpcError))), __vite_ssr_import_5__.asVoid, __vite_ssr_import_5__.withSpan("clientRuntime.connection.rpcSession.probe"));
		return {
			client: protocolClient,
			initialConfig,
			subscribeServerConfig,
			ready: __vite_ssr_import_3__.await(connected).pipe(__vite_ssr_import_5__.andThen(initialConfig), __vite_ssr_import_5__.asVoid, __vite_ssr_import_5__.raceFirst(__vite_ssr_import_3__.await(disconnected))),
			probe,
			closed: __vite_ssr_import_5__.raceFirst(__vite_ssr_import_3__.await(disconnected), __vite_ssr_import_3__.await(configSubscriptionClosed))
		};
	});
	return RpcSessionFactory.of({ connect });
});
const layer = (options) => __vite_ssr_import_8__.effect(RpcSessionFactory, make(options));
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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b24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBTZXJ2ZXJDb25maWcsXG4gIHR5cGUgU2VydmVyQ29uZmlnU3RyZWFtRXZlbnQsXG4gIFdzU3Vic2NyaWJlU2VydmVyQ29uZmlnUnBjLFxuICBXU19NRVRIT0RTLFxufSBmcm9tIFwiQHQzdG9vbHMvY29udHJhY3RzXCI7XG5pbXBvcnQgKiBhcyBDYXVzZSBmcm9tIFwiZWZmZWN0L0NhdXNlXCI7XG5pbXBvcnQgKiBhcyBDb250ZXh0IGZyb20gXCJlZmZlY3QvQ29udGV4dFwiO1xuaW1wb3J0ICogYXMgRGVmZXJyZWQgZnJvbSBcImVmZmVjdC9EZWZlcnJlZFwiO1xuaW1wb3J0ICogYXMgRHVyYXRpb24gZnJvbSBcImVmZmVjdC9EdXJhdGlvblwiO1xuaW1wb3J0ICogYXMgRWZmZWN0IGZyb20gXCJlZmZlY3QvRWZmZWN0XCI7XG5pbXBvcnQgKiBhcyBFcXVhbCBmcm9tIFwiZWZmZWN0L0VxdWFsXCI7XG5pbXBvcnQgKiBhcyBFeGl0IGZyb20gXCJlZmZlY3QvRXhpdFwiO1xuaW1wb3J0ICogYXMgTGF5ZXIgZnJvbSBcImVmZmVjdC9MYXllclwiO1xuaW1wb3J0ICogYXMgT3B0aW9uIGZyb20gXCJlZmZlY3QvT3B0aW9uXCI7XG5pbXBvcnQgKiBhcyBQdWJTdWIgZnJvbSBcImVmZmVjdC9QdWJTdWJcIjtcbmltcG9ydCAqIGFzIFJlZiBmcm9tIFwiZWZmZWN0L1JlZlwiO1xuaW1wb3J0ICogYXMgU2NoZWR1bGUgZnJvbSBcImVmZmVjdC9TY2hlZHVsZVwiO1xuaW1wb3J0ICogYXMgU2NoZW1hIGZyb20gXCJlZmZlY3QvU2NoZW1hXCI7XG5pbXBvcnQgdHlwZSAqIGFzIFNjb3BlIGZyb20gXCJlZmZlY3QvU2NvcGVcIjtcbmltcG9ydCAqIGFzIFN0cmVhbSBmcm9tIFwiZWZmZWN0L1N0cmVhbVwiO1xuaW1wb3J0IHR5cGUgKiBhcyBScGMgZnJvbSBcImVmZmVjdC9ycGMvUnBjXCI7XG5pbXBvcnQgKiBhcyBScGNDbGllbnQgZnJvbSBcImVmZmVjdC9ycGMvUnBjQ2xpZW50XCI7XG5pbXBvcnQgKiBhcyBScGNDbGllbnRFcnJvciBmcm9tIFwiZWZmZWN0L3JwYy9ScGNDbGllbnRFcnJvclwiO1xuaW1wb3J0ICogYXMgUnBjU2VyaWFsaXphdGlvbiBmcm9tIFwiZWZmZWN0L3JwYy9ScGNTZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQgKiBhcyBTb2NrZXQgZnJvbSBcImVmZmVjdC9zb2NrZXQvU29ja2V0XCI7XG5cbmltcG9ydCB7IG1ha2VXc1JwY1Byb3RvY29sQ2xpZW50LCBQSU5HX1RJTUVPVVQsIHR5cGUgV3NScGNQcm90b2NvbENsaWVudCB9IGZyb20gXCIuL3Byb3RvY29sLnRzXCI7XG5pbXBvcnQgeyBORVRXT1JLX0JMT0NLSU5HX0hJTlQsIFVOUkVTUE9OU0lWRV9IT1NUX0hJTlQgfSBmcm9tIFwiLi4vZXJyb3JzL25ldHdvcmsudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29ubmVjdGlvbkF0dGVtcHRFcnJvcixcbiAgQ29ubmVjdGlvblRyYW5zaWVudEVycm9yLFxuICBQcmVwYXJlZENvbm5lY3Rpb24sXG59IGZyb20gXCIuLi9jb25uZWN0aW9uL21vZGVsLnRzXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uQmxvY2tlZEVycm9yLFxuICBDb25uZWN0aW9uVHJhbnNpZW50RXJyb3IgYXMgQ29ubmVjdGlvblRyYW5zaWVudEVycm9yQ2xhc3MsXG59IGZyb20gXCIuLi9jb25uZWN0aW9uL21vZGVsLnRzXCI7XG5pbXBvcnQge1xuICBhcHBseVNlcnZlckNvbmZpZ1Byb2plY3Rpb24sXG4gIHR5cGUgU2VydmVyQ29uZmlnUHJvamVjdGlvbixcbiAgd2l0aG91dEVudmlyb25tZW50VGhlbWVzLFxufSBmcm9tIFwiLi4vc3RhdGUvc2VydmVyQ29uZmlnUHJvamVjdGlvbi50c1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRNaXNtYXRjaEVycm9yIH0gZnJvbSBcIi4uL2Nvbm5lY3Rpb24vZXJyb3JzLnRzXCI7XG5cbmNvbnN0IFNPQ0tFVF9PUEVOX1RJTUVPVVQgPSBcIjE1IHNlY29uZHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBScGNTZXNzaW9uIHtcbiAgcmVhZG9ubHkgY2xpZW50OiBXc1JwY1Byb3RvY29sQ2xpZW50O1xuICByZWFkb25seSBpbml0aWFsQ29uZmlnOiBFZmZlY3QuRWZmZWN0PFNlcnZlckNvbmZpZywgQ29ubmVjdGlvbkF0dGVtcHRFcnJvcj47XG4gIHJlYWRvbmx5IHN1YnNjcmliZVNlcnZlckNvbmZpZzogKFxuICAgIGlucHV0OiBTZXJ2ZXJDb25maWdTdWJzY3JpcHRpb25JbnB1dCxcbiAgKSA9PiBTZXJ2ZXJDb25maWdTdWJzY3JpcHRpb247XG4gIHJlYWRvbmx5IHJlYWR5OiBFZmZlY3QuRWZmZWN0PHZvaWQsIENvbm5lY3Rpb25BdHRlbXB0RXJyb3I+O1xuICByZWFkb25seSBwcm9iZTogRWZmZWN0LkVmZmVjdDx2b2lkLCBDb25uZWN0aW9uQXR0ZW1wdEVycm9yPjtcbiAgcmVhZG9ubHkgY2xvc2VkOiBFZmZlY3QuRWZmZWN0PG5ldmVyLCBDb25uZWN0aW9uQXR0ZW1wdEVycm9yPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBScGNTZXNzaW9uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50VGhlbWVzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNhZ2VMaW1pdFNvdXJjZXM/OiBib29sZWFuO1xuICByZWFkb25seSB1c2FnZUxpbWl0c0NvbW1hbmQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgUnBjU2Vzc2lvbkZhY3RvcnkgZXh0ZW5kcyBDb250ZXh0LlNlcnZpY2U8XG4gIFJwY1Nlc3Npb25GYWN0b3J5LFxuICB7XG4gICAgcmVhZG9ubHkgY29ubmVjdDogKFxuICAgICAgY29ubmVjdGlvbjogUHJlcGFyZWRDb25uZWN0aW9uLFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxScGNTZXNzaW9uLCBDb25uZWN0aW9uQXR0ZW1wdEVycm9yLCBTY29wZS5TY29wZT47XG4gIH1cbj4oKShcIkB0M3Rvb2xzL2NsaWVudC1ydW50aW1lL3JwYy9zZXNzaW9uL1JwY1Nlc3Npb25GYWN0b3J5XCIpIHt9XG5cbnR5cGUgSW5pdGlhbENvbmZpZ0Vycm9yID0gRWZmZWN0LkVycm9yPFxuICBSZXR1cm5UeXBlPFdzUnBjUHJvdG9jb2xDbGllbnRbdHlwZW9mIFdTX01FVEhPRFMuc2VydmVyR2V0Q29uZmlnXT5cbj47XG50eXBlIFByb2JlRXJyb3IgPSBFZmZlY3QuRXJyb3I8UmV0dXJuVHlwZTxXc1JwY1Byb3RvY29sQ2xpZW50W3R5cGVvZiBXU19NRVRIT0RTLnNlcnZlclByb2JlXT4+O1xudHlwZSBTZXJ2ZXJDb25maWdTdWJzY3JpcHRpb25FcnJvciA9XG4gIHwgUnBjLkVycm9yRXhpdDx0eXBlb2YgV3NTdWJzY3JpYmVTZXJ2ZXJDb25maWdScGM+XG4gIHwgUnBjQ2xpZW50RXJyb3IuUnBjQ2xpZW50RXJyb3I7XG50eXBlIFNlcnZlckNvbmZpZ1N1YnNjcmlwdGlvbiA9IFN0cmVhbS5TdHJlYW08XG4gIFNlcnZlckNvbmZpZ1N0cmVhbUV2ZW50LFxuICBTZXJ2ZXJDb25maWdTdWJzY3JpcHRpb25FcnJvclxuPjtcbnR5cGUgU2VydmVyQ29uZmlnU3Vic2NyaXB0aW9uSW5wdXQgPSBQYXJhbWV0ZXJzPFxuICBXc1JwY1Byb3RvY29sQ2xpZW50W3R5cGVvZiBXU19NRVRIT0RTLnN1YnNjcmliZVNlcnZlckNvbmZpZ11cbj5bMF07XG50eXBlIEVudmlyb25tZW50VGhlbWVzVXBkYXRlZEV2ZW50ID0gRXh0cmFjdDxcbiAgU2VydmVyQ29uZmlnU3RyZWFtRXZlbnQsXG4gIHsgcmVhZG9ubHkgdHlwZTogXCJlbnZpcm9ubWVudFRoZW1lc1VwZGF0ZWRcIiB9XG4+O1xudHlwZSBVc2FnZUxpbWl0U291cmNlc1VwZGF0ZWRFdmVudCA9IEV4dHJhY3Q8XG4gIFNlcnZlckNvbmZpZ1N0cmVhbUV2ZW50LFxuICB7IHJlYWRvbmx5IHR5cGU6IFwidXNhZ2VMaW1pdFNvdXJjZXNVcGRhdGVkXCIgfVxuPjtcblxuaW50ZXJmYWNlIFNlcnZlckNvbmZpZ1JlcGxheVN0YXRlIHtcbiAgcmVhZG9ubHkgcHJvamVjdGlvbjogU2VydmVyQ29uZmlnUHJvamVjdGlvbjtcbiAgcmVhZG9ubHkgcmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgdGhlbWVzRXZlbnQ6IEVudmlyb25tZW50VGhlbWVzVXBkYXRlZEV2ZW50IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzb3VyY2VzRXZlbnQ6IFVzYWdlTGltaXRTb3VyY2VzVXBkYXRlZEV2ZW50IHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQnVmZmVyZWRTZXJ2ZXJDb25maWdFdmVudCB7XG4gIHJlYWRvbmx5IGV2ZW50OiBTZXJ2ZXJDb25maWdTdHJlYW1FdmVudDtcbiAgcmVhZG9ubHkgcmVwbGF5OiBTZXJ2ZXJDb25maWdSZXBsYXlTdGF0ZTtcbiAgcmVhZG9ubHkgcmV2aXNpb246IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gc2VydmVyQ29uZmlnUmVwbGF5RXZlbnRzKFxuICBzdGF0ZTogU2VydmVyQ29uZmlnUmVwbGF5U3RhdGUsXG4pOiBSZWFkb25seUFycmF5PFNlcnZlckNvbmZpZ1N0cmVhbUV2ZW50PiB7XG4gIGNvbnN0IHNuYXBzaG90ID0ge1xuICAgIHZlcnNpb246IDEgYXMgY29uc3QsXG4gICAgdHlwZTogXCJzbmFwc2hvdFwiIGFzIGNvbnN0LFxuICAgIGNvbmZpZzogd2l0aG91dEVudmlyb25tZW50VGhlbWVzKHN0YXRlLnByb2plY3Rpb24uY29uZmlnKSxcbiAgfTtcbiAgcmV0dXJuIFtcbiAgICBzbmFwc2hvdCxcbiAgICAuLi4oc3RhdGUudGhlbWVzRXZlbnQgPT09IHVuZGVmaW5lZCA/IFtdIDogW3N0YXRlLnRoZW1lc0V2ZW50XSksXG4gICAgLi4uKHN0YXRlLnNvdXJjZXNFdmVudCA9PT0gdW5kZWZpbmVkID8gW10gOiBbc3RhdGUuc291cmNlc0V2ZW50XSksXG4gIF07XG59XG5cbmNvbnN0IGlzU29ja2V0RXJyb3JSZWFzb24gPSBTY2hlbWEuaXMoU29ja2V0LlNvY2tldEVycm9yUmVhc29uKTtcbmNvbnN0IFBJTkdfVElNRU9VVF9TRUNPTkRTID0gRHVyYXRpb24udG9TZWNvbmRzKFBJTkdfVElNRU9VVCk7XG5cbmZ1bmN0aW9uIG1hcFNlc3Npb25ScGNFcnJvcihcbiAgZXJyb3I6IEluaXRpYWxDb25maWdFcnJvciB8IFByb2JlRXJyb3IgfCBTZXJ2ZXJDb25maWdTdWJzY3JpcHRpb25FcnJvcixcbiAgbmV0d29ya0hpbnQ6IHN0cmluZyxcbiAgdmlhOiBcInJlbGF5XCIgfCBcImRpcmVjdFwiLFxuKTogQ29ubmVjdGlvbkF0dGVtcHRFcnJvciB7XG4gIHN3aXRjaCAoZXJyb3IuX3RhZykge1xuICAgIGNhc2UgXCJFbnZpcm9ubWVudEF1dGhvcml6YXRpb25FcnJvclwiOlxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uQmxvY2tlZEVycm9yKHtcbiAgICAgICAgcmVhc29uOiBcInBlcm1pc3Npb25cIixcbiAgICAgICAgZGV0YWlsOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBob3A6IFwic2VydmVyXCIsXG4gICAgICAgIHZpYSxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJLZXliaW5kaW5nc0NvbmZpZ1BhcnNlRXJyb3JcIjpcbiAgICBjYXNlIFwiU2VydmVyU2V0dGluZ3NFcnJvclwiOlxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVHJhbnNpZW50RXJyb3JDbGFzcyh7XG4gICAgICAgIHJlYXNvbjogXCJyZW1vdGUtdW5hdmFpbGFibGVcIixcbiAgICAgICAgZGV0YWlsOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBob3A6IFwic2VydmVyXCIsXG4gICAgICAgIHZpYSxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJScGNDbGllbnRFcnJvclwiOlxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uVHJhbnNpZW50RXJyb3JDbGFzcyh7XG4gICAgICAgIHJlYXNvbjogXCJ0cmFuc3BvcnRcIixcbiAgICAgICAgZGV0YWlsOiBgJHtlcnJvci5tZXNzYWdlfSR7aXNTb2NrZXRFcnJvclJlYXNvbihlcnJvci5yZWFzb24pID8gbmV0d29ya0hpbnQgOiBcIlwifWAsXG4gICAgICAgIC4uLnNvY2tldEZhaWx1cmVMb2NhdGlvbih2aWEpLFxuICAgICAgfSk7XG4gIH1cbn1cblxuLyoqIE92ZXIgVDMgQ29ubmVjdCB0aGUgcmVsYXkgYWxyZWFkeSByZWFjaGVkIHRoZSBob3N0LCBzbyBhIHNvY2tldCB0aGF0IGRyb3BzIGZhaWxlZCBiZXR3ZWVuIHRoaXMgZGV2aWNlIGFuZCB0aGUgdHVubmVsLiAqL1xuZnVuY3Rpb24gc29ja2V0RmFpbHVyZUxvY2F0aW9uKHZpYTogXCJyZWxheVwiIHwgXCJkaXJlY3RcIikge1xuICByZXR1cm4geyBob3A6IHZpYSA9PT0gXCJyZWxheVwiID8gXCJ0dW5uZWxcIiA6IFwic2VydmVyXCIsIHZpYSB9IGFzIGNvbnN0O1xufVxuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSBFZmZlY3QuZm4oXCJScGNTZXNzaW9uRmFjdG9yeS5tYWtlXCIpKGZ1bmN0aW9uKiAoXG4gIG9wdGlvbnM6IFJwY1Nlc3Npb25PcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qgd2ViU29ja2V0Q29uc3RydWN0b3IgPSB5aWVsZCogU29ja2V0LldlYlNvY2tldENvbnN0cnVjdG9yO1xuICBjb25zdCBzZXJ2ZXJDb25maWdJbnB1dDogU2VydmVyQ29uZmlnU3Vic2NyaXB0aW9uSW5wdXQgPSB7XG4gICAgLi4uKG9wdGlvbnMuZW52aXJvbm1lbnRUaGVtZXMgPT09IHRydWUgPyB7IGVudmlyb25tZW50VGhlbWVzOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMudXNhZ2VMaW1pdFNvdXJjZXMgPT09IHRydWUgPyB7IHVzYWdlTGltaXRTb3VyY2VzOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMudXNhZ2VMaW1pdHNDb21tYW5kID09PSB0cnVlID8geyB1c2FnZUxpbWl0c0NvbW1hbmQ6IHRydWUgfSA6IHt9KSxcbiAgfTtcblxuICBjb25zdCBjb25uZWN0ID0gRWZmZWN0LmZuVW50cmFjZWQoZnVuY3Rpb24qIChjb25uZWN0aW9uOiBQcmVwYXJlZENvbm5lY3Rpb24pIHtcbiAgICBjb25zdCB2aWEgPSBjb25uZWN0aW9uLnRhcmdldC5fdGFnID09PSBcIlJlbGF5Q29ubmVjdGlvblRhcmdldFwiID8gXCJyZWxheVwiIDogXCJkaXJlY3RcIjtcbiAgICBjb25zdCBuZXR3b3JrSGludCA9IHZpYSA9PT0gXCJyZWxheVwiID8gYCAke05FVFdPUktfQkxPQ0tJTkdfSElOVH1gIDogXCJcIjtcbiAgICBjb25zdCBtYXBScGNFcnJvciA9IChlcnJvcjogUGFyYW1ldGVyczx0eXBlb2YgbWFwU2Vzc2lvblJwY0Vycm9yPlswXSkgPT5cbiAgICAgIG1hcFNlc3Npb25ScGNFcnJvcihlcnJvciwgbmV0d29ya0hpbnQsIHZpYSk7XG4gICAgeWllbGQqIEVmZmVjdC5hbm5vdGF0ZUN1cnJlbnRTcGFuKHtcbiAgICAgIFwiY29ubmVjdGlvbi5lbnZpcm9ubWVudC5pZFwiOiBjb25uZWN0aW9uLmVudmlyb25tZW50SWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25uZWN0ZWQgPSB5aWVsZCogRGVmZXJyZWQubWFrZTx2b2lkPigpO1xuICAgIGNvbnN0IGRpc2Nvbm5lY3RlZCA9IHlpZWxkKiBEZWZlcnJlZC5tYWtlPG5ldmVyLCBDb25uZWN0aW9uVHJhbnNpZW50RXJyb3I+KCk7XG4gICAgY29uc3QgcGluZ1RpbWVkT3V0ID0geWllbGQqIFJlZi5tYWtlKGZhbHNlKTtcbiAgICBjb25zdCBob29rcyA9IFJwY0NsaWVudC5Db25uZWN0aW9uSG9va3Mub2Yoe1xuICAgICAgb25Db25uZWN0OiBEZWZlcnJlZC5zdWNjZWVkKGNvbm5lY3RlZCwgdW5kZWZpbmVkKS5waXBlKEVmZmVjdC5hc1ZvaWQpLFxuICAgICAgb25EaXNjb25uZWN0OiBFZmZlY3QuYWxsKFtEZWZlcnJlZC5pc0RvbmUoY29ubmVjdGVkKSwgUmVmLmdldChwaW5nVGltZWRPdXQpXSkucGlwZShcbiAgICAgICAgRWZmZWN0LmZsYXRNYXAoKFt3YXNDb25uZWN0ZWQsIHRpbWVkT3V0XSkgPT5cbiAgICAgICAgICBEZWZlcnJlZC5mYWlsKFxuICAgICAgICAgICAgZGlzY29ubmVjdGVkLFxuICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25UcmFuc2llbnRFcnJvckNsYXNzKHtcbiAgICAgICAgICAgICAgcmVhc29uOiBcInRyYW5zcG9ydFwiLFxuICAgICAgICAgICAgICAvLyBUaGUgbmV0d29yayBoaW50IG9ubHkgZml0cyBhIHNvY2tldCB0aGF0IG5ldmVyIG9wZW5lZC4gT25jZSBpdFxuICAgICAgICAgICAgICAvLyBvcGVuZWQsIHRoZSBwYXRoIHdvcmtlZCwgYW5kIGEgaG9zdCB0aGF0IGdvZXMgcXVpZXQgaXMgbW9yZVxuICAgICAgICAgICAgICAvLyBvZnRlbiBvdmVybG9hZGVkIG9yIGFzbGVlcCB0aGFuIGJsb2NrZWQuXG4gICAgICAgICAgICAgIGRldGFpbDogIXdhc0Nvbm5lY3RlZFxuICAgICAgICAgICAgICAgID8gYCR7Y29ubmVjdGlvbi5sYWJlbH0gY291bGQgbm90IGVzdGFibGlzaCBhIFdlYlNvY2tldCBjb25uZWN0aW9uLiR7bmV0d29ya0hpbnR9YFxuICAgICAgICAgICAgICAgIDogdGltZWRPdXRcbiAgICAgICAgICAgICAgICAgID8gYCR7Y29ubmVjdGlvbi5sYWJlbH0gc3RvcHBlZCByZXNwb25kaW5nIGZvciAke1BJTkdfVElNRU9VVF9TRUNPTkRTfXMuICR7VU5SRVNQT05TSVZFX0hPU1RfSElOVH1gXG4gICAgICAgICAgICAgICAgICA6IGAke2Nvbm5lY3Rpb24ubGFiZWx9IGRpc2Nvbm5lY3RlZC5gLFxuICAgICAgICAgICAgICAuLi5zb2NrZXRGYWlsdXJlTG9jYXRpb24odmlhKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICAgIEVmZmVjdC5hc1ZvaWQsXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IGxheWVyU29ja2V0ID0gU29ja2V0LmxheWVyV2ViU29ja2V0KGNvbm5lY3Rpb24uc29ja2V0VXJsLCB7XG4gICAgICBvcGVuVGltZW91dDogU09DS0VUX09QRU5fVElNRU9VVCxcbiAgICB9KS5waXBlKExheWVyLnByb3ZpZGUoTGF5ZXIuc3VjY2VlZChTb2NrZXQuV2ViU29ja2V0Q29uc3RydWN0b3IsIHdlYlNvY2tldENvbnN0cnVjdG9yKSkpO1xuICAgIGNvbnN0IGxheWVyUHJvdG9jb2wgPSBMYXllci5lZmZlY3QoXG4gICAgICBScGNDbGllbnQuUHJvdG9jb2wsXG4gICAgICBScGNDbGllbnQubWFrZVByb3RvY29sU29ja2V0KHtcbiAgICAgICAgcGluZ1RpbWVvdXQ6IFBJTkdfVElNRU9VVCxcbiAgICAgICAgcmV0cnlUcmFuc2llbnRFcnJvcnM6IGZhbHNlLFxuICAgICAgICByZXRyeVBvbGljeTogU2NoZWR1bGUucmVjdXJzKDApLFxuICAgICAgICBvblBpbmdUaW1lb3V0OiBSZWYuc2V0KHBpbmdUaW1lZE91dCwgdHJ1ZSksXG4gICAgICB9KSxcbiAgICApLnBpcGUoXG4gICAgICBMYXllci5wcm92aWRlKFxuICAgICAgICBMYXllci5tZXJnZUFsbChcbiAgICAgICAgICBsYXllclNvY2tldCxcbiAgICAgICAgICBScGNTZXJpYWxpemF0aW9uLmxheWVySnNvbixcbiAgICAgICAgICBMYXllci5zdWNjZWVkKFJwY0NsaWVudC5Db25uZWN0aW9uSG9va3MsIGhvb2tzKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBwcm90b2NvbENvbnRleHQgPSB5aWVsZCogTGF5ZXIuYnVpbGQobGF5ZXJQcm90b2NvbCkucGlwZShcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImVudmlyb25tZW50LndlYnNvY2tldC5jb25uZWN0XCIpLFxuICAgICk7XG4gICAgLy8gQnVpbGRpbmcgdGhlIHByb3RvY29sIG9ubHkgc3RhcnRzIHRoZSBzb2NrZXQ7IHRoaXMgc3BhbiB0aW1lcyB0aGVcbiAgICAvLyBoYW5kc2hha2UgdXAgdG8gdGhlIGZpcnN0IG9wZW4sIHdpdGhvdXQgbWFraW5nIGBjb25uZWN0YCB3YWl0IGZvciBpdC5cbiAgICB5aWVsZCogRGVmZXJyZWQuYXdhaXQoY29ubmVjdGVkKS5waXBlKFxuICAgICAgRWZmZWN0LnJhY2VGaXJzdChEZWZlcnJlZC5hd2FpdChkaXNjb25uZWN0ZWQpKSxcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImVudmlyb25tZW50LndlYnNvY2tldC5vcGVuXCIpLFxuICAgICAgRWZmZWN0Lmlnbm9yZSxcbiAgICAgIEVmZmVjdC5mb3JrU2NvcGVkLFxuICAgICk7XG4gICAgY29uc3QgcHJvdG9jb2xDbGllbnQgPSB5aWVsZCogbWFrZVdzUnBjUHJvdG9jb2xDbGllbnQucGlwZShFZmZlY3QucHJvdmlkZShwcm90b2NvbENvbnRleHQpKTtcbiAgICBjb25zdCBpbml0aWFsQ29uZmlnRGVmZXJyZWQgPSB5aWVsZCogRGVmZXJyZWQubWFrZTxTZXJ2ZXJDb25maWc+KCk7XG4gICAgY29uc3Qgc2VydmVyQ29uZmlnRXhpdCA9IHlpZWxkKiBEZWZlcnJlZC5tYWtlPHZvaWQsIFNlcnZlckNvbmZpZ1N1YnNjcmlwdGlvbkVycm9yPigpO1xuICAgIGNvbnN0IGNvbmZpZ1N1YnNjcmlwdGlvbkNsb3NlZCA9IHlpZWxkKiBEZWZlcnJlZC5tYWtlPG5ldmVyLCBDb25uZWN0aW9uQXR0ZW1wdEVycm9yPigpO1xuICAgIGNvbnN0IHNlcnZlckNvbmZpZ1N0YXRlID0geWllbGQqIFJlZi5tYWtlKE9wdGlvbi5ub25lPFNlcnZlckNvbmZpZ1JlcGxheVN0YXRlPigpKTtcbiAgICBjb25zdCBzZXJ2ZXJDb25maWdVcGRhdGVzID0geWllbGQqIFB1YlN1Yi5zbGlkaW5nPEJ1ZmZlcmVkU2VydmVyQ29uZmlnRXZlbnQ+KDY0KTtcbiAgICBjb25zdCBjb25maWdTdWJzY3JpcHRpb25FbmRlZEVycm9yID0gbmV3IENvbm5lY3Rpb25UcmFuc2llbnRFcnJvckNsYXNzKHtcbiAgICAgIHJlYXNvbjogXCJyZW1vdGUtdW5hdmFpbGFibGVcIixcbiAgICAgIGRldGFpbDogYCR7Y29ubmVjdGlvbi5sYWJlbH0gY29uZmlnIHN1YnNjcmlwdGlvbiBlbmRlZC5gLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcnZlckNvbmZpZ1NvdXJjZSA9IHByb3RvY29sQ2xpZW50W1dTX01FVEhPRFMuc3Vic2NyaWJlU2VydmVyQ29uZmlnXShcbiAgICAgIHNlcnZlckNvbmZpZ0lucHV0LFxuICAgICkucGlwZShcbiAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKChldmVudCkgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkID0geWllbGQqIFJlZi5tb2RpZnkoc2VydmVyQ29uZmlnU3RhdGUsIChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gYXBwbHlTZXJ2ZXJDb25maWdQcm9qZWN0aW9uKFxuICAgICAgICAgICAgICBPcHRpb24ubWFwKGN1cnJlbnQsIChzdGF0ZSkgPT4gc3RhdGUucHJvamVjdGlvbiksXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPcHRpb24uaXNOb25lKHByb2plY3Rpb24pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbT3B0aW9uLm5vbmU8QnVmZmVyZWRTZXJ2ZXJDb25maWdFdmVudD4oKSwgY3VycmVudF0gYXMgY29uc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0ge1xuICAgICAgICAgICAgICBwcm9qZWN0aW9uOiBwcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICByZXZpc2lvbjogT3B0aW9uLm1hdGNoKGN1cnJlbnQsIHtcbiAgICAgICAgICAgICAgICBvbk5vbmU6ICgpID0+IDEsXG4gICAgICAgICAgICAgICAgb25Tb21lOiAoc3RhdGUpID0+IHN0YXRlLnJldmlzaW9uICsgMSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHRoZW1lc0V2ZW50OlxuICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUgPT09IFwiZW52aXJvbm1lbnRUaGVtZXNVcGRhdGVkXCJcbiAgICAgICAgICAgICAgICAgID8gZXZlbnRcbiAgICAgICAgICAgICAgICAgIDogZXZlbnQudHlwZSA9PT0gXCJzbmFwc2hvdFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29uZmlnLmVudmlyb25tZW50LmNhcGFiaWxpdGllcy5lbnZpcm9ubWVudFRoZW1lcyAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IE9wdGlvbi5nZXRPclVuZGVmaW5lZChjdXJyZW50KT8udGhlbWVzRXZlbnQsXG4gICAgICAgICAgICAgIHNvdXJjZXNFdmVudDpcbiAgICAgICAgICAgICAgICBldmVudC50eXBlID09PSBcInVzYWdlTGltaXRTb3VyY2VzVXBkYXRlZFwiXG4gICAgICAgICAgICAgICAgICA/IGV2ZW50XG4gICAgICAgICAgICAgICAgICA6IGV2ZW50LnR5cGUgPT09IFwic25hcHNob3RcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbmZpZy5lbnZpcm9ubWVudC5jYXBhYmlsaXRpZXMudXNhZ2VMaW1pdFNvdXJjZXMgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiBPcHRpb24uZ2V0T3JVbmRlZmluZWQoY3VycmVudCk/LnNvdXJjZXNFdmVudCxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFNlcnZlckNvbmZpZ1JlcGxheVN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgT3B0aW9uLnNvbWUoeyBldmVudCwgcmVwbGF5OiBuZXh0LCByZXZpc2lvbjogbmV4dC5yZXZpc2lvbiB9KSxcbiAgICAgICAgICAgICAgT3B0aW9uLnNvbWUobmV4dCksXG4gICAgICAgICAgICBdIGFzIGNvbnN0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChPcHRpb24uaXNTb21lKGJ1ZmZlcmVkKSkge1xuICAgICAgICAgICAgeWllbGQqIFB1YlN1Yi5wdWJsaXNoKHNlcnZlckNvbmZpZ1VwZGF0ZXMsIGJ1ZmZlcmVkLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwic25hcHNob3RcIikge1xuICAgICAgICAgICAgeWllbGQqIERlZmVycmVkLnN1Y2NlZWQoaW5pdGlhbENvbmZpZ0RlZmVycmVkLCBldmVudC5jb25maWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgRWZmZWN0Lm9uRXhpdCgoZXhpdCkgPT4ge1xuICAgICAgICBpZiAoRXhpdC5pc1N1Y2Nlc3MoZXhpdCkpIHtcbiAgICAgICAgICByZXR1cm4gRWZmZWN0LmFsbChbXG4gICAgICAgICAgICBEZWZlcnJlZC5zdWNjZWVkKHNlcnZlckNvbmZpZ0V4aXQsIHVuZGVmaW5lZCksXG4gICAgICAgICAgICBEZWZlcnJlZC5mYWlsKGNvbmZpZ1N1YnNjcmlwdGlvbkNsb3NlZCwgY29uZmlnU3Vic2NyaXB0aW9uRW5kZWRFcnJvciksXG4gICAgICAgICAgXSkucGlwZShFZmZlY3QuYXNWb2lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ2F1c2UuaGFzSW50ZXJydXB0c09ubHkoZXhpdC5jYXVzZSkpIHtcbiAgICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVmZmVjdC5hbGwoW1xuICAgICAgICAgIERlZmVycmVkLmZhaWxDYXVzZShzZXJ2ZXJDb25maWdFeGl0LCBleGl0LmNhdXNlKSxcbiAgICAgICAgICBEZWZlcnJlZC5mYWlsQ2F1c2UoY29uZmlnU3Vic2NyaXB0aW9uQ2xvc2VkLCBDYXVzZS5tYXAoZXhpdC5jYXVzZSwgbWFwUnBjRXJyb3IpKSxcbiAgICAgICAgXSkucGlwZShFZmZlY3QuYXNWb2lkKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgeWllbGQqIHNlcnZlckNvbmZpZ1NvdXJjZS5waXBlKEVmZmVjdC5mb3JrU2NvcGVkKTtcbiAgICBjb25zdCBpbml0aWFsQ29uZmlnID0gRWZmZWN0LnJhY2VGaXJzdChcbiAgICAgIERlZmVycmVkLmF3YWl0KGluaXRpYWxDb25maWdEZWZlcnJlZCksXG4gICAgICBEZWZlcnJlZC5hd2FpdChzZXJ2ZXJDb25maWdFeGl0KS5waXBlKFxuICAgICAgICBFZmZlY3QubWFwRXJyb3IobWFwUnBjRXJyb3IpLFxuICAgICAgICBFZmZlY3QuZmxhdE1hcCgoKSA9PiBFZmZlY3QuZmFpbChjb25maWdTdWJzY3JpcHRpb25FbmRlZEVycm9yKSksXG4gICAgICApLFxuICAgICkucGlwZShcbiAgICAgIEVmZmVjdC5maWx0ZXJPckVsc2UoXG4gICAgICAgIChjb25maWcpID0+IGNvbmZpZy5lbnZpcm9ubWVudC5lbnZpcm9ubWVudElkID09PSBjb25uZWN0aW9uLmVudmlyb25tZW50SWQsXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgZW52aXJvbm1lbnRNaXNtYXRjaEVycm9yKHtcbiAgICAgICAgICAgIGV4cGVjdGVkOiBjb25uZWN0aW9uLmVudmlyb25tZW50SWQsXG4gICAgICAgICAgICBhY3R1YWw6IGNvbmZpZy5lbnZpcm9ubWVudC5lbnZpcm9ubWVudElkLFxuICAgICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImVudmlyb25tZW50LmluaXRpYWxTeW5jXCIpLFxuICAgICk7XG4gICAgY29uc3Qgc2VydmVyQ29uZmlnRXZlbnRzID0gU3RyZWFtLnVud3JhcChcbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0geWllbGQqIFB1YlN1Yi5zdWJzY3JpYmUoc2VydmVyQ29uZmlnVXBkYXRlcyk7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0geWllbGQqIFJlZi5nZXQoc2VydmVyQ29uZmlnU3RhdGUpO1xuICAgICAgICBpZiAoT3B0aW9uLmlzTm9uZShzbmFwc2hvdCkpIHtcbiAgICAgICAgICByZXR1cm4gU3RyZWFtLmVtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBTdHJlYW0uZnJvbVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pLnBpcGUoXG4gICAgICAgICAgU3RyZWFtLmZpbHRlcigoYnVmZmVyZWQpID0+IGJ1ZmZlcmVkLnJldmlzaW9uID4gc25hcHNob3QudmFsdWUucmV2aXNpb24pLFxuICAgICAgICAgIFN0cmVhbS5tYXBBY2N1bShcbiAgICAgICAgICAgICgpID0+IHNuYXBzaG90LnZhbHVlLnJldmlzaW9uLFxuICAgICAgICAgICAgKHJldmlzaW9uLCBidWZmZXJlZCkgPT4gW1xuICAgICAgICAgICAgICBidWZmZXJlZC5yZXZpc2lvbixcbiAgICAgICAgICAgICAgYnVmZmVyZWQucmV2aXNpb24gPT09IHJldmlzaW9uICsgMVxuICAgICAgICAgICAgICAgID8gW2J1ZmZlcmVkLmV2ZW50XVxuICAgICAgICAgICAgICAgIDogc2VydmVyQ29uZmlnUmVwbGF5RXZlbnRzKGJ1ZmZlcmVkLnJlcGxheSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRlcm1pbmFsID0gU3RyZWFtLmZyb21FZmZlY3QoRGVmZXJyZWQuYXdhaXQoc2VydmVyQ29uZmlnRXhpdCkpLnBpcGUoU3RyZWFtLmRyYWluKTtcbiAgICAgICAgcmV0dXJuIFN0cmVhbS5jb25jYXQoXG4gICAgICAgICAgU3RyZWFtLmZyb21JdGVyYWJsZShzZXJ2ZXJDb25maWdSZXBsYXlFdmVudHMoc25hcHNob3QudmFsdWUpKSxcbiAgICAgICAgICBTdHJlYW0ubWVyZ2UodXBkYXRlcywgdGVybWluYWwsIHsgaGFsdFN0cmF0ZWd5OiBcImVpdGhlclwiIH0pLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgKS5waXBlKFxuICAgICAgU3RyZWFtLmNhdGNoQ2F1c2UoKGNhdXNlKSA9PiB7XG4gICAgICAgIGlmIChDYXVzZS5oYXNJbnRlcnJ1cHRzT25seShjYXVzZSkpIHtcbiAgICAgICAgICByZXR1cm4gU3RyZWFtLmZhaWxDYXVzZShjYXVzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHN1cGVydmlzb3Iga2VlcHMgdGhlIG9yaWdpbmFsIGNhdXNlLiBTaGFyZWQgZHVyYWJsZSBjb25zdW1lcnNcbiAgICAgICAgLy8gbmVlZCBhIHRyYW5zcG9ydC1zaGFwZWQgZmFpbHVyZSBzbyB0aGV5IHdhaXQgZm9yIGl0cyByZXBsYWNlbWVudC5cbiAgICAgICAgcmV0dXJuIFN0cmVhbS5mYWlsKFxuICAgICAgICAgIG5ldyBScGNDbGllbnRFcnJvci5ScGNDbGllbnRFcnJvcih7XG4gICAgICAgICAgICByZWFzb246IG5ldyBScGNDbGllbnRFcnJvci5ScGNDbGllbnREZWZlY3Qoe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgJHtjb25uZWN0aW9uLmxhYmVsfSBjb25maWcgc3Vic2NyaXB0aW9uIGZhaWxlZC5gLFxuICAgICAgICAgICAgICBjYXVzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCB2YWxpZGF0ZWRJbml0aWFsQ29uZmlnID0gaW5pdGlhbENvbmZpZy5waXBlKFxuICAgICAgRWZmZWN0Lm1hcEVycm9yKFxuICAgICAgICAoY2F1c2UpID0+XG4gICAgICAgICAgbmV3IFJwY0NsaWVudEVycm9yLlJwY0NsaWVudEVycm9yKHtcbiAgICAgICAgICAgIHJlYXNvbjogbmV3IFJwY0NsaWVudEVycm9yLlJwY0NsaWVudERlZmVjdCh7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Nvbm5lY3Rpb24ubGFiZWx9IGNvbmZpZyBzdWJzY3JpcHRpb24gZmFpbGVkLmAsXG4gICAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gICAgY29uc3Qgc3Vic2NyaWJlU2VydmVyQ29uZmlnID0gKGlucHV0OiBTZXJ2ZXJDb25maWdTdWJzY3JpcHRpb25JbnB1dCkgPT5cbiAgICAgIFN0cmVhbS51bndyYXAoXG4gICAgICAgIHZhbGlkYXRlZEluaXRpYWxDb25maWcucGlwZShcbiAgICAgICAgICBFZmZlY3QuYXMoXG4gICAgICAgICAgICBFcXVhbC5lcXVhbHMoaW5wdXQsIHNlcnZlckNvbmZpZ0lucHV0KVxuICAgICAgICAgICAgICA/IHNlcnZlckNvbmZpZ0V2ZW50c1xuICAgICAgICAgICAgICA6IHByb3RvY29sQ2xpZW50W1dTX01FVEhPRFMuc3Vic2NyaWJlU2VydmVyQ29uZmlnXShpbnB1dCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgY29uc3QgcHJvYmUgPSBpbml0aWFsQ29uZmlnLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgoY29uZmlnKSA9PlxuICAgICAgICAoY29uZmlnLmVudmlyb25tZW50LmNhcGFiaWxpdGllcy5jb25uZWN0aW9uUHJvYmUgPT09IHRydWVcbiAgICAgICAgICA/IHByb3RvY29sQ2xpZW50W1dTX01FVEhPRFMuc2VydmVyUHJvYmVdKHt9KVxuICAgICAgICAgIDogcHJvdG9jb2xDbGllbnRbV1NfTUVUSE9EUy5zZXJ2ZXJHZXRDb25maWddKHt9KVxuICAgICAgICApLnBpcGUoRWZmZWN0Lm1hcEVycm9yKG1hcFJwY0Vycm9yKSksXG4gICAgICApLFxuICAgICAgRWZmZWN0LmFzVm9pZCxcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImNsaWVudFJ1bnRpbWUuY29ubmVjdGlvbi5ycGNTZXNzaW9uLnByb2JlXCIpLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50OiBwcm90b2NvbENsaWVudCxcbiAgICAgIGluaXRpYWxDb25maWcsXG4gICAgICBzdWJzY3JpYmVTZXJ2ZXJDb25maWcsXG4gICAgICByZWFkeTogRGVmZXJyZWQuYXdhaXQoY29ubmVjdGVkKS5waXBlKFxuICAgICAgICBFZmZlY3QuYW5kVGhlbihpbml0aWFsQ29uZmlnKSxcbiAgICAgICAgRWZmZWN0LmFzVm9pZCxcbiAgICAgICAgRWZmZWN0LnJhY2VGaXJzdChEZWZlcnJlZC5hd2FpdChkaXNjb25uZWN0ZWQpKSxcbiAgICAgICksXG4gICAgICBwcm9iZSxcbiAgICAgIGNsb3NlZDogRWZmZWN0LnJhY2VGaXJzdChcbiAgICAgICAgRGVmZXJyZWQuYXdhaXQoZGlzY29ubmVjdGVkKSxcbiAgICAgICAgRGVmZXJyZWQuYXdhaXQoY29uZmlnU3Vic2NyaXB0aW9uQ2xvc2VkKSxcbiAgICAgICksXG4gICAgfSBzYXRpc2ZpZXMgUnBjU2Vzc2lvbjtcbiAgfSk7XG5cbiAgcmV0dXJuIFJwY1Nlc3Npb25GYWN0b3J5Lm9mKHsgY29ubmVjdCB9KTtcbn0pO1xuXG5leHBvcnQgY29uc3QgbGF5ZXIgPSAob3B0aW9uczogUnBjU2Vzc2lvbk9wdGlvbnMpID0+IExheWVyLmVmZmVjdChScGNTZXNzaW9uRmFjdG9yeSwgbWFrZShvcHRpb25zKSk7XG4iXSwiZmlsZSI6Ii9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3JwYy9zZXNzaW9uLnRzIn0=

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3JwYy9zZXNzaW9uLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvcnBjL3Nlc3Npb24udHMiLHsidXJscyI6IjYiLCJpZHMiOiI3In0sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIzMCIsIjMxIl0sW10sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIzMCIsIjMxIl0se30sIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9pbmRleC50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvQ2F1c2UuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0NvbnRleHQuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0RlZmVycmVkLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9EdXJhdGlvbi5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvRWZmZWN0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FcXVhbC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvRXhpdC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvTGF5ZXIuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L09wdGlvbi5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvUHViU3ViLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9SZWYuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NjaGVkdWxlLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9TY2hlbWEuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1N0cmVhbS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvcnBjL1JwY0NsaWVudC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvcnBjL1JwY0NsaWVudEVycm9yLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9ycGMvUnBjU2VyaWFsaXphdGlvbi5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3Qvc29ja2V0L1NvY2tldC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3JwYy9wcm90b2NvbC50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Vycm9ycy9uZXR3b3JrLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvY29ubmVjdGlvbi9tb2RlbC50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3N0YXRlL3NlcnZlckNvbmZpZ1Byb2plY3Rpb24udHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL2Vycm9ycy50cyJd