__vite_ssr_exportName__("RemoteEnvironmentAuthUndeclaredStatusError", () => { try { return __vite_ssr_import_8__.RemoteEnvironmentAuthUndeclaredStatusError } catch {} });
__vite_ssr_exportName__("readClientOwnerParams", () => { try { return readClientOwnerParams } catch {} });
__vite_ssr_exportName__("appendClientConnectionParams", () => { try { return appendClientConnectionParams } catch {} });
__vite_ssr_exportName__("exchangeRemoteDpopAccessToken", () => { try { return exchangeRemoteDpopAccessToken } catch {} });
__vite_ssr_exportName__("bootstrapRemoteBearerSession", () => { try { return bootstrapRemoteBearerSession } catch {} });
__vite_ssr_exportName__("fetchRemoteSessionState", () => { try { return fetchRemoteSessionState } catch {} });
__vite_ssr_exportName__("issueRemoteWebSocketTicket", () => { try { return issueRemoteWebSocketTicket } catch {} });
__vite_ssr_exportName__("issueRemoteDpopWebSocketTicket", () => { try { return issueRemoteDpopWebSocketTicket } catch {} });
__vite_ssr_exportName__("resolveRemoteWebSocketConnectionUrl", () => { try { return resolveRemoteWebSocketConnectionUrl } catch {} });
__vite_ssr_exportName__("resolveRemoteDpopWebSocketConnectionUrl", () => { try { return resolveRemoteDpopWebSocketConnectionUrl } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/index.ts", {"importedNames":["AuthAccessTokenType","AuthEnvironmentBootstrapTokenType","AuthTokenExchangeGrantType"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/oauthScope.ts", {"importedNames":["encodeOAuthScope"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/telemetryId.ts", {"importedNames":["hashTelemetryId"]});
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/Effect.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/Option.js");
const __vite_ssr_import_5__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/environment/endpoint.ts", {"importedNames":["environmentEndpointUrl"]});
const __vite_ssr_import_6__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/platform/capabilities.ts");
const __vite_ssr_import_7__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/rpc/http.ts", {"importedNames":["executeEnvironmentHttpRequest","makeEnvironmentHttpApiGroupClient","RemoteEnvironmentAuthUndeclaredStatusError"]});
const __vite_ssr_import_8__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/rpc/http.ts", {"importedNames":["RemoteEnvironmentAuthUndeclaredStatusError"]});









const DEFAULT_REMOTE_REQUEST_TIMEOUT_MS = 1e4;
const clientMetadataTokenExchangeFields = (clientMetadata) => {
	const displayOs = clientMetadata?.os;
	return {
		...clientMetadata?.label ? { client_label: clientMetadata.label } : {},
		...clientMetadata?.deviceType ? { client_device_type: clientMetadata.deviceType } : {},
		...displayOs && displayOs !== "unknown" && displayOs !== "other" ? { client_os: displayOs } : {}
	};
};
/**
* Tells the environment, for analytics, which T3 Connect account and device
* are connecting, so it can count the environment as theirs.
*/
const readClientOwnerParams = __vite_ssr_import_3__.gen(function* () {
	const session = yield* __vite_ssr_import_3__.serviceOption(__vite_ssr_import_6__.CloudSession);
	const account = __vite_ssr_import_4__.isSome(session) ? yield* session.value.identity : __vite_ssr_import_4__.none();
	const device = yield* (yield* __vite_ssr_import_6__.AnalyticsDevice).id;
	return {
		...__vite_ssr_import_4__.isSome(account) ? { connect: (0,__vite_ssr_import_2__.hashTelemetryId)(account.value.accountId) } : {},
		...__vite_ssr_import_4__.isSome(device) ? { device: (0,__vite_ssr_import_2__.hashTelemetryId)(device.value) } : {}
	};
});
const appendClientConnectionParams = (url, clientMetadata, connectionMethod, owners) => {
	if (clientMetadata?.surface) {
		url.searchParams.set("clientSurface", clientMetadata.surface);
	};
	if (clientMetadata?.appVersion) {
		url.searchParams.set("clientAppVersion", clientMetadata.appVersion);
	};
	if (clientMetadata?.deviceType) {
		const deviceType = clientMetadata.deviceType === "mobile" ? "phone" : clientMetadata.deviceType === "desktop" || clientMetadata.deviceType === "tablet" ? clientMetadata.deviceType : "unknown";
		url.searchParams.set("clientDeviceType", deviceType);
	};
	if (clientMetadata?.os) {
		url.searchParams.set("clientOs", clientMetadata.os);
	};
	if (clientMetadata?.surface === "web") {
		if (clientMetadata.webDeployment) {
			url.searchParams.set("clientWebDeployment", clientMetadata.webDeployment);
		};
		if (clientMetadata.browser) {
			url.searchParams.set("clientBrowser", clientMetadata.browser);
		}
	};
	if (clientMetadata?.surface === "mobile") {
		if (clientMetadata.osMajorVersion !== undefined) {
			url.searchParams.set("clientOsMajorVersion", String(clientMetadata.osMajorVersion));
		};
		if (clientMetadata.deviceModel) {
			url.searchParams.set("clientDeviceModel", clientMetadata.deviceModel);
		}
	};
	if (connectionMethod) {
		url.searchParams.set("connectionMethod", connectionMethod);
	};
	if (owners?.connect) {
		url.searchParams.set("clientOwner", owners.connect);
	};
	if (owners?.device) {
		url.searchParams.set("clientDevice", owners.device);
	}
};
const exchangeRemoteDpopAccessToken = __vite_ssr_import_3__.fn("clientRuntime.authorization.exchangeRemoteDpopAccessToken")(function* (input) {
	const client = yield* (0,__vite_ssr_import_7__.makeEnvironmentHttpApiGroupClient)(input.httpBaseUrl, "auth");
	const response = yield* (0,__vite_ssr_import_7__.executeEnvironmentHttpRequest)((0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, "/oauth/token"), input.timeoutMs ?? DEFAULT_REMOTE_REQUEST_TIMEOUT_MS, client.token({
		headers: { dpop: input.dpopProof },
		payload: {
			grant_type: __vite_ssr_import_0__.AuthTokenExchangeGrantType,
			subject_token: input.credential,
			subject_token_type: __vite_ssr_import_0__.AuthEnvironmentBootstrapTokenType,
			requested_token_type: __vite_ssr_import_0__.AuthAccessTokenType,
			...input.scopes ? { scope: (0,__vite_ssr_import_1__.encodeOAuthScope)(input.scopes) } : {},
			...clientMetadataTokenExchangeFields(input.clientMetadata)
		}
	}));
	return response;
});
const bootstrapRemoteBearerSession = __vite_ssr_import_3__.fn("clientRuntime.authorization.bootstrapRemoteBearerSession")(function* (input) {
	const client = yield* (0,__vite_ssr_import_7__.makeEnvironmentHttpApiGroupClient)(input.httpBaseUrl, "auth");
	return yield* (0,__vite_ssr_import_7__.executeEnvironmentHttpRequest)((0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, "/oauth/token"), input.timeoutMs ?? DEFAULT_REMOTE_REQUEST_TIMEOUT_MS, client.token({
		headers: {},
		payload: {
			grant_type: __vite_ssr_import_0__.AuthTokenExchangeGrantType,
			subject_token: input.credential,
			subject_token_type: __vite_ssr_import_0__.AuthEnvironmentBootstrapTokenType,
			requested_token_type: __vite_ssr_import_0__.AuthAccessTokenType,
			...input.scopes ? { scope: (0,__vite_ssr_import_1__.encodeOAuthScope)(input.scopes) } : {},
			...clientMetadataTokenExchangeFields(input.clientMetadata)
		}
	}));
});
const fetchRemoteSessionState = __vite_ssr_import_3__.fn("clientRuntime.authorization.fetchRemoteSessionState")(function* (input) {
	const client = yield* (0,__vite_ssr_import_7__.makeEnvironmentHttpApiGroupClient)(input.httpBaseUrl, "auth");
	return yield* (0,__vite_ssr_import_7__.executeEnvironmentHttpRequest)((0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, "/api/auth/session"), input.timeoutMs ?? DEFAULT_REMOTE_REQUEST_TIMEOUT_MS, client.session({ headers: { authorization: `Bearer ${input.bearerToken}` } }));
});
const webSocketTicketPath = (use) => use === undefined ? "/api/auth/websocket-ticket" : `/api/auth/websocket-ticket/${use}`;
/**
* A server that predates ticket audiences has no `/:use` route and answers 404.
* Its tickets are the unbound kind it always issued, so the bare path is the
* right request there, not an error.
*/
const issueWebSocketTicketWithFallback = (use, issue, canFallBack = true) => use === undefined || !canFallBack ? issue(use) : issue(use).pipe(__vite_ssr_import_3__.catchIf((error) => error instanceof __vite_ssr_import_7__.RemoteEnvironmentAuthUndeclaredStatusError && error.status === 404, () => issue(undefined)));
const issueRemoteWebSocketTicket = __vite_ssr_import_3__.fn("clientRuntime.authorization.issueRemoteWebSocketTicket")(function* (input) {
	const client = yield* (0,__vite_ssr_import_7__.makeEnvironmentHttpApiGroupClient)(input.httpBaseUrl, "auth");
	const headers = { authorization: `Bearer ${input.bearerToken}` };
	return yield* issueWebSocketTicketWithFallback(input.use, (use) => (0,__vite_ssr_import_7__.executeEnvironmentHttpRequest)((0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, webSocketTicketPath(use)), input.timeoutMs ?? DEFAULT_REMOTE_REQUEST_TIMEOUT_MS, use === undefined ? client.webSocketTicket({ headers }) : client.webSocketTicketFor({
		headers,
		params: { use }
	})));
});
const issueRemoteDpopWebSocketTicket = __vite_ssr_import_3__.fn("clientRuntime.authorization.issueRemoteDpopWebSocketTicket")(function* (input) {
	const client = yield* (0,__vite_ssr_import_7__.makeEnvironmentHttpApiGroupClient)(input.httpBaseUrl, "auth");
	const fallbackProof = input.fallbackProof;
	return yield* issueWebSocketTicketWithFallback(input.use, (use) => __vite_ssr_import_3__.gen(function* () {
		// The proof names the path it signs, so the fallback request needs its own.
		const dpopProof = use === input.use || fallbackProof === undefined ? input.dpopProof : yield* fallbackProof;
		const headers = {
			authorization: `DPoP ${input.accessToken}`,
			dpop: dpopProof
		};
		return yield* (0,__vite_ssr_import_7__.executeEnvironmentHttpRequest)((0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, webSocketTicketPath(use)), input.timeoutMs ?? DEFAULT_REMOTE_REQUEST_TIMEOUT_MS, use === undefined ? client.webSocketTicket({ headers }) : client.webSocketTicketFor({
			headers,
			params: { use }
		}));
	}), fallbackProof !== undefined);
});
function rpcSocketUrl(wsBaseUrl) {
	const url = new URL(wsBaseUrl);
	if (url.pathname === "" || url.pathname === "/") {
		url.pathname = "/ws";
	};
	return url;
}
const resolveRemoteWebSocketConnectionUrl = __vite_ssr_import_3__.fn("clientRuntime.authorization.resolveRemoteWebSocketConnectionUrl")(function* (input) {
	const issued = yield* issueRemoteWebSocketTicket({
		httpBaseUrl: input.httpBaseUrl,
		bearerToken: input.bearerToken,
		use: "rpc",
		...input.timeoutMs ? { timeoutMs: input.timeoutMs } : {}
	});
	const url = rpcSocketUrl(input.wsBaseUrl);
	url.searchParams.set("wsTicket", issued.ticket);
	appendClientConnectionParams(url, input.clientMetadata, input.connectionMethod, yield* readClientOwnerParams);
	return url.toString();
});
/**
* A DPoP client's RPC ticket is bound to its key, so the upgrade carries a
* proof too. A WebSocket cannot set headers, so it rides in the `dpop` query
* parameter and names the socket URL as the HTTP request the server sees.
*/
const resolveRemoteDpopWebSocketConnectionUrl = __vite_ssr_import_3__.fn("clientRuntime.authorization.resolveRemoteDpopWebSocketConnectionUrl")(function* (input) {
	const ticketProof = yield* input.createProof({
		method: "POST",
		url: (0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, webSocketTicketPath("rpc")),
		accessToken: input.accessToken
	});
	const issued = yield* issueRemoteDpopWebSocketTicket({
		httpBaseUrl: input.httpBaseUrl,
		accessToken: input.accessToken,
		dpopProof: ticketProof,
		use: "rpc",
		fallbackProof: __vite_ssr_import_3__.suspend(() => input.createProof({
			method: "POST",
			url: (0,__vite_ssr_import_5__.environmentEndpointUrl)(input.httpBaseUrl, webSocketTicketPath(undefined)),
			accessToken: input.accessToken
		})),
		...input.timeoutMs ? { timeoutMs: input.timeoutMs } : {}
	});
	const url = rpcSocketUrl(input.wsBaseUrl);
	const upgradeProof = yield* input.createProof({
		method: "GET",
		url: `${url.protocol === "wss:" ? "https:" : "http:"}//${url.host}${url.pathname}`,
		accessToken: issued.ticket
	});
	url.searchParams.set("wsTicket", issued.ticket);
	url.searchParams.set("dpop", upgradeProof);
	appendClientConnectionParams(url, input.clientMetadata, input.connectionMethod, yield* readClientOwnerParams);
	return url.toString();
});
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQTs7Ozs7Ozs7OztBQUFBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTs7Ozs7Ozs7OztBQUdBLE1BQU0sb0NBQW9DO0FBRTFDLE1BQU0scUNBQ0osbUJBQ0c7Q0FDSCxNQUFNLFlBQVksZ0JBQWdCO0NBQ2xDLE9BQU87RUFDTCxHQUFJLGdCQUFnQixRQUFRLEVBQUUsY0FBYyxlQUFlLE1BQU0sSUFBSSxDQUFDO0VBQ3RFLEdBQUksZ0JBQWdCLGFBQWEsRUFBRSxvQkFBb0IsZUFBZSxXQUFXLElBQUksQ0FBQztFQUN0RixHQUFJLGFBQWEsY0FBYyxhQUFhLGNBQWMsVUFDdEQsRUFBRSxXQUFXLFVBQVUsSUFDdkIsQ0FBQztDQUNQO0FBQ0Y7Ozs7O0FBWU8sTUFBTSx3QkFBd0Isc0JBQU8sSUFBSSxhQUFhO0NBQzNELE1BQU0sVUFBVSxPQUFPLHNCQUFPLGNBQWMsc0JBQW1CLFlBQVk7Q0FDM0UsTUFBTSxVQUFVLHNCQUFPLE9BQU8sT0FBTyxJQUFJLE9BQU8sUUFBUSxNQUFNLFdBQVcsc0JBQU8sS0FBSztDQUNyRixNQUFNLFNBQVMsUUFBUSxPQUFPLHNCQUFtQixnQkFBZSxDQUFFO0NBQ2xFLE9BQU87RUFDTCxHQUFJLHNCQUFPLE9BQU8sT0FBTyxJQUFJLEVBQUUsU0FBUywwQ0FBZ0IsUUFBUSxNQUFNLFNBQVMsRUFBRSxJQUFJLENBQUM7RUFDdEYsR0FBSSxzQkFBTyxPQUFPLE1BQU0sSUFBSSxFQUFFLFFBQVEsMENBQWdCLE9BQU8sS0FBSyxFQUFFLElBQUksQ0FBQztDQUMzRTtBQUNGLENBQUM7QUFFTSxNQUFNLGdDQUNYLEtBQ0EsZ0JBQ0Esa0JBQ0EsV0FDUztDQUNULElBQUksZ0JBQWdCLFNBQVM7RUFDM0IsSUFBSSxhQUFhLElBQUksaUJBQWlCLGVBQWUsT0FBTztDQUM5RDtDQUNBLElBQUksZ0JBQWdCLFlBQVk7RUFDOUIsSUFBSSxhQUFhLElBQUksb0JBQW9CLGVBQWUsVUFBVTtDQUNwRTtDQUNBLElBQUksZ0JBQWdCLFlBQVk7RUFDOUIsTUFBTSxhQUNKLGVBQWUsZUFBZSxXQUMxQixVQUNBLGVBQWUsZUFBZSxhQUFhLGVBQWUsZUFBZSxXQUN2RSxlQUFlLGFBQ2Y7RUFDUixJQUFJLGFBQWEsSUFBSSxvQkFBb0IsVUFBVTtDQUNyRDtDQUNBLElBQUksZ0JBQWdCLElBQUk7RUFDdEIsSUFBSSxhQUFhLElBQUksWUFBWSxlQUFlLEVBQUU7Q0FDcEQ7Q0FDQSxJQUFJLGdCQUFnQixZQUFZLE9BQU87RUFDckMsSUFBSSxlQUFlLGVBQWU7R0FDaEMsSUFBSSxhQUFhLElBQUksdUJBQXVCLGVBQWUsYUFBYTtFQUMxRTtFQUNBLElBQUksZUFBZSxTQUFTO0dBQzFCLElBQUksYUFBYSxJQUFJLGlCQUFpQixlQUFlLE9BQU87RUFDOUQ7Q0FDRjtDQUNBLElBQUksZ0JBQWdCLFlBQVksVUFBVTtFQUN4QyxJQUFJLGVBQWUsbUJBQW1CLFdBQVc7R0FDL0MsSUFBSSxhQUFhLElBQUksd0JBQXdCLE9BQU8sZUFBZSxjQUFjLENBQUM7RUFDcEY7RUFDQSxJQUFJLGVBQWUsYUFBYTtHQUM5QixJQUFJLGFBQWEsSUFBSSxxQkFBcUIsZUFBZSxXQUFXO0VBQ3RFO0NBQ0Y7Q0FDQSxJQUFJLGtCQUFrQjtFQUNwQixJQUFJLGFBQWEsSUFBSSxvQkFBb0IsZ0JBQWdCO0NBQzNEO0NBQ0EsSUFBSSxRQUFRLFNBQVM7RUFDbkIsSUFBSSxhQUFhLElBQUksZUFBZSxPQUFPLE9BQU87Q0FDcEQ7Q0FDQSxJQUFJLFFBQVEsUUFBUTtFQUNsQixJQUFJLGFBQWEsSUFBSSxnQkFBZ0IsT0FBTyxNQUFNO0NBQ3BEO0FBQ0Y7QUFFTyxNQUFNLGdDQUFnQyxzQkFBTyxHQUNsRCwyREFDRixDQUFDLENBQUMsV0FBVyxPQU9WO0NBQ0QsTUFBTSxTQUFTLE9BQU8sNERBQWtDLE1BQU0sYUFBYSxNQUFNO0NBQ2pGLE1BQU0sV0FBVyxPQUFPLHdEQUN0QixpREFBdUIsTUFBTSxhQUFhLGNBQWMsR0FDeEQsTUFBTSxhQUFhLG1DQUNuQixPQUFPLE1BQU07RUFDWCxTQUFTLEVBQUUsTUFBTSxNQUFNLFVBQVU7RUFDakMsU0FBUztHQUNQLFlBQVk7R0FDWixlQUFlLE1BQU07R0FDckIsb0JBQW9CO0dBQ3BCLHNCQUFzQjtHQUN0QixHQUFJLE1BQU0sU0FBUyxFQUFFLE9BQU8sMkNBQWlCLE1BQU0sTUFBTSxFQUFFLElBQUksQ0FBQztHQUNoRSxHQUFHLGtDQUFrQyxNQUFNLGNBQWM7RUFDM0Q7Q0FDRixDQUFDLENBQ0g7Q0FDQSxPQUFPO0FBQ1QsQ0FBQztBQUVNLE1BQU0sK0JBQStCLHNCQUFPLEdBQ2pELDBEQUNGLENBQUMsQ0FBQyxXQUFXLE9BTVY7Q0FDRCxNQUFNLFNBQVMsT0FBTyw0REFBa0MsTUFBTSxhQUFhLE1BQU07Q0FDakYsT0FBTyxPQUFPLHdEQUNaLGlEQUF1QixNQUFNLGFBQWEsY0FBYyxHQUN4RCxNQUFNLGFBQWEsbUNBQ25CLE9BQU8sTUFBTTtFQUNYLFNBQVMsQ0FBQztFQUNWLFNBQVM7R0FDUCxZQUFZO0dBQ1osZUFBZSxNQUFNO0dBQ3JCLG9CQUFvQjtHQUNwQixzQkFBc0I7R0FDdEIsR0FBSSxNQUFNLFNBQVMsRUFBRSxPQUFPLDJDQUFpQixNQUFNLE1BQU0sRUFBRSxJQUFJLENBQUM7R0FDaEUsR0FBRyxrQ0FBa0MsTUFBTSxjQUFjO0VBQzNEO0NBQ0YsQ0FBQyxDQUNIO0FBQ0YsQ0FBQztBQUVNLE1BQU0sMEJBQTBCLHNCQUFPLEdBQzVDLHFEQUNGLENBQUMsQ0FBQyxXQUFXLE9BSVY7Q0FDRCxNQUFNLFNBQVMsT0FBTyw0REFBa0MsTUFBTSxhQUFhLE1BQU07Q0FDakYsT0FBTyxPQUFPLHdEQUNaLGlEQUF1QixNQUFNLGFBQWEsbUJBQW1CLEdBQzdELE1BQU0sYUFBYSxtQ0FDbkIsT0FBTyxRQUFRLEVBQ2IsU0FBUyxFQUNQLGVBQWUsVUFBVSxNQUFNLGNBQ2pDLEVBQ0YsQ0FBQyxDQUNIO0FBQ0YsQ0FBQztBQUVELE1BQU0sdUJBQXVCLFFBQzNCLFFBQVEsWUFBWSwrQkFBK0IsOEJBQThCOzs7Ozs7QUFPbkYsTUFBTSxvQ0FDSixLQUNBLE9BR0EsY0FBYyxTQUVkLFFBQVEsYUFBYSxDQUFDLGNBQ2xCLE1BQU0sR0FBRyxJQUNULE1BQU0sR0FBRyxDQUFDLENBQUMsS0FDVCxzQkFBTyxTQUNKLFVBQ0MsaUJBQWlCLG9FQUE4QyxNQUFNLFdBQVcsV0FDNUUsTUFBTSxTQUFTLENBQ3ZCLENBQ0Y7QUFFQyxNQUFNLDZCQUE2QixzQkFBTyxHQUMvQyx3REFDRixDQUFDLENBQUMsV0FBVyxPQUtWO0NBQ0QsTUFBTSxTQUFTLE9BQU8sNERBQWtDLE1BQU0sYUFBYSxNQUFNO0NBQ2pGLE1BQU0sVUFBVSxFQUFFLGVBQWUsVUFBVSxNQUFNLGNBQWM7Q0FDL0QsT0FBTyxPQUFPLGlDQUFpQyxNQUFNLE1BQU0sUUFDekQsd0RBQ0UsaURBQXVCLE1BQU0sYUFBYSxvQkFBb0IsR0FBRyxDQUFDLEdBQ2xFLE1BQU0sYUFBYSxtQ0FDbkIsUUFBUSxZQUNKLE9BQU8sZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLElBQ2xDLE9BQU8sbUJBQW1CO0VBQUU7RUFBUyxRQUFRLEVBQUUsSUFBSTtDQUFFLENBQUMsQ0FDNUQsQ0FDRjtBQUNGLENBQUM7QUFFTSxNQUFNLGlDQUFpQyxzQkFBTyxHQUNuRCw0REFDRixDQUFDLENBQUMsV0FBc0IsT0FRckI7Q0FDRCxNQUFNLFNBQVMsT0FBTyw0REFBa0MsTUFBTSxhQUFhLE1BQU07Q0FDakYsTUFBTSxnQkFBZ0IsTUFBTTtDQUM1QixPQUFPLE9BQU8saUNBQ1osTUFBTSxNQUNMLFFBQ0Msc0JBQU8sSUFBSSxhQUFhOztFQUV0QixNQUFNLFlBQ0osUUFBUSxNQUFNLE9BQU8sa0JBQWtCLFlBQVksTUFBTSxZQUFZLE9BQU87RUFDOUUsTUFBTSxVQUFVO0dBQUUsZUFBZSxRQUFRLE1BQU07R0FBZSxNQUFNO0VBQVU7RUFDOUUsT0FBTyxPQUFPLHdEQUNaLGlEQUF1QixNQUFNLGFBQWEsb0JBQW9CLEdBQUcsQ0FBQyxHQUNsRSxNQUFNLGFBQWEsbUNBQ25CLFFBQVEsWUFDSixPQUFPLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxJQUNsQyxPQUFPLG1CQUFtQjtHQUFFO0dBQVMsUUFBUSxFQUFFLElBQUk7RUFBRSxDQUFDLENBQzVEO0NBQ0YsQ0FBQyxHQUNILGtCQUFrQixTQUNwQjtBQUNGLENBQUM7QUFFRCxTQUFTLGFBQWEsV0FBd0I7Q0FDNUMsTUFBTSxNQUFNLElBQUksSUFBSSxTQUFTO0NBQzdCLElBQUksSUFBSSxhQUFhLE1BQU0sSUFBSSxhQUFhLEtBQUs7RUFDL0MsSUFBSSxXQUFXO0NBQ2pCO0NBQ0EsT0FBTztBQUNUO0FBRU8sTUFBTSxzQ0FBc0Msc0JBQU8sR0FDeEQsaUVBQ0YsQ0FBQyxDQUFDLFdBQVcsT0FPVjtDQUNELE1BQU0sU0FBUyxPQUFPLDJCQUEyQjtFQUMvQyxhQUFhLE1BQU07RUFDbkIsYUFBYSxNQUFNO0VBQ25CLEtBQUs7RUFDTCxHQUFJLE1BQU0sWUFBWSxFQUFFLFdBQVcsTUFBTSxVQUFVLElBQUksQ0FBQztDQUMxRCxDQUFDO0NBRUQsTUFBTSxNQUFNLGFBQWEsTUFBTSxTQUFTO0NBQ3hDLElBQUksYUFBYSxJQUFJLFlBQVksT0FBTyxNQUFNO0NBQzlDLDZCQUNFLEtBQ0EsTUFBTSxnQkFDTixNQUFNLGtCQUNOLE9BQU8scUJBQ1Q7Q0FDQSxPQUFPLElBQUksU0FBUztBQUN0QixDQUFDOzs7Ozs7QUFPTSxNQUFNLDBDQUEwQyxzQkFBTyxHQUM1RCxxRUFDRixDQUFDLENBQUMsV0FBYyxPQVliO0NBQ0QsTUFBTSxjQUFjLE9BQU8sTUFBTSxZQUFZO0VBQzNDLFFBQVE7RUFDUixLQUFLLGlEQUF1QixNQUFNLGFBQWEsb0JBQW9CLEtBQUssQ0FBQztFQUN6RSxhQUFhLE1BQU07Q0FDckIsQ0FBQztDQUNELE1BQU0sU0FBUyxPQUFPLCtCQUErQjtFQUNuRCxhQUFhLE1BQU07RUFDbkIsYUFBYSxNQUFNO0VBQ25CLFdBQVc7RUFDWCxLQUFLO0VBQ0wsZUFBZSxzQkFBTyxjQUNwQixNQUFNLFlBQVk7R0FDaEIsUUFBUTtHQUNSLEtBQUssaURBQXVCLE1BQU0sYUFBYSxvQkFBb0IsU0FBUyxDQUFDO0dBQzdFLGFBQWEsTUFBTTtFQUNyQixDQUFDLENBQ0g7RUFDQSxHQUFJLE1BQU0sWUFBWSxFQUFFLFdBQVcsTUFBTSxVQUFVLElBQUksQ0FBQztDQUMxRCxDQUFDO0NBQ0QsTUFBTSxNQUFNLGFBQWEsTUFBTSxTQUFTO0NBQ3hDLE1BQU0sZUFBZSxPQUFPLE1BQU0sWUFBWTtFQUM1QyxRQUFRO0VBQ1IsS0FBSyxHQUFHLElBQUksYUFBYSxTQUFTLFdBQVcsUUFBUSxJQUFJLElBQUksT0FBTyxJQUFJO0VBQ3hFLGFBQWEsT0FBTztDQUN0QixDQUFDO0NBQ0QsSUFBSSxhQUFhLElBQUksWUFBWSxPQUFPLE1BQU07Q0FDOUMsSUFBSSxhQUFhLElBQUksUUFBUSxZQUFZO0NBQ3pDLDZCQUNFLEtBQ0EsTUFBTSxnQkFDTixNQUFNLGtCQUNOLE9BQU8scUJBQ1Q7Q0FDQSxPQUFPLElBQUksU0FBUztBQUN0QixDQUFDIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJyZW1vdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0aEFjY2Vzc1Rva2VuVHlwZSxcbiAgdHlwZSBBdXRoQ2xpZW50UHJlc2VudGF0aW9uTWV0YWRhdGEsXG4gIEF1dGhFbnZpcm9ubWVudEJvb3RzdHJhcFRva2VuVHlwZSxcbiAgQXV0aFRva2VuRXhjaGFuZ2VHcmFudFR5cGUsXG4gIHR5cGUgQ2xpZW50Q29ubmVjdGlvbk1ldGhvZCxcbiAgdHlwZSBBdXRoRW52aXJvbm1lbnRTY29wZSxcbiAgdHlwZSBBdXRoV2ViU29ja2V0VGlja2V0UmVzdWx0LFxuICB0eXBlIEF1dGhXZWJTb2NrZXRUaWNrZXRVc2UsXG59IGZyb20gXCJAdDN0b29scy9jb250cmFjdHNcIjtcbmltcG9ydCB7IGVuY29kZU9BdXRoU2NvcGUgfSBmcm9tIFwiQHQzdG9vbHMvc2hhcmVkL29hdXRoU2NvcGVcIjtcbmltcG9ydCB7IGhhc2hUZWxlbWV0cnlJZCB9IGZyb20gXCJAdDN0b29scy9zaGFyZWQvdGVsZW1ldHJ5SWRcIjtcbmltcG9ydCAqIGFzIEVmZmVjdCBmcm9tIFwiZWZmZWN0L0VmZmVjdFwiO1xuaW1wb3J0ICogYXMgT3B0aW9uIGZyb20gXCJlZmZlY3QvT3B0aW9uXCI7XG5pbXBvcnQgeyBlbnZpcm9ubWVudEVuZHBvaW50VXJsIH0gZnJvbSBcIi4uL2Vudmlyb25tZW50L2VuZHBvaW50LnRzXCI7XG5pbXBvcnQgKiBhcyBDbGllbnRDYXBhYmlsaXRpZXMgZnJvbSBcIi4uL3BsYXRmb3JtL2NhcGFiaWxpdGllcy50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZUVudmlyb25tZW50SHR0cFJlcXVlc3QsXG4gIG1ha2VFbnZpcm9ubWVudEh0dHBBcGlHcm91cENsaWVudCxcbiAgUmVtb3RlRW52aXJvbm1lbnRBdXRoVW5kZWNsYXJlZFN0YXR1c0Vycm9yLFxuICB0eXBlIFJlbW90ZUVudmlyb25tZW50UmVxdWVzdEVycm9yLFxufSBmcm9tIFwiLi4vcnBjL2h0dHAudHNcIjtcblxuZXhwb3J0IHsgUmVtb3RlRW52aXJvbm1lbnRBdXRoVW5kZWNsYXJlZFN0YXR1c0Vycm9yIH0gZnJvbSBcIi4uL3JwYy9odHRwLnRzXCI7XG5leHBvcnQgdHlwZSBSZW1vdGVFbnZpcm9ubWVudEF1dGhFcnJvciA9IFJlbW90ZUVudmlyb25tZW50UmVxdWVzdEVycm9yO1xuXG5jb25zdCBERUZBVUxUX1JFTU9URV9SRVFVRVNUX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5cbmNvbnN0IGNsaWVudE1ldGFkYXRhVG9rZW5FeGNoYW5nZUZpZWxkcyA9IChcbiAgY2xpZW50TWV0YWRhdGE6IEF1dGhDbGllbnRQcmVzZW50YXRpb25NZXRhZGF0YSB8IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBkaXNwbGF5T3MgPSBjbGllbnRNZXRhZGF0YT8ub3M7XG4gIHJldHVybiB7XG4gICAgLi4uKGNsaWVudE1ldGFkYXRhPy5sYWJlbCA/IHsgY2xpZW50X2xhYmVsOiBjbGllbnRNZXRhZGF0YS5sYWJlbCB9IDoge30pLFxuICAgIC4uLihjbGllbnRNZXRhZGF0YT8uZGV2aWNlVHlwZSA/IHsgY2xpZW50X2RldmljZV90eXBlOiBjbGllbnRNZXRhZGF0YS5kZXZpY2VUeXBlIH0gOiB7fSksXG4gICAgLi4uKGRpc3BsYXlPcyAmJiBkaXNwbGF5T3MgIT09IFwidW5rbm93blwiICYmIGRpc3BsYXlPcyAhPT0gXCJvdGhlclwiXG4gICAgICA/IHsgY2xpZW50X29zOiBkaXNwbGF5T3MgfVxuICAgICAgOiB7fSksXG4gIH07XG59O1xuXG4vKiogSGFzaGVzIG9mIHdobyBpcyBjb25uZWN0aW5nLiBPbmx5IGhhc2hlcyBsZWF2ZSB0aGUgY2xpZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPd25lclBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbm5lY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRldmljZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUZWxscyB0aGUgZW52aXJvbm1lbnQsIGZvciBhbmFseXRpY3MsIHdoaWNoIFQzIENvbm5lY3QgYWNjb3VudCBhbmQgZGV2aWNlXG4gKiBhcmUgY29ubmVjdGluZywgc28gaXQgY2FuIGNvdW50IHRoZSBlbnZpcm9ubWVudCBhcyB0aGVpcnMuXG4gKi9cbmV4cG9ydCBjb25zdCByZWFkQ2xpZW50T3duZXJQYXJhbXMgPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gIGNvbnN0IHNlc3Npb24gPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24oQ2xpZW50Q2FwYWJpbGl0aWVzLkNsb3VkU2Vzc2lvbik7XG4gIGNvbnN0IGFjY291bnQgPSBPcHRpb24uaXNTb21lKHNlc3Npb24pID8geWllbGQqIHNlc3Npb24udmFsdWUuaWRlbnRpdHkgOiBPcHRpb24ubm9uZSgpO1xuICBjb25zdCBkZXZpY2UgPSB5aWVsZCogKHlpZWxkKiBDbGllbnRDYXBhYmlsaXRpZXMuQW5hbHl0aWNzRGV2aWNlKS5pZDtcbiAgcmV0dXJuIHtcbiAgICAuLi4oT3B0aW9uLmlzU29tZShhY2NvdW50KSA/IHsgY29ubmVjdDogaGFzaFRlbGVtZXRyeUlkKGFjY291bnQudmFsdWUuYWNjb3VudElkKSB9IDoge30pLFxuICAgIC4uLihPcHRpb24uaXNTb21lKGRldmljZSkgPyB7IGRldmljZTogaGFzaFRlbGVtZXRyeUlkKGRldmljZS52YWx1ZSkgfSA6IHt9KSxcbiAgfSBzYXRpc2ZpZXMgQ2xpZW50T3duZXJQYXJhbXM7XG59KTtcblxuZXhwb3J0IGNvbnN0IGFwcGVuZENsaWVudENvbm5lY3Rpb25QYXJhbXMgPSAoXG4gIHVybDogVVJMLFxuICBjbGllbnRNZXRhZGF0YTogQXV0aENsaWVudFByZXNlbnRhdGlvbk1ldGFkYXRhIHwgdW5kZWZpbmVkLFxuICBjb25uZWN0aW9uTWV0aG9kPzogQ2xpZW50Q29ubmVjdGlvbk1ldGhvZCxcbiAgb3duZXJzPzogQ2xpZW50T3duZXJQYXJhbXMsXG4pOiB2b2lkID0+IHtcbiAgaWYgKGNsaWVudE1ldGFkYXRhPy5zdXJmYWNlKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjbGllbnRTdXJmYWNlXCIsIGNsaWVudE1ldGFkYXRhLnN1cmZhY2UpO1xuICB9XG4gIGlmIChjbGllbnRNZXRhZGF0YT8uYXBwVmVyc2lvbikge1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50QXBwVmVyc2lvblwiLCBjbGllbnRNZXRhZGF0YS5hcHBWZXJzaW9uKTtcbiAgfVxuICBpZiAoY2xpZW50TWV0YWRhdGE/LmRldmljZVR5cGUpIHtcbiAgICBjb25zdCBkZXZpY2VUeXBlID1cbiAgICAgIGNsaWVudE1ldGFkYXRhLmRldmljZVR5cGUgPT09IFwibW9iaWxlXCJcbiAgICAgICAgPyBcInBob25lXCJcbiAgICAgICAgOiBjbGllbnRNZXRhZGF0YS5kZXZpY2VUeXBlID09PSBcImRlc2t0b3BcIiB8fCBjbGllbnRNZXRhZGF0YS5kZXZpY2VUeXBlID09PSBcInRhYmxldFwiXG4gICAgICAgICAgPyBjbGllbnRNZXRhZGF0YS5kZXZpY2VUeXBlXG4gICAgICAgICAgOiBcInVua25vd25cIjtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImNsaWVudERldmljZVR5cGVcIiwgZGV2aWNlVHlwZSk7XG4gIH1cbiAgaWYgKGNsaWVudE1ldGFkYXRhPy5vcykge1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50T3NcIiwgY2xpZW50TWV0YWRhdGEub3MpO1xuICB9XG4gIGlmIChjbGllbnRNZXRhZGF0YT8uc3VyZmFjZSA9PT0gXCJ3ZWJcIikge1xuICAgIGlmIChjbGllbnRNZXRhZGF0YS53ZWJEZXBsb3ltZW50KSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImNsaWVudFdlYkRlcGxveW1lbnRcIiwgY2xpZW50TWV0YWRhdGEud2ViRGVwbG95bWVudCk7XG4gICAgfVxuICAgIGlmIChjbGllbnRNZXRhZGF0YS5icm93c2VyKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImNsaWVudEJyb3dzZXJcIiwgY2xpZW50TWV0YWRhdGEuYnJvd3Nlcik7XG4gICAgfVxuICB9XG4gIGlmIChjbGllbnRNZXRhZGF0YT8uc3VyZmFjZSA9PT0gXCJtb2JpbGVcIikge1xuICAgIGlmIChjbGllbnRNZXRhZGF0YS5vc01ham9yVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImNsaWVudE9zTWFqb3JWZXJzaW9uXCIsIFN0cmluZyhjbGllbnRNZXRhZGF0YS5vc01ham9yVmVyc2lvbikpO1xuICAgIH1cbiAgICBpZiAoY2xpZW50TWV0YWRhdGEuZGV2aWNlTW9kZWwpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50RGV2aWNlTW9kZWxcIiwgY2xpZW50TWV0YWRhdGEuZGV2aWNlTW9kZWwpO1xuICAgIH1cbiAgfVxuICBpZiAoY29ubmVjdGlvbk1ldGhvZCkge1xuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY29ubmVjdGlvbk1ldGhvZFwiLCBjb25uZWN0aW9uTWV0aG9kKTtcbiAgfVxuICBpZiAob3duZXJzPy5jb25uZWN0KSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjbGllbnRPd25lclwiLCBvd25lcnMuY29ubmVjdCk7XG4gIH1cbiAgaWYgKG93bmVycz8uZGV2aWNlKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjbGllbnREZXZpY2VcIiwgb3duZXJzLmRldmljZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBleGNoYW5nZVJlbW90ZURwb3BBY2Nlc3NUb2tlbiA9IEVmZmVjdC5mbihcbiAgXCJjbGllbnRSdW50aW1lLmF1dGhvcml6YXRpb24uZXhjaGFuZ2VSZW1vdGVEcG9wQWNjZXNzVG9rZW5cIixcbikoZnVuY3Rpb24qIChpbnB1dDoge1xuICByZWFkb25seSBodHRwQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBjcmVkZW50aWFsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjb3Blcz86IFJlYWRvbmx5QXJyYXk8QXV0aEVudmlyb25tZW50U2NvcGU+O1xuICByZWFkb25seSBjbGllbnRNZXRhZGF0YT86IEF1dGhDbGllbnRQcmVzZW50YXRpb25NZXRhZGF0YTtcbiAgcmVhZG9ubHkgZHBvcFByb29mOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbn0pIHtcbiAgY29uc3QgY2xpZW50ID0geWllbGQqIG1ha2VFbnZpcm9ubWVudEh0dHBBcGlHcm91cENsaWVudChpbnB1dC5odHRwQmFzZVVybCwgXCJhdXRoXCIpO1xuICBjb25zdCByZXNwb25zZSA9IHlpZWxkKiBleGVjdXRlRW52aXJvbm1lbnRIdHRwUmVxdWVzdChcbiAgICBlbnZpcm9ubWVudEVuZHBvaW50VXJsKGlucHV0Lmh0dHBCYXNlVXJsLCBcIi9vYXV0aC90b2tlblwiKSxcbiAgICBpbnB1dC50aW1lb3V0TXMgPz8gREVGQVVMVF9SRU1PVEVfUkVRVUVTVF9USU1FT1VUX01TLFxuICAgIGNsaWVudC50b2tlbih7XG4gICAgICBoZWFkZXJzOiB7IGRwb3A6IGlucHV0LmRwb3BQcm9vZiB9LFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBncmFudF90eXBlOiBBdXRoVG9rZW5FeGNoYW5nZUdyYW50VHlwZSxcbiAgICAgICAgc3ViamVjdF90b2tlbjogaW5wdXQuY3JlZGVudGlhbCxcbiAgICAgICAgc3ViamVjdF90b2tlbl90eXBlOiBBdXRoRW52aXJvbm1lbnRCb290c3RyYXBUb2tlblR5cGUsXG4gICAgICAgIHJlcXVlc3RlZF90b2tlbl90eXBlOiBBdXRoQWNjZXNzVG9rZW5UeXBlLFxuICAgICAgICAuLi4oaW5wdXQuc2NvcGVzID8geyBzY29wZTogZW5jb2RlT0F1dGhTY29wZShpbnB1dC5zY29wZXMpIH0gOiB7fSksXG4gICAgICAgIC4uLmNsaWVudE1ldGFkYXRhVG9rZW5FeGNoYW5nZUZpZWxkcyhpbnB1dC5jbGllbnRNZXRhZGF0YSksXG4gICAgICB9LFxuICAgIH0pLFxuICApO1xuICByZXR1cm4gcmVzcG9uc2U7XG59KTtcblxuZXhwb3J0IGNvbnN0IGJvb3RzdHJhcFJlbW90ZUJlYXJlclNlc3Npb24gPSBFZmZlY3QuZm4oXG4gIFwiY2xpZW50UnVudGltZS5hdXRob3JpemF0aW9uLmJvb3RzdHJhcFJlbW90ZUJlYXJlclNlc3Npb25cIixcbikoZnVuY3Rpb24qIChpbnB1dDoge1xuICByZWFkb25seSBodHRwQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBjcmVkZW50aWFsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjb3Blcz86IFJlYWRvbmx5QXJyYXk8QXV0aEVudmlyb25tZW50U2NvcGU+O1xuICByZWFkb25seSBjbGllbnRNZXRhZGF0YT86IEF1dGhDbGllbnRQcmVzZW50YXRpb25NZXRhZGF0YTtcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xufSkge1xuICBjb25zdCBjbGllbnQgPSB5aWVsZCogbWFrZUVudmlyb25tZW50SHR0cEFwaUdyb3VwQ2xpZW50KGlucHV0Lmh0dHBCYXNlVXJsLCBcImF1dGhcIik7XG4gIHJldHVybiB5aWVsZCogZXhlY3V0ZUVudmlyb25tZW50SHR0cFJlcXVlc3QoXG4gICAgZW52aXJvbm1lbnRFbmRwb2ludFVybChpbnB1dC5odHRwQmFzZVVybCwgXCIvb2F1dGgvdG9rZW5cIiksXG4gICAgaW5wdXQudGltZW91dE1zID8/IERFRkFVTFRfUkVNT1RFX1JFUVVFU1RfVElNRU9VVF9NUyxcbiAgICBjbGllbnQudG9rZW4oe1xuICAgICAgaGVhZGVyczoge30sXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGdyYW50X3R5cGU6IEF1dGhUb2tlbkV4Y2hhbmdlR3JhbnRUeXBlLFxuICAgICAgICBzdWJqZWN0X3Rva2VuOiBpbnB1dC5jcmVkZW50aWFsLFxuICAgICAgICBzdWJqZWN0X3Rva2VuX3R5cGU6IEF1dGhFbnZpcm9ubWVudEJvb3RzdHJhcFRva2VuVHlwZSxcbiAgICAgICAgcmVxdWVzdGVkX3Rva2VuX3R5cGU6IEF1dGhBY2Nlc3NUb2tlblR5cGUsXG4gICAgICAgIC4uLihpbnB1dC5zY29wZXMgPyB7IHNjb3BlOiBlbmNvZGVPQXV0aFNjb3BlKGlucHV0LnNjb3BlcykgfSA6IHt9KSxcbiAgICAgICAgLi4uY2xpZW50TWV0YWRhdGFUb2tlbkV4Y2hhbmdlRmllbGRzKGlucHV0LmNsaWVudE1ldGFkYXRhKSxcbiAgICAgIH0sXG4gICAgfSksXG4gICk7XG59KTtcblxuZXhwb3J0IGNvbnN0IGZldGNoUmVtb3RlU2Vzc2lvblN0YXRlID0gRWZmZWN0LmZuKFxuICBcImNsaWVudFJ1bnRpbWUuYXV0aG9yaXphdGlvbi5mZXRjaFJlbW90ZVNlc3Npb25TdGF0ZVwiLFxuKShmdW5jdGlvbiogKGlucHV0OiB7XG4gIHJlYWRvbmx5IGh0dHBCYXNlVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJlYXJlclRva2VuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbn0pIHtcbiAgY29uc3QgY2xpZW50ID0geWllbGQqIG1ha2VFbnZpcm9ubWVudEh0dHBBcGlHcm91cENsaWVudChpbnB1dC5odHRwQmFzZVVybCwgXCJhdXRoXCIpO1xuICByZXR1cm4geWllbGQqIGV4ZWN1dGVFbnZpcm9ubWVudEh0dHBSZXF1ZXN0KFxuICAgIGVudmlyb25tZW50RW5kcG9pbnRVcmwoaW5wdXQuaHR0cEJhc2VVcmwsIFwiL2FwaS9hdXRoL3Nlc3Npb25cIiksXG4gICAgaW5wdXQudGltZW91dE1zID8/IERFRkFVTFRfUkVNT1RFX1JFUVVFU1RfVElNRU9VVF9NUyxcbiAgICBjbGllbnQuc2Vzc2lvbih7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtpbnB1dC5iZWFyZXJUb2tlbn1gLFxuICAgICAgfSxcbiAgICB9KSxcbiAgKTtcbn0pO1xuXG5jb25zdCB3ZWJTb2NrZXRUaWNrZXRQYXRoID0gKHVzZTogQXV0aFdlYlNvY2tldFRpY2tldFVzZSB8IHVuZGVmaW5lZCkgPT5cbiAgdXNlID09PSB1bmRlZmluZWQgPyBcIi9hcGkvYXV0aC93ZWJzb2NrZXQtdGlja2V0XCIgOiBgL2FwaS9hdXRoL3dlYnNvY2tldC10aWNrZXQvJHt1c2V9YDtcblxuLyoqXG4gKiBBIHNlcnZlciB0aGF0IHByZWRhdGVzIHRpY2tldCBhdWRpZW5jZXMgaGFzIG5vIGAvOnVzZWAgcm91dGUgYW5kIGFuc3dlcnMgNDA0LlxuICogSXRzIHRpY2tldHMgYXJlIHRoZSB1bmJvdW5kIGtpbmQgaXQgYWx3YXlzIGlzc3VlZCwgc28gdGhlIGJhcmUgcGF0aCBpcyB0aGVcbiAqIHJpZ2h0IHJlcXVlc3QgdGhlcmUsIG5vdCBhbiBlcnJvci5cbiAqL1xuY29uc3QgaXNzdWVXZWJTb2NrZXRUaWNrZXRXaXRoRmFsbGJhY2sgPSA8RSwgUj4oXG4gIHVzZTogQXV0aFdlYlNvY2tldFRpY2tldFVzZSB8IHVuZGVmaW5lZCxcbiAgaXNzdWU6IChcbiAgICB1c2U6IEF1dGhXZWJTb2NrZXRUaWNrZXRVc2UgfCB1bmRlZmluZWQsXG4gICkgPT4gRWZmZWN0LkVmZmVjdDxBdXRoV2ViU29ja2V0VGlja2V0UmVzdWx0LCBFLCBSPixcbiAgY2FuRmFsbEJhY2sgPSB0cnVlLFxuKSA9PlxuICB1c2UgPT09IHVuZGVmaW5lZCB8fCAhY2FuRmFsbEJhY2tcbiAgICA/IGlzc3VlKHVzZSlcbiAgICA6IGlzc3VlKHVzZSkucGlwZShcbiAgICAgICAgRWZmZWN0LmNhdGNoSWYoXG4gICAgICAgICAgKGVycm9yKSA9PlxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBSZW1vdGVFbnZpcm9ubWVudEF1dGhVbmRlY2xhcmVkU3RhdHVzRXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQsXG4gICAgICAgICAgKCkgPT4gaXNzdWUodW5kZWZpbmVkKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbmV4cG9ydCBjb25zdCBpc3N1ZVJlbW90ZVdlYlNvY2tldFRpY2tldCA9IEVmZmVjdC5mbihcbiAgXCJjbGllbnRSdW50aW1lLmF1dGhvcml6YXRpb24uaXNzdWVSZW1vdGVXZWJTb2NrZXRUaWNrZXRcIixcbikoZnVuY3Rpb24qIChpbnB1dDoge1xuICByZWFkb25seSBodHRwQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBiZWFyZXJUb2tlbjogc3RyaW5nO1xuICByZWFkb25seSB1c2U/OiBBdXRoV2ViU29ja2V0VGlja2V0VXNlO1xuICByZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG59KSB7XG4gIGNvbnN0IGNsaWVudCA9IHlpZWxkKiBtYWtlRW52aXJvbm1lbnRIdHRwQXBpR3JvdXBDbGllbnQoaW5wdXQuaHR0cEJhc2VVcmwsIFwiYXV0aFwiKTtcbiAgY29uc3QgaGVhZGVycyA9IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2lucHV0LmJlYXJlclRva2VufWAgfTtcbiAgcmV0dXJuIHlpZWxkKiBpc3N1ZVdlYlNvY2tldFRpY2tldFdpdGhGYWxsYmFjayhpbnB1dC51c2UsICh1c2UpID0+XG4gICAgZXhlY3V0ZUVudmlyb25tZW50SHR0cFJlcXVlc3QoXG4gICAgICBlbnZpcm9ubWVudEVuZHBvaW50VXJsKGlucHV0Lmh0dHBCYXNlVXJsLCB3ZWJTb2NrZXRUaWNrZXRQYXRoKHVzZSkpLFxuICAgICAgaW5wdXQudGltZW91dE1zID8/IERFRkFVTFRfUkVNT1RFX1JFUVVFU1RfVElNRU9VVF9NUyxcbiAgICAgIHVzZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gY2xpZW50LndlYlNvY2tldFRpY2tldCh7IGhlYWRlcnMgfSlcbiAgICAgICAgOiBjbGllbnQud2ViU29ja2V0VGlja2V0Rm9yKHsgaGVhZGVycywgcGFyYW1zOiB7IHVzZSB9IH0pLFxuICAgICksXG4gICk7XG59KTtcblxuZXhwb3J0IGNvbnN0IGlzc3VlUmVtb3RlRHBvcFdlYlNvY2tldFRpY2tldCA9IEVmZmVjdC5mbihcbiAgXCJjbGllbnRSdW50aW1lLmF1dGhvcml6YXRpb24uaXNzdWVSZW1vdGVEcG9wV2ViU29ja2V0VGlja2V0XCIsXG4pKGZ1bmN0aW9uKiA8RSA9IG5ldmVyPihpbnB1dDoge1xuICByZWFkb25seSBodHRwQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWFkb25seSBkcG9wUHJvb2Y6IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlPzogQXV0aFdlYlNvY2tldFRpY2tldFVzZTtcbiAgLyoqIFByb29mIGZvciB0aGUgYmFyZSBwYXRoLCB1c2VkIG9ubHkgd2hlbiB0aGUgc2VydmVyIGxhY2tzIHRoZSBgLzp1c2VgIHJvdXRlLiAqL1xuICByZWFkb25seSBmYWxsYmFja1Byb29mPzogRWZmZWN0LkVmZmVjdDxzdHJpbmcsIEU+O1xuICByZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG59KSB7XG4gIGNvbnN0IGNsaWVudCA9IHlpZWxkKiBtYWtlRW52aXJvbm1lbnRIdHRwQXBpR3JvdXBDbGllbnQoaW5wdXQuaHR0cEJhc2VVcmwsIFwiYXV0aFwiKTtcbiAgY29uc3QgZmFsbGJhY2tQcm9vZiA9IGlucHV0LmZhbGxiYWNrUHJvb2Y7XG4gIHJldHVybiB5aWVsZCogaXNzdWVXZWJTb2NrZXRUaWNrZXRXaXRoRmFsbGJhY2soXG4gICAgaW5wdXQudXNlLFxuICAgICh1c2UpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIFRoZSBwcm9vZiBuYW1lcyB0aGUgcGF0aCBpdCBzaWducywgc28gdGhlIGZhbGxiYWNrIHJlcXVlc3QgbmVlZHMgaXRzIG93bi5cbiAgICAgICAgY29uc3QgZHBvcFByb29mID1cbiAgICAgICAgICB1c2UgPT09IGlucHV0LnVzZSB8fCBmYWxsYmFja1Byb29mID09PSB1bmRlZmluZWQgPyBpbnB1dC5kcG9wUHJvb2YgOiB5aWVsZCogZmFsbGJhY2tQcm9vZjtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgYXV0aG9yaXphdGlvbjogYERQb1AgJHtpbnB1dC5hY2Nlc3NUb2tlbn1gLCBkcG9wOiBkcG9wUHJvb2YgfTtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBleGVjdXRlRW52aXJvbm1lbnRIdHRwUmVxdWVzdChcbiAgICAgICAgICBlbnZpcm9ubWVudEVuZHBvaW50VXJsKGlucHV0Lmh0dHBCYXNlVXJsLCB3ZWJTb2NrZXRUaWNrZXRQYXRoKHVzZSkpLFxuICAgICAgICAgIGlucHV0LnRpbWVvdXRNcyA/PyBERUZBVUxUX1JFTU9URV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgdXNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gY2xpZW50LndlYlNvY2tldFRpY2tldCh7IGhlYWRlcnMgfSlcbiAgICAgICAgICAgIDogY2xpZW50LndlYlNvY2tldFRpY2tldEZvcih7IGhlYWRlcnMsIHBhcmFtczogeyB1c2UgfSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgIGZhbGxiYWNrUHJvb2YgIT09IHVuZGVmaW5lZCxcbiAgKTtcbn0pO1xuXG5mdW5jdGlvbiBycGNTb2NrZXRVcmwod3NCYXNlVXJsOiBzdHJpbmcpOiBVUkwge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHdzQmFzZVVybCk7XG4gIGlmICh1cmwucGF0aG5hbWUgPT09IFwiXCIgfHwgdXJsLnBhdGhuYW1lID09PSBcIi9cIikge1xuICAgIHVybC5wYXRobmFtZSA9IFwiL3dzXCI7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZW1vdGVXZWJTb2NrZXRDb25uZWN0aW9uVXJsID0gRWZmZWN0LmZuKFxuICBcImNsaWVudFJ1bnRpbWUuYXV0aG9yaXphdGlvbi5yZXNvbHZlUmVtb3RlV2ViU29ja2V0Q29ubmVjdGlvblVybFwiLFxuKShmdW5jdGlvbiogKGlucHV0OiB7XG4gIHJlYWRvbmx5IHdzQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBodHRwQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBiZWFyZXJUb2tlbjogc3RyaW5nO1xuICByZWFkb25seSBjbGllbnRNZXRhZGF0YT86IEF1dGhDbGllbnRQcmVzZW50YXRpb25NZXRhZGF0YTtcbiAgcmVhZG9ubHkgY29ubmVjdGlvbk1ldGhvZD86IENsaWVudENvbm5lY3Rpb25NZXRob2Q7XG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbn0pIHtcbiAgY29uc3QgaXNzdWVkID0geWllbGQqIGlzc3VlUmVtb3RlV2ViU29ja2V0VGlja2V0KHtcbiAgICBodHRwQmFzZVVybDogaW5wdXQuaHR0cEJhc2VVcmwsXG4gICAgYmVhcmVyVG9rZW46IGlucHV0LmJlYXJlclRva2VuLFxuICAgIHVzZTogXCJycGNcIixcbiAgICAuLi4oaW5wdXQudGltZW91dE1zID8geyB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXRNcyB9IDoge30pLFxuICB9KTtcblxuICBjb25zdCB1cmwgPSBycGNTb2NrZXRVcmwoaW5wdXQud3NCYXNlVXJsKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJ3c1RpY2tldFwiLCBpc3N1ZWQudGlja2V0KTtcbiAgYXBwZW5kQ2xpZW50Q29ubmVjdGlvblBhcmFtcyhcbiAgICB1cmwsXG4gICAgaW5wdXQuY2xpZW50TWV0YWRhdGEsXG4gICAgaW5wdXQuY29ubmVjdGlvbk1ldGhvZCxcbiAgICB5aWVsZCogcmVhZENsaWVudE93bmVyUGFyYW1zLFxuICApO1xuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59KTtcblxuLyoqXG4gKiBBIERQb1AgY2xpZW50J3MgUlBDIHRpY2tldCBpcyBib3VuZCB0byBpdHMga2V5LCBzbyB0aGUgdXBncmFkZSBjYXJyaWVzIGFcbiAqIHByb29mIHRvby4gQSBXZWJTb2NrZXQgY2Fubm90IHNldCBoZWFkZXJzLCBzbyBpdCByaWRlcyBpbiB0aGUgYGRwb3BgIHF1ZXJ5XG4gKiBwYXJhbWV0ZXIgYW5kIG5hbWVzIHRoZSBzb2NrZXQgVVJMIGFzIHRoZSBIVFRQIHJlcXVlc3QgdGhlIHNlcnZlciBzZWVzLlxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJlbW90ZURwb3BXZWJTb2NrZXRDb25uZWN0aW9uVXJsID0gRWZmZWN0LmZuKFxuICBcImNsaWVudFJ1bnRpbWUuYXV0aG9yaXphdGlvbi5yZXNvbHZlUmVtb3RlRHBvcFdlYlNvY2tldENvbm5lY3Rpb25VcmxcIixcbikoZnVuY3Rpb24qIDxFPihpbnB1dDoge1xuICByZWFkb25seSB3c0Jhc2VVcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgaHR0cEJhc2VVcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVhZG9ubHkgY3JlYXRlUHJvb2Y6IChpbnB1dDoge1xuICAgIHJlYWRvbmx5IG1ldGhvZDogXCJHRVRcIiB8IFwiUE9TVFwiO1xuICAgIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIH0pID0+IEVmZmVjdC5FZmZlY3Q8c3RyaW5nLCBFPjtcbiAgcmVhZG9ubHkgY2xpZW50TWV0YWRhdGE/OiBBdXRoQ2xpZW50UHJlc2VudGF0aW9uTWV0YWRhdGE7XG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25NZXRob2Q/OiBDbGllbnRDb25uZWN0aW9uTWV0aG9kO1xuICByZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG59KSB7XG4gIGNvbnN0IHRpY2tldFByb29mID0geWllbGQqIGlucHV0LmNyZWF0ZVByb29mKHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIHVybDogZW52aXJvbm1lbnRFbmRwb2ludFVybChpbnB1dC5odHRwQmFzZVVybCwgd2ViU29ja2V0VGlja2V0UGF0aChcInJwY1wiKSksXG4gICAgYWNjZXNzVG9rZW46IGlucHV0LmFjY2Vzc1Rva2VuLFxuICB9KTtcbiAgY29uc3QgaXNzdWVkID0geWllbGQqIGlzc3VlUmVtb3RlRHBvcFdlYlNvY2tldFRpY2tldCh7XG4gICAgaHR0cEJhc2VVcmw6IGlucHV0Lmh0dHBCYXNlVXJsLFxuICAgIGFjY2Vzc1Rva2VuOiBpbnB1dC5hY2Nlc3NUb2tlbixcbiAgICBkcG9wUHJvb2Y6IHRpY2tldFByb29mLFxuICAgIHVzZTogXCJycGNcIixcbiAgICBmYWxsYmFja1Byb29mOiBFZmZlY3Quc3VzcGVuZCgoKSA9PlxuICAgICAgaW5wdXQuY3JlYXRlUHJvb2Yoe1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICB1cmw6IGVudmlyb25tZW50RW5kcG9pbnRVcmwoaW5wdXQuaHR0cEJhc2VVcmwsIHdlYlNvY2tldFRpY2tldFBhdGgodW5kZWZpbmVkKSksXG4gICAgICAgIGFjY2Vzc1Rva2VuOiBpbnB1dC5hY2Nlc3NUb2tlbixcbiAgICAgIH0pLFxuICAgICksXG4gICAgLi4uKGlucHV0LnRpbWVvdXRNcyA/IHsgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0TXMgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHVybCA9IHJwY1NvY2tldFVybChpbnB1dC53c0Jhc2VVcmwpO1xuICBjb25zdCB1cGdyYWRlUHJvb2YgPSB5aWVsZCogaW5wdXQuY3JlYXRlUHJvb2Yoe1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICB1cmw6IGAke3VybC5wcm90b2NvbCA9PT0gXCJ3c3M6XCIgPyBcImh0dHBzOlwiIDogXCJodHRwOlwifS8vJHt1cmwuaG9zdH0ke3VybC5wYXRobmFtZX1gLFxuICAgIGFjY2Vzc1Rva2VuOiBpc3N1ZWQudGlja2V0LFxuICB9KTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJ3c1RpY2tldFwiLCBpc3N1ZWQudGlja2V0KTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJkcG9wXCIsIHVwZ3JhZGVQcm9vZik7XG4gIGFwcGVuZENsaWVudENvbm5lY3Rpb25QYXJhbXMoXG4gICAgdXJsLFxuICAgIGlucHV0LmNsaWVudE1ldGFkYXRhLFxuICAgIGlucHV0LmNvbm5lY3Rpb25NZXRob2QsXG4gICAgeWllbGQqIHJlYWRDbGllbnRPd25lclBhcmFtcyxcbiAgKTtcbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufSk7XG4iXSwiZmlsZSI6Ii9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2F1dGhvcml6YXRpb24vcmVtb3RlLnRzIn0=

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2F1dGhvcml6YXRpb24vcmVtb3RlLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvYXV0aG9yaXphdGlvbi9yZW1vdGUudHMiLHsidXJscyI6IjYiLCJpZHMiOiI3In0sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSJdLFtdLFsiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiXSx7fSwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jb250cmFjdHMvc3JjL2luZGV4LnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9zaGFyZWQvc3JjL29hdXRoU2NvcGUudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL3NoYXJlZC9zcmMvdGVsZW1ldHJ5SWQudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0VmZmVjdC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvT3B0aW9uLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvZW52aXJvbm1lbnQvZW5kcG9pbnQudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9wbGF0Zm9ybS9jYXBhYmlsaXRpZXMudHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9ycGMvaHR0cC50cyJd